【问题标题】:Why is python pulling in symbols instead of text from a pdf为什么python从pdf中提取符号而不是文本
【发布时间】:2018-05-15 20:43:40
【问题描述】:

我正在尝试遍历一组文件夹中的一组 pdf(全部为 OCR)并在 pdf 中搜索关键术语,如果 pdf 包含某个术语,则保存文件夹名称、文件名、等等。这段代码在一定程度上是有效的。除了,它在搜索词中缺少一些 pdf。原因是当我阅读几个 pdf 时,它会在几页上显示一些乱码(至少对我而言)。例如,假设我读过一个名为“the_one.pdf”的 pdf。它有 278 页。当我进入 adobe acrobat 搜索此文档时,我可以在第 171 页找到“搜索词 1”,但是当使用 python 读取时,python 会输出如下内容:

 -ˆ˜
 %
 ˜%˝ˆ
 ,˙
 ˚
 %.
 %,˛#
 %˜˚
 0"
 ˚˝
 %
 ˚˝ˆ˙)˛˚˜
 ˚0˛˚
 :&;
 #˛˘˘˙
 ˚%˚
 "
 %˚˛˘
 ˆ
 ˛˚,˚
 "
 $%˚˚%
 %
 ˝%.
 "˛
 "
 %˜
 ˝,
 -ˆ
 %˘˙
 ˛˘˚
 0"
 "
 ˛

 .˛˝
 %˜˚
 ˝˜
 .%
 !˝ˆ%
 4
 0"
 "
 %˜˚
 ˛
 %˛˘˘˙
 !˝ˆ˜
 %
 ˛ ˚˝ˆ˙)˛˚˜
 ˚0˛
 !˝ˆ%
 .˛˝˘˙8
 ˛˜
 %
 0"
 "
 ˚
 ˛ #%˛%
 "˛
 ˚ˆ˘˚

 ˛ ˛˚˛˝%
 0"%ˆ
 ˛˙
 !˝ˆ˛˘
 %˜
 %
 %"
 ˚ˆ˝%
 #
7
 ˘˛˘˙
 :&;
 ˛˘˚%
 ˛˚,˚
 "
 $%˚˚%
 %
 ˝%.
 %
 %˜
 ˝,
 6
 ;˚
 %˜
 ˛%
 "
 $%˚˚%
 ˚"%ˆ˘˜
 ˘˝˘˙
 %
 "˛
 .˝˚
 %
 ˚˛˜)˛˘%
 /ˇ˚
 ˘˝˘˙
 ˝˘ˆ˜
 ˚˛˜)˛˘%
 /ˇ˚
 "˛
 ˛
 #˚˜
 ˛˚
 9$
 ˜˛˚
 ˜˛˘˚
 :
 "˚
 ˘
 .˝˚
 %
 ˚˛˜)˛˘%
 /ˇ˚
 ˛
 ˜˜
 %
 ˛˘˙
 %
 9$
 ˜˛˚
 ˜˛˘˚
 "˛
 ˛
 ˜ˆ˛˘˘˙
 #˚˜
 ˛˚
 /ˇ˚
 4˛˜
 ˚ˆ˝"
 ˚
 ˛
 ˛˘˚%
 ˛%˜
 %
 ˆ˚
 ˛˘
 %˜˘˚8
 7
 9"˚
 #%˛%˚
 %.
 ˛,
 ˘˛˝
 %
 "
 ˘"%
 ˆ
 ˝˛
 ˛˘˚%
 ˛,
 ˆ˚
 %.
 ˘˝%˝
 ˚˙˚˚
 %

 ˚˝ˆ˙)˛˚˜
 ˚0˛
 !˝ˆ%
 .˛˝˘˚
 &%
 !˛˘
 ˛ ˛,
 ˛˝˛
 ˛˙
 ˚
 %
 %
 %
 %
 /ˇ˚
 ˛ -ˆ˚
 .%
 -ˆ%˛%
 4<
˝6
=8
 .%
 ˛ ˚˝.˝
 ˚˝ˆ˙)˛˚˜
 ˚0˛
 ˛˜
 ˝
 ˛˝,  

当然,它可以正确显示大多数页面,但由于某些原因,它不会显示其中的几个。出于保密原因,我无法发布 pdf。有谁知道为什么会这样?

此外,您可以指出任何可以加快我的代码速度或使其更具动态性的内容也很有帮助。一直在寻找学习。

最好, J.Dykstra

import PyPDF2 
from os import walk
import os
import re
import csv

pdf_location = r'PDF Directory' 
x = ['Search term 1', 'Search term 2', 'Search term 3', 'etc..']

key_terms = []
rule = []
filenamey = []

for dirpath, dirnames, filenames in walk(pdf_location):
    for filename in filenames:
        if filename.endswith('.pdf'):
            pdfFileObj = open(os.path.join(dirpath,filename), 'rb')
            pdfReader = PyPDF2.PdfFileReader(pdfFileObj, strict = False)
            num_pages = pdfReader.numPages
            count = 0
            text = ""

            while count < num_pages:
                pageObj = pdfReader.getPage(count)
                count +=1
                text += pageObj.extractText()


            for i in x:
                if re.search(i,text, re.IGNORECASE):
                    rulex = dirpath.split("Rule")[1]
                    filenamex = filename
                    key_termx = x[0]

                    key_terms.append(key_termx)
                    rule.append(rulex)

【问题讨论】:

    标签: python-3.x pdf


    【解决方案1】:

    解析 PDF 是一项复杂的任务,1.7 spec 有大约 750 页,Adobe 用它赚钱 - 这就是它适合他们的原因。

    PDF 内部有包含表格的表格

    • “字母的外观”(字形)
    • “这些字形映射到哪些 unicode 字母”(您需要从 pdf 中正确复制和粘贴某些内容)

    和一个交叉引用,它的字形映射到什么 unicode。字体也可能(部分)嵌入到 pdf 中。

    这(一个原因)为什么 pdf 看起来 100% 没问题,可能是“OCR”ed 没问题 - 但如果你只是从一个在字形和 unicode 点之间具有损坏映射的文档中复制和粘贴,你只会得到乱码。

    我听说有些程序甚至为所有字形提供 unicode 映射,但它们根本不匹配......故意(或质量差) - 以防止复制和粘贴。

    底线:您可以尝试重新 OCR 某些页面,您可以使用 Adob​​e Acrobat PRO 从 PDF 中提取文本(它具有内置的 ocr 功能),这会给您带来乱码或跳过它。

    你可以尝试一些其他的 pdf 阅读框架,也许他们得到了一些不太正确的东西 - 但如果它几乎总是有效,但只是不适用于一些特殊的 pdf,那么机会很小。

    我只是 pdf 的新手 - 有一些更高级的 ppl 可以参与进来 - 但如果你不能分享 pdf,那么很难提供任何建议。


    替代方法:Searching text in a PDF using Python?

    【讨论】:

    • 只要无法分析相关的 pdf,此摘要就是一个很好的答案。
    • ISO 32000-2 - Pdf 2.0 - Spec(非免费,约 1k 页)是较新的 PDF 规范,但目前使用的大多数程序将迎合 1.7 版本
    • 我决定发布 pdf。提供它的最佳方式是什么?
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多