【问题标题】:Extracting Text from a PDF file with embedded font从带有嵌入字体的 PDF 文件中提取文本
【发布时间】:2012-09-07 13:33:46
【问题描述】:

我有一个包含一些表格数据的 PDF 文件。

http://dl.dropbox.com/u/44235928/sample_rotate-0.pdf

我必须从中提取表格数据。我尝试了以下但没有成功:

  1. 选择文本并将其粘贴到记事本/Excel 工作表中。 (我收到垃圾字符)
  2. 用于从 Acrobat Reader 中另存为文本。它还提供垃圾字符,而不是实际文本。
  3. 尝试使用 ApachePDFBox 命令行实用程序从 PDF 中提取文本。它还提供垃圾字符而不是真实文本。
  4. 最后我正在尝试 OCR 解决方案。我正在使用 ImageMagick 将 pdf 文件转换为 .tif 图像,并通过 tesseract OCR 处理这些图像。

OCR 解决方案虽然不是很准确(大约 80% 的单词匹配)。

我尝试更改从 PDF 创建的图像的密度和几何形状,以便从 tesseract OCR 获得更好的结果。

convert -rotate 90 -geometry 10000 -depth 8 -density 800 sample.pdf img_800_10000.tif;
tesseract img_800_10000.tif img_800_10000.tif nobatch letters;

我不确定哪种图像(密度、几何形状、单色、锐化边界等)最适合 OCR。

请建议从 PDF 文件生成图像的最佳参数(密度、几何形状、深度等),以便提高 tesseract 精度。

我也对其他(非 ocr)解决方案持开放态度。

【问题讨论】:

    标签: linux pdf imagemagick ocr tesseract


    【解决方案1】:

    在这种情况下,我建议使用 ImageMagick 进行 PDF -> TIFF 转换。相反,请使用 Ghostscript。两个原因:

    1. 直接使用 Ghostscript 可以让您更好地控制转换的各个参数。

    2. ImageMagick 本身无法进行特定的转换 - 无论如何它都会调用 Ghostscript 作为其 'delegate',但不允许您提供与您自己相同的细粒度控制Ghostscript 命令会给你。

    您的示例 PDF 表格中的大部分文本都非常小(我猜,只有 4 或 5 pt 高)。这使得运行成功的 OCR 变得相当困难,除非您显着提高分辨率。

    Ghostscript 默认使用-r72 进行图像格式输出(如TIFF)。 Tesseract 在 r=300 或 r=400 时效果最佳——但仅适用于 10-12 pt 或更高的字体大小。因此,为了补偿较小的文本大小,您应该在将 PDF 渲染到图像时使用至少 1200 DPI 的分辨率来制作 Ghostscript。

    此外,您必须旋转图像,以便文本以正常的阅读方向显示(不是底部 -> 顶部)。

    这是我首先要尝试的命令:

    gs                              \
      -o sample.tif                 \
      -sDEVICE=tiffg4               \
      -r1200                        \
      -dAutoRotatePages=/PageByPage \
       sample_rotate-0.pdf
    

    您可能需要使用 -r1200 参数的变体(更高或更低)以获得最佳效果。

    【讨论】:

    • 谢谢库尔特。从 Ghostscript 创建 .tif 图像似乎比转换要快得多。有没有办法像我们在 convert 中那样定义图像的几何形状?
    • @Kurt Pfeifle 是否可以从 Python 代码中执行这个 gs 命令?
    【解决方案2】:

    由于有评论询问“如何在使用 Ghostscript 时定义图像的几何形状,就像我们在 convert 中所做的那样?”,这里有一个答案:

    1. 同时为 Ghostscript 创建的光栅图像定义几何(即图像尺寸)和分辨率是没有意义的。 p>

    2. 一旦您将基于 vector 的给定尺寸的页面(例如 PDF)转换为 raster 图像(例如 TIFF G4 格式),并给出所需的分辨率 (正如在另一个答案中所做的那样),您已经间接和隐含地也设置了维度:

      • 您的示例文件 sample_rotate-0.pdf 的原始 PDF 尺寸为 1008x612 points。
      • 分辨率为 72 DPI(如果未直接给出,则默认 Ghostscript 使用,或者如果直接给出,则在 Ghostscript 命令中使用 -r72),图像尺寸将为 1008x612 像素。
      • 分辨率为 720 DPI(Ghostscript 命令中的-r720)时,图像尺寸将为10080x6120 像素。
      • 分辨率为 1440 DPI(我的另一个答案的 Ghostscript 命令中的-r1440)图像尺寸将为20160x12240 像素。
      • 分辨率为 1200 DPI(Ghostscript 命令中的-r1200)时,图像尺寸将为16800x10200 像素。
      • 分辨率为 1000 DPI(Ghostscript 命令中的-r1000)时,图像尺寸将为14000x8500 像素。
      • 分辨率为 120 DPI(Ghostscript 命令中的-r120)时,图像尺寸将为1680x1020 像素。
      • 分辨率为 100 DPI(Ghostscript 命令中的-r100)时,图像尺寸将为1400x850 像素。
    3. 如果您绝对坚持在 Ghostscript 命令行上指定输出图像的尺寸/几何形状(而不是分辨率),您可以通过在命令行中添加 -gNNNNxMMMM -dPDFFitPage 来实现。

      李>

    【讨论】:

    • 非常感谢库尔特。你解释得真好。感谢您抽出宝贵时间对此进行解释。
    【解决方案3】:

    在那里您可以找到文件的解码内容:https://docs.google.com/open?id=0B1YEM-11PerqSHpnb1RQcnJ4cFk

    绝对确定 OCR 是阅读 pdf 文件的最佳方式,但您可以尝试对原生内容进行 REGEX 处理。这将是艰难而漫长的道路。

    【讨论】:

    • 嗨,库尔特!很高兴听到你的音讯!我只想说:“使用 pdf 源的残酷力量是痛苦和 OSR - 无论如何都是最糟糕的方式”。谢谢!
    • 对不起!光学识别!英语不是我的第一语言。谢谢指正!
    • 解码后的 pdf 文件是什么?你是如何创建解码文件的?我没有看到其中的表格数据。
    • 我之前提到过,PDF 根本没有“表格数据”或某种“结构化数据”。 pdf 文件是源的一种图形“矢量化”。在您的情况下,每个单词或数字(甚至是单词的一部分)都由坐标和文本内容(单词、单词的一部分或数字)表示。例如,解码源内容的第二行说:bla bla bla, x:313.48, y:566.7204 text:"ANNUAL STATEMENT FOR THE YEAR 2011 OF THE Minnesota Life Insurance Company"。数据含义模式有:BT [.+] (x) (y) Tm [(部分文本)[.+](部分文本)...] TJ ET
    • 不幸的是,我正在使用自己的软件来提取、解码和分析 pdf 文件的各个部分。我不分发它,但我相信 Kurt 可以帮助您使用“Ghostscript”或某种软件来扩充文件的内部部分的说明。您好,对第 3 部分软件了解很多。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2016-01-29
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多