使用 iTextSharp 阅读 PDF 时出现奇怪的字符

2024-02-12

我正在使用 iTextSharp 来阅读 PDF 文件。我尝试使用以下简单的代码阅读第一页中的全文:

var pdfReader = new PdfReader("<fileName>");
var pageText = PdfTextExtractor.GetTextFromPage(pdfReader, 1, new SimpleTextExtractionStrategy());

它返回一个像这样的字符串:

"\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \ 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \ 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \ 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \ 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \ 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \ 0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 !\n\" \0 \0 \0 \0 \0 \0 # \0 $ \0 % \0 & $ \0 ' \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 !\n\" \0 \0 \0 (\n\0 \0 \0 ) \0 \0 * \0 + , \0 , \0 \0 & , \ 0 - \0 .# \0 \0 \0 & $ \0 , \0 /\n+ \0 & & \0 * 0 \0 1 .\n2 \0 3\n4 - \0 5 \0 \0 $ \0 \0 # \0 \0 \0 & $ \0 , \0 * & \0 \0 ' \0 .\n6\n\0 \0 \0 - \0 \0 \0 \0 & \0 \0 \0 \0 \0 \0 \0 , \0 # \0 \0 \0 & $ \0 , \0 \0 \0 & \0 # \0 \0 & $ ') & \0 \0 \0 \0 # \0 ' ' \0 7 - \0 $ \0 \0 7 \0 ' \0 , \0 8\n9 5 \0 \0 , \0 \0 $ $ \0 \0 \0 \0 \0 ' \0 \0 3\n\0 \0 \0 ) \0 \0 \0 \0 4 - \0 5 \0 \0 $ \0 \0 * & \0 \0 ' \0 .\n\0 \0 \0 \0 # \0 $ \0 $ \0 \0 ) \0 \0 \0 : 0 ; \0 ; \0 ? \0 ? \0 3 \0 (\n@\n\0 \0 # \0 $ \0 % \0 & $ \0 ’ \0 ! 3\n\0 ......"

我可以使用 Acrobat Reader 和浏览器阅读原始 PDF。该文件似乎是 PDF/A。

我使用的代码适用于其他 PDF。

iText 这个标准有问题吗?

有人能指出我正确的方向吗?

Update

从 Acrobat 复制/粘贴会出现损坏的文本。我不认为这是 iTextSharp (5.5.10) 问题。

Update

您可以尝试使用此文件:PDF 示例 http://www.olgiatidaniele.com/Public/CU.pdf


该文件不包含文本提取所需的信息。此外,该文件作为 PDF/A 文件无效。

文本提取信息

该示例文件包含显示空表单的背景(位于表单 XObject 资源中)和填充值的前景(紧邻页面内容流中)。

XObject 表单中的文本是使用 Type 3 字体绘制的,其编码中没有标准编码或标准名称。也没有转Unicode地图在里面。

这意味着文字绘图说明在这种形式中,XObject 的参数是字节序列,并且对于每个字节值,Type 3 字体对象提供一个包含简单绘图指令的流(使用直线和曲线的路径定义;路径填充指令),但没有任何 Unicode 值的信息对应于该字节值或绘图指令集。

因此,PDF 查看器可以绘制页面,但他们无法正确地将 Unicode 字符串放入剪贴板中(我们人类将从该绘图中读取该字符串),iTextSharp 也不能。

如果没有 OCR,就没有合理的方法从表单中提取文本。


另一方面,紧邻前景的文本是使用具有标准编码的字体绘制的(WinAnsi编码),因此可以被提取。因此,在OP代码输出的末尾,你会发现

\u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000

 ...

\u0000 \u0000 \u0000 x s \u0000 l t n q o x m l \u0000 z \u0000 ~ { \u0000 } } \u0000 l w x
2016
14874587948 DITTA PROVA SRL
CREMA CR 26013 VIA DANTE 17
011110
LPRGCM82T26D150H LEOPARDI GIACOMO
M 26 12 1982 CREMONA CR
MILANO MI F205
28 02 2017
DITTAP0101 / LEOGIA01001

即表格中填写的值。

PDF/A 一致性

该文件确实claims格式为 PDF/A-1a,但检查后很快就会发现这是一个公然的谎言。例如。 Adobe Acrobat 预检 说:

这些条目表明该文档实际上甚至没有try实际上要符合 PDF/A-a1 标准,它只是claims so.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 iTextSharp 阅读 PDF 时出现奇怪的字符 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 在 Android 中使用 iText 读取或打开 PDF 文件

    我是 Android 应用程序开发新手 使用 iText 我完成了 PDF 创建并在创建的文件上写入 现在我想阅读该 PDF 文件 如何使用 iText 打开或阅读 PDF 文件 例子将是可观的 那么提前 哪个是渲染 PDF 文件的最佳库
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 如何在 R 中创建具有自定义分位数的箱线图?

    我现在正在处理一些数据 我想制作一个箱线图 显示最小值 2 5 25 50 70 75 97 5 和最大值 箱线图还应该有一个图例 显示不同颜色的线条来代表每个分位数 有什么办法可以做到这一点吗 谢谢你的帮助 set seed 123 My
  • Azure DevOps:跨存储库拉取请求?

    我不确定人们是否通常在同一存储库中维护生产分支和其他开发 开发人员特定分支 但我希望拥有单独的仅生产存储库 现在 在这种情况下 我如何不断更新生产存储库 分支中的代码 如果是同一个存储库 那么我可以跨分支创建拉取请求 并使分支 代码保持最新
  • 如何以编程方式在 sitecore 中设置 Treelist 的值

    我有一个职位描述页面 我正在以编程方式向其添加值 其中一个字段是 Office Locations 数据类型为 Treelist 如何将值添加到树列表以便我可以设置办公位置 Sitecore Treelist以管道分隔形式存储所选项目的 i
  • 使用部署槽部署Azure Functions时如何避免主机重启?

    我将管道配置为对 Azure Functions 进行零停机时间部署 为此 我采取了以下步骤 创建槽 部署到插槽 开始交换预览 完成交换 我对此过程的理解是 所有重新启动都应该仅在预览槽上发生 因此只有 JobHost 应该重新启动 并且这
  • 使用 JPA 和 Hibernate 注册 SQL 函数

    我想知道最好的方法是什么使用 JPA Hibernate 注册自定义 SQL 函数 我是否必须扩展 MysqlInnodb 方言还是有更好的方法 任何人都可以提供代码示例和相关文档的指针吗 您可能会阅读一些文章 告诉您通过扩展 Hibern
  • 使用keras加载模型并为其参数分配新值

    我正在尝试使用 keras 存储模型 然后加载它以重新训练 我的问题是加载模型时如何将学习率设置为新值 这是我的代码 Save a model model Sequential model add Dense 64 kernel initi
  • 绘制自定义组件

    这是两个问题 1 是最重要的paint的成员Component使用代号为 1 的简单 2D 图形游戏的最佳方法是什么 或者我什至不应该尝试它 2 为什么下面的代码会画出我的Component只是立即删除它 我像这样初始化我的组件 prote
  • 实体框架 ORA-00932:不一致的数据类型:“'预期 CLOB 为 CHAR”

    Oracle ManagedDataAccess EntityFramework 6 122 1 0 库用于从 MVC ASP Net 应用程序访问 Oracle 数据库 这是截至 2017 年 11 月 14 日来自 NuGet 的最新库
  • 在C程序中,是否可以将所有全局变量重置为默认值?

    我有一个旧版 C Linux 应用程序需要重用 该应用程序使用了很多全局变量 我想重用该应用程序的主要方法并在循环中调用它 我发现当我在循环中调用 main 方法 重命名为 callableMain 时 应用程序行为不一致 因为先前迭代中设
  • 从 HTML 创建自动化、严格设计的多页 PDF 报告 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有哪些基于 Python 的优秀选项可以从 HTML 创建严格设计的 PDF 报告 我附上了 PDF
  • 将base64图像发布到android中的php服务器

    我正在开发一个模块 用户可以在其中将图像上传到服务器 为此 我必须将所选图像更改为 Base64 转换后 我必须使用 Json POST 方法上传图像 但每次应用程序崩溃并且 Logcat 都会出现此错误 Error converting
  • 如何设置 ReSharper 默认公司和版权?

    我刚刚安装了 Stylecop 4 5RC 和 ReSharper 当我创建一个新类时 我发现我现在是合规的 耶 但我希望该公司是我的公司 而不是 Microsoft 我还有太多事情要做 不必担心更新版权文本 默认情况下如何填写这些
  • Gradle 扩展:对于具有简单值的属性,可以使用普通 Kotlin 类型代替 Property 吗?

    The Gradle 文档用于惰性配置 https docs gradle org current userguide lazy configuration html指出在扩展 DSL 类中 诸如var someProperty defau
  • 无法在android中连接websocket和wss

    我正在尝试使用 org java websocket client WebSocketClient API 在 android 中连接安全 websocket 连接 wss 但无法与 https 连接 然而它与 ws 这是我的代码 priv
  • 如何旋转 pyplot.table 中的列标题?

    我正在 matplotlib 中创建一个表 但表头是长字符串 表值是只有几位数字的数字 这给我留下了两个不好的选择 要么我的表格比必要的宽得多 要么我的标题重叠 为了解决这个问题 我想旋转表格标题 可能最多 90 度 换句话说 我想做thi
  • 使用存储过程作为业务逻辑层

    我工作的公司目前正在使用存储过程 在 MsSQL 服务器后端 作为其业务逻辑层 实际的业务逻辑 DLL 仅调用 sProcs 并基本上管理 UI 事件 数据绑定等 我认为设置有问题 尽管我不确定如何向同事解释 顺便说一句 该系统有效 我工作
  • Laravel 8 错误类“App\User”未找到

    我的 auth php 文件 providers gt users gt driver gt eloquent model gt App Models User class 用户控制器文件
  • 使用 python 带有自签名证书的 ssl

    我正在尝试使用我的自签名证书在 python 中构建一个简单的服务器 我使用 makecert 创建了 cer pfx pvk 文件 context ssl create default context ssl Purpose CLIENT
  • C++ 中的彩色输出

    有没有办法使用打印彩色输出iostream和Xcode 例如 我希望能够打印Hello World with Hello red World蓝色和 黄色的 我怎样才能做到这一点 您需要终端颜色代码 对于 Linux 如下 您的系统可能有所不
  • 使用 iTextSharp 阅读 PDF 时出现奇怪的字符

    我正在使用 iTextSharp 来阅读 PDF 文件 我尝试使用以下简单的代码阅读第一页中的全文 var pdfReader new PdfReader