我有一个pdf文件,我想用Python阅读。当我使用acrobat在计算机上打开它时,出现以下消息,当我单击“启用所有功能”时,该文件将显示其实际内容。
当我尝试在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
答案 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中弃用。
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