Python PDF直接阅读它在PDF中的外观

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)

Ada*_*ula 4

您可以使用 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)