如何从特定的pdf页面而不是整个文档访问文本

时间:2019-06-19 22:43:28

标签: python pdf pymupdf

我正在尝试从一些pdf文档中提取一些内容。尽管我在pdfminer和pymupdf上投入了最多的钱,但我一直在使用各种工具。我从pdfminer开始,但是在无法解决一个特定问题后即开始测试pymupdf -也就是说,当我的pdf文档有多个页面时,我想选择是否处理每个特定页面。但是,我在这两个库中遇到的问题是,当我尝试从一个(或另一个)特定页面检索文本时,返回的文本是文档中的所有文本。

这里是指向document的链接,该页面有57页。

在这里我将重点介绍使用pymupdf的情况

这是一些代码

import fitz
doc = fitz.open('local_path_to_file_from_link_above')
for page in doc:
    text = page.getText().encode("utf8")
    break

我在这里是为了确认我仅从一页提取了文本-但是当我检查文本时,我发现它几乎包含了整个文档中的所有文本(共57页)

所以我很好奇,尽管pdf文件中出现了页面边界-也许它们不存在,所以我使用pageCount属性/属性/方法来确定页面是否存在-它们似乎是

>>> doc.pageCount
57

当我循环浏览所有页面时,要描述输出有些困难,每个页面不具有所有页面的全部内容,但是几乎具有所有内容。我通过使用以下代码确定了这一点

mydict = dict()
for n, page in doc:
    print n, len(p.getText())
    mydict[n] = p.getText()

这里是输出-为了完整性

0 45491
1 45491
2 45491
3 45491
4 45491
5 45491
6 45491
7 45491
8 45491
9 45492
10 45492
11 45492
12 45492
13 45492
14 45492
15 45492
16 45492
17 45492
18 45492
19 45492
20 45492
21 45492
22 45492
23 45492
24 45492
25 45492
26 45492
27 45492
28 45492
29 88408
30 42990
31 42990
32 42990
33 42990
34 42990
35 42990
36 42990
37 42990
38 42990
39 42990
40 42990
41 42990
42 42990
43 42990
44 42990
45 42990
46 42990
47 42990
48 42990
49 42990
50 42990
51 42990
52 42990
53 42990
54 42990
55 42990
56 42990

因此,第29页的内容存在异常,并且从这些页面检索到的文本的长度存在差异,但是例如在其中查找似乎有很大的重叠

>>> mydict[0][0:5000] == mydict[1][0:5000]
True

但是

>>> mydict[0][-5000:] == mydict[1][-5000:]
False

总而言之-库似乎了解现有的页面边界,但是为单个页面检索的文本几乎是文档中的所有文本。由于生成了一个很好的ToC-我想使用该ToC和该ToC提供的页码来标识要进一步解析和提取数据的特定页面。

我会发现我在尝试使用pdfminer时遇到了类似的问题。我可以检索所有文本,而不仅仅是特定特定页面中的文本。

2 个答案:

答案 0 :(得分:0)

您可能要考虑PyPDF2,它的function so5665682501() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetname = "DataOutputTest"; var sheet = ss.getSheetByName(sheetname); var LR = sheet.getLastRow(); var range = sheet.getRange(1, 1, LR); //Logger.log("DEBUG: range: "+range.getA1Notation()); var values = range.getValues(); var startrow = 4; var outputrange = sheet.getRange(startrow,9, LR-startrow,9); var output = [] for (var i=startrow-1;i<LR;i++){ var outputrow=[]; var acctname = values[i][0].substring(0,23); var acctcode = values[i][0].substring(24,34); var acctline = values[i][0].substring(35,59); var acctdate = values[i][0].substring(60,70); var acctordered = values[i][0].substring(71,79); var acctshipped = values[i][0].substring(80,87); var acctcarrier= values[i][0].substring(88,98); var acctnumber1= values[i][0].substring(99,114); var acctnumber2= values[i][0].substring(115,123); var acctdate2= values[i][0].substring(124,133); // Logger.log("DEBUG: acctname:"+acctname+",acctcode:"+acctcode+",acctline:"+acctline+",acctdate:"+acctdate+"\n, acctordered:"+acctordered+",acctshipped:"+acctshipped+",acctcarrier:"+acctcarrier+",acctnumber1:"+acctnumber1+",acctnumber2:"+acctnumber2+",acctdate2:"+acctdate2); outputrow.push(acctname); outputrow.push(acctcode); outputrow.push(acctline); outputrow.push(acctdate); outputrow.push(acctordered); outputrow.push(acctdate); outputrow.push(acctcarrier); outputrow.push(acctnumber1); outputrow.push(acctnumber2); outputrow.push(acctdate2); output.push(outputrow); } var outputrange = sheet.getRange(startrow,9, LR-startrow+1,10); outputrange.setValues(output); } 类具有PdfFileReader方法

文档:PyPDF2 docs

答案 1 :(得分:0)

请尝试以下操作以从该pdf的任何特定页面获取文本。

import fitz

path = r''

doc = fitz.open(path)
page = doc.loadPage(1) #put here the page number
page_to_text = page.getText("text")
print(page_to_text)