使用 pywin32 控制 Adob​​e Acrobat 时出现“未实现”异常

2023-11-21

我使用 pywin32 在 python 中编写了一个脚本,将 pdf 文件保存为文本,直到最近都工作正常。我在 Excel 中使用类似的方法。代码如下:

def __pdf2Txt(self, pdf, fileformat="com.adobe.acrobat.accesstext"):
    outputLoc = os.path.dirname(pdf)
    outputLoc = os.path.join(outputLoc, os.path.splitext(os.path.basename(pdf))[0] + '.txt')

    try:
        win32com.client.gencache.EnsureModule('{E64169B3-3592-47d2-816E-602C5C13F328}', 0, 1, 1)
        adobe = win32com.client.DispatchEx('AcroExch.App')
        pdDoc = win32com.client.DispatchEx('AcroExch.PDDoc')
        pdDoc.Open(pdf)
        jObject = pdDoc.GetJSObject()
        jObject.SaveAs(outputLoc, "com.adobe.acrobat.accesstext")
    except:
        traceback.print_exc()
        return False
    finally:
        del jObject
        pdDoc.Close()
        del pdDoc
        adobe.Exit()
        del adobe

然而,这段代码突然停止工作,我得到以下输出:

Traceback (most recent call last):
  File "C:\Documents and Settings\ablishen\workspace\HooverKeyCreator\src\HooverKeyCreator.py", line 38, in __pdf2Txt
    jObject.SaveAs(outputLoc, "com.adobe.acrobat.accesstext")
  File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 505, in __getattr__
    ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
com_error: (-2147467263, 'Not implemented', None, None)
False

我用 VB 编写了类似的代码,可以正常工作,所以我猜测它与 COM 接口未正确绑定到适当的函数有关? (我的 COM 知识并不完整)。


Blish, 这个线程掌握您正在寻找的解决方案的关键:https://mail.python.org/pipermail/python-win32/2002-March/000260.html

我承认上面的帖子不是最容易找到的(可能是因为谷歌根据内容的年龄给它评分很低?)。

具体来说,申请这件作品的建议将为您提供帮助:https://mail.python.org/pipermail/python-win32/2002-March/000265.html

作为参考,完整的代码不需要您手动修补dynamic.py(代码片段应该几乎可以开箱即用):

# gets all files under ROOT_INPUT_PATH with FILE_EXTENSION and tries to extract text from them into ROOT_OUTPUT_PATH with same filename as the input file but with INPUT_FILE_EXTENSION replaced by OUTPUT_FILE_EXTENSION
from win32com.client import Dispatch
from win32com.client.dynamic import ERRORS_BAD_CONTEXT

import winerror

# try importing scandir and if found, use it as it's a few magnitudes of an order faster than stock os.walk
try:
    from scandir import walk
except ImportError:
    from os import walk

import fnmatch

import sys
import os

ROOT_INPUT_PATH = None
ROOT_OUTPUT_PATH = None
INPUT_FILE_EXTENSION = "*.pdf"
OUTPUT_FILE_EXTENSION = ".txt"

def acrobat_extract_text(f_path, f_path_out, f_basename, f_ext):
    avDoc = Dispatch("AcroExch.AVDoc") # Connect to Adobe Acrobat

    # Open the input file (as a pdf)
    ret = avDoc.Open(f_path, f_path)
    assert(ret) # FIXME: Documentation says "-1 if the file was opened successfully, 0 otherwise", but this is a bool in practise?

    pdDoc = avDoc.GetPDDoc()

    dst = os.path.join(f_path_out, ''.join((f_basename, f_ext)))

    # Adobe documentation says "For that reason, you must rely on the documentation to know what functionality is available through the JSObject interface. For details, see the JavaScript for Acrobat API Reference"
    jsObject = pdDoc.GetJSObject()

    # Here you can save as many other types by using, for instance: "com.adobe.acrobat.xml"
    jsObject.SaveAs(dst, "com.adobe.acrobat.accesstext")

    pdDoc.Close()
    avDoc.Close(True) # We want this to close Acrobat, as otherwise Acrobat is going to refuse processing any further files after a certain threshold of open files are reached (for example 50 PDFs)
    del pdDoc

if __name__ == "__main__":
    assert(5 == len(sys.argv)), sys.argv # <script name>, <script_file_input_path>, <script_file_input_extension>, <script_file_output_path>, <script_file_output_extension>

    #$ python get.txt.from.multiple.pdf.py 'C:\input' '*.pdf' 'C:\output' '.txt'

    ROOT_INPUT_PATH = sys.argv[1]
    INPUT_FILE_EXTENSION = sys.argv[2]
    ROOT_OUTPUT_PATH = sys.argv[3]
    OUTPUT_FILE_EXTENSION = sys.argv[4]

    # tuples are of schema (path_to_file, filename)
    matching_files = ((os.path.join(_root, filename), os.path.splitext(filename)[0]) for _root, _dirs, _files in walk(ROOT_INPUT_PATH) for filename in fnmatch.filter(_files, INPUT_FILE_EXTENSION))

    # patch ERRORS_BAD_CONTEXT as per https://mail.python.org/pipermail/python-win32/2002-March/000265.html
    global ERRORS_BAD_CONTEXT
    ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL)

    for filename_with_path, filename_without_extension in matching_files:
        print "Processing '{}'".format(filename_without_extension)
        acrobat_extract_text(filename_with_path, ROOT_OUTPUT_PATH, filename_without_extension, OUTPUT_FILE_EXTENSION)

我已经在 WinPython x64 2.7.6.3、Acrobat X Pro 上对此进行了测试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 pywin32 控制 Adob​​e Acrobat 时出现“未实现”异常 的相关文章

随机推荐

  • #define 指令中的 Inno Setup 字符串连接

    Inno Setup 网站是否未能记录 define指令还是我在某个地方错过了 是否允许使用已定义的字符串进行定义并将它们连接起来 define MyApp ABC define MyAppVersion 1 2 1 define MyFo
  • PHP / SQLite - 将表从磁盘复制到内存

    我的硬盘上有一个 sqlite3 数据库 file db 有 5 个表 我想将其中 3 个表复制到内存数据库 memory 有没有一种简单的方法可以使用 PHP5 的 PDO 格式来做到这一点 不是特定于 pdo 的解决方案 对于您的情况可
  • Windows 是否有集成的内置 C/C++ 编译器包?

    我希望能够在 Windows 环境下编译 C 和 C 代码 而无需使用 IDE 只需使用 Windows 命令提示符 cmd exe 即可 我来自 Linux 您可以在其中安装gcc只需在终端中使用命令即可打包 sudo apt insta
  • 如何禁用动态频率缩放?

    我想做一些微基准测试 并尝试做正确的事情 不幸的是 动态频率缩放使得基准测试非常不可靠 有没有办法以编程方式 C Windows 查明是否启用了动态频率缩放 如果 可以在程序中禁用它吗 我尝试在实际基准测试发生之前使用 100 CPU 的预
  • 无论线条大小如何保持线型间距恒定

    当尺寸不同时 我一直尝试在 ggplot2 或网格中绘制线段之间具有相等间距的线 但是我没有成功 所以我请求你的帮助 在下面的示例中 如何在线条尺寸不同的情况下保持线段之间的绝对间距相等 我想避免定制makeContent myclass我
  • 如何在smarty模板中解析/解码JSON对象?

    我的模板文件中有以下代码 foreach from items item entry pre entry gt nb persons print r pre foreach 输出是 json 字符串 ip 12 12 12 12 date
  • Laravel 喜欢 Eloquent 的数组值吗?

    如何进行 Like 查询并搜索多个值 searchWords explode Input get search 然后我得到了用于搜索的一组单词 我怎样才能通过它 pages Page where content LIKE singleWor
  • 自动批准评论插件中的所有评论

    有没有办法自动批准并默认公开所有评论插件的评论 另外 我真的需要知道这些评论是在什么基础上进行审核的 在某些页面上 它们默认是公开的 而在其他页面上 它们最终会进入审核队列 更新 0 我删除了脸书 管理员 审核 UI 消失 但审核仍然有效
  • 使用 Zend Framework 安全地运行 Cron 作业

    我看过很多关于 cron 和 ZF 的帖子 但大多数解决方案都让工作可以由公众触发运行 如果你想设置一个只能由 cron 运行的操作怎么办 不是由某个匿名用户也不是由必须登录的人 我使用的解决方案涉及将一个文件放在我的 Web 根目录之外
  • 在 Javascript 中播种随机数生成器

    是否可以为随机数生成器提供种子 Math random 在 JavaScript 中 不 不可能播种Math random The ECMAScript 规范故意在这个主题上含糊其辞 不提供播种方式 也不要求浏览器使用相同的算法 所以这样的
  • 提交前获取应用程序的 iTunes 链接

    我在另一篇文章中读到 您可以在没有二进制文件的情况下提交应用程序 但根据我所看到的 这不再可能 看来没有二进制文件就无法提交 并且二进制文件是通过应用程序加载器提交的 在提交二进制文件之前 还有其他已知的方法可以获取指向我的应用程序的 it
  • 我不明白 sigma 表示法和 for 循环

    我有一本书说 并说这相当于说 for i 1 i lt N i Sum i 它进一步说利用这个简单的公式 因为 最大值 最小值 1 它说将其更改为 C 代码将是 for k j k lt 1 k Sum k 但是 我真的无法理解这一点 谁能
  • 为什么浏览器无法发送gzip请求?

    如果网络服务器可以发送 gzip 响应 为什么浏览器不能发送 gzip 请求 客户端和服务器必须就如何通信达成一致 其中一部分是通信是否可以被压缩 HTTP 被设计为请求 响应模型 最初的创建几乎可以肯定地设想总是有小请求和潜在的大响应 压
  • 如何在一个屏幕而不是整个应用程序中处理退出应用程序 - React Native?

    我有一些问题返回处理程序 问题是 运行应用程序并转到 注册 屏幕并触摸手机背面时 他们将运行该功能并显示警报进行确认 但现在当我转到任何其他屏幕并触摸背面时 他们将需要每次返回时就返回上一个屏幕 BackHandler exitApp 运行
  • 将断点保存到文件

    调试 Python 代码时 我从命令行通过 ipdb 运行脚本 并设置了多个断点 然后我对一个或多个模块进行一些更改 然后重新运行 但是 如果我只是使用运行模块不要重新加载 为了确保它们确实如此 我可以完全存在并重新启动Python 但随后
  • 如何获得英文的 boost::system::error_code::message ?

    在具有本地化 UI 的 Win7 上 error code message 返回非英语消息 据我所知 在 Boost 1 54 中 对于system error category 上面的函数归结为以下 WinAPI 调用 DWORD ret
  • 如何使用 ExecutorService 等待所有线程完成?

    我需要一次执行 4 个任务 如下所示 ExecutorService taskExecutor Executors newFixedThreadPool 4 while taskExecutor execute new MyTask wai
  • 如何在 macOS 或 OS X 上安装 pip?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 昨天我花了一整天的时间寻找安装的明确答案pip Python 的包管理器 我找不到好的解决办法 我该如何安装它 在 Linux 或 MacOS 上 python
  • 在 Laravel Homestead 上使用 SSL

    我正在使用 Laravel Homestead 它运行良好 现在我想在我的一个网站上实施 HTTPS 我发现要实现这一点 你只需要添加ssl true进入 Homestead yaml 然后运行 vagrant reload provisi
  • 使用 pywin32 控制 Adob​​e Acrobat 时出现“未实现”异常

    我使用 pywin32 在 python 中编写了一个脚本 将 pdf 文件保存为文本 直到最近都工作正常 我在 Excel 中使用类似的方法 代码如下 def pdf2Txt self pdf fileformat com adobe a