如果我在这里使用答案中的代码:
Extracting text from a PDF file using PDFMiner in python?
适用于该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())
最佳答案
您可以使用PDFMiner来完成这项工作,以我的经验,它比其他开源Python工具更有效。
关键是正确指定laparams
参数,而不是将其保留为默认值。此参数用于为PDFMiner提供有关页面的布局的更多信息。由于此处的文本对应于具有宽空格的表,因此我们需要指示PDFMiner使用较大的字符边距(char_margin
)。
布局的代码是here。尝试为该特定文档提供最佳结果的超参数。
这是有问题的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])
给定页面(与文档中的页面7对应的页面6)的输出看起来像下面的块。它不是完美的,但是表的所有数字部分都与文本在同一行中捕获。
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
关于Python PDF可以直接阅读PDF的外观,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51460372/