如果我在这里使用答案中的代码:
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/

10-12 17:02