0

我正在尝试从 pdf 中提取文本,但我遇到了错误,因为我的脚本有时会检测到 pdf 的每一页,有时只检测到 pdf 的第一页。我什至在 stackoverflow 上的一篇文章中包含了这一行。

print(len(list(extract_pages(pdf_file))))

每当我的脚本只提取第一页时,该脚本只检测到一页。

我什至尝试过另一个库(PyPDF2)来提取文本,但结果更糟。

如果我查找我的脚本处理不当的 pdf 的属性,Adobe 会在 pdf 的属性中清楚地显示正确的页数。

下面是我正在使用的代码。任何有关如何更改脚本以检测 pdf 的所有页面的建议将不胜感激。

import os
from os.path import isfile, join
from io import StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer

pdf_dir = "/dir/pdfs/"
txt_dir = "/dir/txt/"

corpus = (f for f in os.listdir(pdf_dir) if not f.startswith('.') and isfile(join(pdf_dir, f)))
for filename in corpus:
    print(filename)
    output_string = StringIO()
    with open(join(pdf_dir, filename), 'rb') as in_file:
        parser = PDFParser(in_file)
        doc = PDFDocument(parser)
        rsrcmgr = PDFResourceManager()
        device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        for page in PDFPage.create_pages(doc):
            interpreter.process_page(page)
        txt_name = "{}.txt".format(filename[:-4])
        with open(join(txt_dir, txt_name), mode="w", encoding='utf-8') as o:
            o.write(output_string.getvalue())
4

1 回答 1

0

这是一个解决方案。在尝试了 R (pdftools) 和 Python (pdfplumber) 中的不同库之后,PyMuPDF效果最好。

from io import StringIO
import os
from os.path import isfile, join
import fitz

pdf_dir = "pdf path"
txt_dir = "txt path"

output_string = StringIO()

corpus = (f for f in os.listdir(pdf_dir) if not f.startswith('.') and isfile(join(pdf_dir, f)))
for filename in corpus:
    print(filename)
    output_string = StringIO()
    doc = fitz.open(join(pdf_dir,filename))
    for page in doc:
        output_string.write(page.getText("rawdict"))
    txt_name = "{}.txt".format(filename[:-4])
    with open(join(txt_dir, txt_name), mode="w", encoding='utf-8') as o:
        o.write(output_string.getvalue())
于 2020-10-17T04:42:55.940 回答