【问题标题】:pdf2image how to read pdfs with "enable all features" - windowspdf2image 如何使用“启用所有功能”阅读 pdf - Windows
【发布时间】:2019-04-18 22:16:32
【问题描述】:

我有一个 pdf,我想用 Python 阅读它。当我使用 acrobat 在我的机器上打开它时,我收到以下消息,当我单击“启用所有功能”时,该文件显示它的实际内容。

当我尝试在 python 中读取它时,如何实现相同的操作,以便 python 读取实际文本而不读取下面的文本

“请稍候...如果此消息最终没有被文档的正确内容替换,您的 PDF 查看器可能无法显示此类文档。您可以升级到最新版本的 Adob​​e Reader for Windows ®、Mac 或 Linux®,请访问 http://www.adobe.com/go/reader_download。有关 Adob​​e Reader 的更多帮助,请访问 http://www.adobe.com/go/acrreader。Windows 是 Microsoft Corporation 在美国和/或其他国家/地区的注册商标或商标。Mac 是商标Apple Inc. 的注册商标,在美国和其他国家/地区注册。Linux 是 Linus Torvalds 在美国和其他国家/地区的注册商标。”

我的代码如下

from PIL import Image
import pytesseract

homepath = r'C:\Users\xxxx\\'


files = "bbbb.pdf"
PDFfilename = homepath  + files

from pdf2image import convert_from_path
pages = convert_from_path(PDFfilename, 500)

i=1
for page in pages:
    page.save(homepath +'out'+str(i)+'.jpg', 'JPEG')
    text = pytesseract.image_to_string(Image.open(homepath +'out'+str(i)+'.jpg'))
    print(text)
    i=i+1

【问题讨论】:

    标签: python pdf


    【解决方案1】:

    您看到的“请稍候...”页面是您的 pdf 的唯一实际 pdf 样式内容(即具有内容流和资源等的 pdf 页面对象)。

    启用所有功能后,您会看到 pdf 中包含的 XFA 表单的内容。

    XFA(也称为 XFA 表单)代表 XML Forms Architecture,这是由JetForm 用于增强 Web 表单的处理。它也可以用于从 PDF 1.5 规范开始的 PDF 文件。 XFA 规范被称为完全应用 ISO 32000-1 规范 (PDF 1.7) 所必需的外部规范。 XML Forms Architecture 没有被标准化为 ISO 标准,并且在 PDF 2.0 中已被弃用。

    (Wikipedia on XFA)

    Most PDF processors do not handle XFA content. 特别是大多数免费或开放的 pdf 库都没有。

    不过,只要您的 pdf 库允许直接访问低级 pdf 对象,您可以做的是检索 XFA XML 并将其作为 XML 流进行分析。

    它位于 Catalog -> AcroForm -> XFA 对象中:

    XFA 条目应该是一个包含整个 XFA 资源的流,或者是一个指定单独的数据包的数组,它们共同构成整个 XFA 资源。 [...]

    packet 是一对字符串和流。字符串包含 XML 元素的名称,流包含 XML 元素的完整文本。

    (ISO 32000-1 第 12.7.8 节 XFA 表格)

    【讨论】:

    【解决方案2】:

    尝试使用 pdfminer (https://github.com/pdfminer/pdfminer.six)

    使用 Python 3,安装如下:

    pip install pdfminer-six
    pip install chardet
    
    

    然后:

    import io
    from pdfminer.converter import TextConverter
    from pdfminer.pdfinterp import PDFPageInterpreter
    from pdfminer.pdfinterp import PDFResourceManager
    from pdfminer.pdfpage import PDFPage
    
    
    def process_file(pdf_path):
        resource_manager = PDFResourceManager()
        fake_file_handle = io.StringIO()
        converter = TextConverter(resource_manager, fake_file_handle)
        page_interpreter = PDFPageInterpreter(resource_manager, converter)
        with open(pdf_path, 'rb') as fh:
            for page in PDFPage.get_pages(fh, caching=True, check_extractable=True):
                page_interpreter.process_page(page)
            text = fake_file_handle.getvalue()
        # close open handles
        converter.close()
        fake_file_handle.close()
        if text:
            return text
    
    
    

    【讨论】:

    • 同样的问题 :( 它显示““请稍候...如果此消息最终不是....”。
    • PDF Miner 不支持 xfa 表单,这似乎是手头问题所必需的。
    【解决方案3】:

    我对@9​​87654321@不是很熟悉,但我对pikepdf比较熟悉。您所要做的就是将文件保存为另一个文件。这是一个sn-p:

    import pikepdf
    
    pdf = pikepdf.open('mypdf.pdf')
    pdf.save('my_good_pdf.pdf')
    

    这应该可以解决它;打开my_good_pdf.pdf就完全没问题了。

    【讨论】:

    • 同样的问题 :(
    • Pikepdf 不会展平 xfa 表格,这似乎是解决手头问题所必需的。
    猜你喜欢
    • 2020-08-17
    • 2016-06-19
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多