jas*_*son 6 python pdf pdfminer pypdf2
如果我在答案中使用代码: 在Python中使用PDFMiner从PDF文件中提取文本?
我可以在申请PDF格式时提取文本:https://www.tencent.com/en-us/articles/15000691526464720.pdf
但是,您在"合并收入报表"下看到,它会读取...即... Revenues VAS Online advertising然后它会读取数字...我希望它能够读取,即:
Revenues 73,528 49,552 73,528 66,392 VAS 46,877 35,108 等等......有没有办法做到这一点?
寻找其他可能的解决方案pdfminer.
如果我尝试使用此代码,PyPDF2并非所有文本都出现:
# importing required modules
import PyPDF2
# creating a pdf file object
pdfFileObj = open(file, 'rb')
# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
# printing number of pages in pdf file
a=(pdfReader.numPages)
# creating a page object
for i in range(0,a):
pageObj = pdfReader.getPage(i)
print(pageObj.extractText())
Run Code Online (Sandbox Code Playgroud)
您可以使用 PDFMiner 来完成这项工作,根据我的经验,它比其他开源 Python 工具效果更好。
关键是正确laparams指定参数,而不是保留默认值。该参数用于向 PDFMiner 提供有关页面布局的更多信息。由于此处的文本对应于具有较宽空格的表格,因此我们需要指示 PDFMiner 使用较大的字符边距 ( )。char_margin
布局的代码在这里。尝试使用可为该特定文档提供最佳结果的超参数。
这是相关 pdf 的示例代码。我在这里仅使用单个页面进行演示:
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
def convert_pdf_to_txt(path, pages):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams=LAParams(all_texts=True, detect_vertical=True,
line_overlap=0.5, char_margin=1000.0, #set char_margin to a large number
line_margin=0.5, word_margin=2,
boxes_flow=1)
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = open(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set(pages)
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
pdf_text_page6 = convert_pdf_to_txt("15000691526464720.pdf", pages=[6])
Run Code Online (Sandbox Code Playgroud)
给定页面(第 6 页对应于文档中的第 7 页)的输出如下所示。它并不完美,但表格的所有数字部分都与文本在同一行中捕获。
Page 7 of 11
Unaudited Unaudited
1Q2018 1Q2017 1Q2018 4Q2017
Revenues 73,528 49,552 73,528 66,392
VAS 46,877 35,108 46,877 39,947
Online advertising 10,689 6,888 10,689 12,361
Others 15,962 7,556 15,962 14,084
Cost of revenues (36,486) (24,109) (36,486) (34,897)
Gross profit 37,042 25,443 37,042 31,495
Run Code Online (Sandbox Code Playgroud)