PDFMiner 未检测到所有页面

Posted

技术标签:

【中文标题】PDFMiner 未检测到所有页面【英文标题】:PDFMiner does not detect all pages 【发布时间】:2021-01-31 09:34:30 【问题描述】:

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

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())

【问题讨论】:

【参考方案1】:

这里有一个解决方案。在尝试了 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())

【讨论】:

以上是关于PDFMiner 未检测到所有页面的主要内容,如果未能解决你的问题,请参考以下文章

Flutter pwa app 未检测到服务人员

Django 迁移未检测到所有更改

BeautifulSoup 模块未检测到任何标签

Java UCanAccess 未检测到所有项目

当 unpivot 未检测到具有不同类型的字段时,雪花如何转换选择查询的所有字段?

如何检测到所有页面组件都已加载到 Oro 应用程序中?