【问题标题】:Extracting text from pdf using itextSharp changes digits使用 itextSharp 从 pdf 中提取文本会更改数字
【发布时间】:2016-04-18 07:28:25
【问题描述】:

我有一个 pdf 文件,我无法从中提取文本 - 使用 itextsharp api。

一些数字被其他数字或反斜杠替换:“//”

pdf 文件最初来自 MS Word,并使用“另存为 pdf”导出为 pdf,我必须使用 pdf 文件而不是 Doc。

当您尝试从文件中复制和粘贴一些数字时,您可以非常清楚地看到问题 例如 - 如果您尝试在底部复制并粘贴一个 6 位数字,您会看到它从 201333 更改为 333222。

您还可以看到日期字符串的问题:11/4/2016 变成 // // 11110

当我在我的电脑上使用 adobe Pdf 转换器打印机打印 pdf 文件时,它得到了修复,但我需要自动修复它,例如使用 C#

谢谢

文件在此处共享: https://www.dropbox.com/s/j6w9350oyit0od8/OnePageGili.pdf?dl=0

【问题讨论】:

  • 请检查您的 PDF 并检查它是否像 answered here 那样的问题。如果您无法检查自己,请分享您的 PDF 以供分析。

标签: c# pdf text itextsharp extract


【解决方案1】:

简而言之

iTextSharp 文本提取结果准确地反映了 PDF 所声称的相关字符的含义。因此,PDF 规范推荐的文本提取(依赖于这些信息)总是会返回这个。

嵌入的字体包含不同的信息。因此,不相信这些信息的文本提取方法可能会返回更令人满意的结果。

更详细

首先,你说

我有一个 pdf 文件,我无法从中提取文本 - 使用 itextsharp api。

所以让它听起来像一个 iTextSharp 特定的问题。不过,后来你说

当您尝试从文件中复制和粘贴一些数字时,您可以非常清楚地看到问题

如果您还可以看到复制和粘贴问题,则它不是特定于 iTextSharp 的问题,而是多个 PDF 处理器的问题,包括您复制和粘贴的查看器,或者这只是您拥有的 PDF 的问题。

事实证明,是后者,你有一个关于其内容的 PDF。

例如,我们看一下你指出的文字:

例如 - 如果您尝试在底部复制并粘贴一个 6 位数字,您会看到它从 201333 变为 333222。

检查 PDF 页面内容流,您会发现这些指令生成的这六位数字:

/F3 11.04 Tf
...
[<00150013>-4<0014>8<00160016>-4<0016>] TJ

即字体选择F3(使用Identity-H编码,所以每个字形用两个字节表示),绘制的字形从左到右:

0015
0013
0014
0016
0016
0016

PDF 中字体 F3ToUnicode 映射现在声明:

1 beginbfrange
<0013> <0016> [<0033> <0033> <0033> <0032>]
endbfrange 

即它说

  • 字形 0013 表示 Unicode 代码点 0033,数字 3
  • 字形 0014 表示 Unicode 代码点 0033,数字 3
  • 字形 0015 表示 Unicode 代码点 0033,数字 3
  • 字形 0016 表示 Unicode 代码点 0032,数字 2

因此,使用上述说明绘制的字形字符串根据 ToUnicode 映射表示 333222

PDF 规范将 ToUnicode 映射作为将字符代码映射到 Unicode 值的最高优先级方法。因此,根据规范工作的文本提取器将在此处返回 333222

【讨论】:

  • 非常感谢您提供的详细信息。有没有 ItextSharp 解决方案?
  • 要寻找的解决方案是修复 PDF。对于一种非常确定的修复方法,可以使用 iTextSharp 作为 PDF 操作框架,但会使用额外的资源,特别是字体库和最佳字体,您的文档中的子集字体是从该字体中创建的,它可能被证明不是- 微不足道的,至少相当多的工作。要做到这一点,应该对字体程序和 PDF 内部有一些了解。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多