c# - 使用 itextSharp 从 pdf 中提取文本会更改数字

标签 c# pdf text itext extract

我有一个 pdf 文件,使用 itextsharp api 从中提取文本时遇到问题。

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

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

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

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

当我在计算机上使用 adobe Pdf Converter 打印机打印 pdf 文件时,它得到修复,但我需要自动修复它,例如使用 C#

谢谢

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

最佳答案

简而言之

iTextSharp 文本提取结果准确反射(reflect)了 PDF 声明中相关字符的含义。因此,PDF 规范(依赖于这些信息)建议的文本提取始终会返回此值。

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

更详细

首先,你说

I have a pdf file which I have a problem extracting text from it - using an itextsharp api.

因此使其听起来像是 iTextSharp 特定的问题。不过后来你说

You can see the problem very clearly when you try to copy and paste some numbers from the file

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

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

例如,让我们看一下您指出的文本:

For example - if you try to copy and paste a 6 digit number in the bottom you can see that it changes from 201333 to 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

关于c# - 使用 itextSharp 从 pdf 中提取文本会更改数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36687794/

相关文章:

r - 编织为 pdf 时出现错误消息 "latex-engine has been removed"

c# - iTextSharp - 打印合并的 PDF 模板

html - 多 div 文本/链接两个 div

bash - 如何删除文本文件中的每第 N 行?

c# - 使用 AutoFixture 对使用 CaSTLe Windsor 的应用程序进行集成测试的技术

c# - EntityClient Provider - 它到底做了什么?

c# - 当在 if/else 语句中定义变量时,有没有办法使用 var?

java - 将 PDF 文件从 Java Bean 返回到 JSP

python - 在大空白处分割 Pandas

c# Get 没有堆栈跟踪的调用方法