pdf2image如何使用“启用所有功能”阅读pdf-Windows

时间:2019-04-18 22:16:33

标签: python pdf

我有一个pdf文件,我想用Python阅读。当我使用acrobat在计算机上打开它时,出现以下消息,当我单击“启用所有功能”时,该文件将显示其实际内容。 enter image description here enter image description here

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

“请稍候...如果此消息最终没有被文档的正确内容替代,则您的PDF查看器可能无法显示此类型的文档。您可以升级到Windows的最新版本的Adobe Reader ®,Mac或Linux®,请访问http://www.adobe.com/go/reader_download。有关Adobe 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

3 个答案:

答案 0 :(得分:5)

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

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

  

XFA (也称为 XFA表单)代表 XML Forms Architecture (XML表单体系结构),这是由XML建议和开发的一系列专有XML规范。 JetForm增强了对Web表单的处理。从PDF 1.5规范开始,它也可以用在PDF文件中。 XFA规范是完整应用ISO 32000-1规范(PDF 1.7)所必需的外部规范。 XML表单体系结构尚未标准化为ISO标准,并且已在PDF 2.0中弃用。

Wikipedia on XFA

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

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

它位于目录-> AcroForm -> XFA 对象中

  

XFA 条目要么是包含整个XFA资源的流,要么是指定组成整个XFA资源的各个 packets 的数组。 [...]

     

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

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

答案 1 :(得分:2)

我对pdf2image不太熟悉,但是相对论却对pikepdf很熟悉。您要做的就是将文件另存为另一个文件。这是一个片段:

import pikepdf

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

那应该解决它;当您打开my_good_pdf.pdf时,就可以了。

答案 2 :(得分: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