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

本文关键字:数字 取文本 提取 itextSharp pdf 使用 | 更新日期: 2024-09-24 14:52:03

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

一些数字被其他数字或反斜杠取代:"//"

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

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

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

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

感谢

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

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

简而言之

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中F3字体的ToUnicode映射现在声明:

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