PDF 文本提取问题 - 字体/大写不一致

2024-01-06

我正在尝试从 pdf 书中提取文本,并继续遇到一个问题,即复制的文本部分在粘贴到文本文档中时无法保留正确的大写属性。我有权复制这本书,也有使用所有必要字体的许可。起初我认为问题是由未嵌入字体引起的,但我检查后发现所有字体似乎都是嵌入的子集。 pdf 中使用了 100 多种字体,这些字体具有以下属性之一:

TrueType 编码:Ansi TrueType (CID) 编码:Identity-H 类型 1 (CID) 编码:Identity-H 类型 1 编码:自定义

书中的语言包括英语、德语、西班牙语和意大利语。在德语中,大小写绝对重要。它往往比小写字母更容易失去大写属性。

错误的一个示例是:焊接 -> 焊接

我真的不知道在这里做什么。我已请求书的所有者嵌入他作为子集完成的字体,但问题仍然存在。我尝试将 pdf 文件保存为后记,然后通过蒸馏器运行它,这正确地解决了大部分问题,但在某些情况下导致文本被替换为显示为头骨的不同字符或数字。我知道 CID 字体可能会导致此问题,但我遇到过非 CID 字体具有相同结果的实例。

什么可能导致此问题?字体是子集还是完全嵌入?有没有更好的方法将本机文件 (InDesign) 保存为 pdf,以便更好地提取字体?它是否与非 unicode 字体有关,如果是,是否有其他方法不需要所有者选择不同的字体?

非常感谢任何和所有的帮助。


这确实很有趣。 OP提供的示例PDF确实明显包含大写字符,其中一些仅在大写行中,一些在混合大小写行中,Adobe Reader将其提取为小写字符。

你想知道

什么可能导致此问题?

作为一个例子,让我们看看这是如何发生的Pelle Più bella

在页面内容中,该短语实际上看起来像大写字母的视觉表示:

/T1_0 1 Tf
-0.025 Tc 12 0 0 12 379.5354 554.8809 Tm
(PELLE PI\331 BELLA)Tj

查看使用的字体T1_0(DIN-Bold 子集)我们看到它声称使用WinAnsi编码这也表明将页面流中的这些字符代码解释为大写字母

但字体也有一个转Unicode映射,这个映射映射

<41> <0061> — 'A' → a
<42> <0062> — 'B' → b
<43> <0043> — 'C' → C
<44> <0044> — 'D' → D
<45> <0065> — 'E' → e
<49> <0069> — 'I' → i
<4C> <006C> — 'L' → l
<4D> <004D> — 'M' → M
<4E> <006E> — 'N' → n
<50> <0050> — 'P' → P
<52> <0072> — 'R' → r
<53> <0053> — 'S' → S
<54> <0074> — 'T' → t
<D9> <00F9> — 'Ù' → ù

(我只从 WinAnsiEncoding 中代表大写字母的字符代码中提取映射。)

有没有更好的方法将本机文件 (InDesign) 保存为 pdf,以便更好地提取字体?

抱歉,我不太喜欢 InDesign。但该软件来自 Adob​​e,如果这是 InDesign 或其导出为 PDF 中的错误,我会感到惊讶。难道InDesign文件中有一些信息是哪个标签佩尔·皮乌·贝拉 as 佩尔·皮乌·贝拉PDF 导出中的哪个 InDesign 会转换为此 ToUnicode 映射?

它是否与非 unicode 字体有关,如果是,是否有其他方法不需要所有者选择不同的字体?

如果您的示例文档有三种字体,它们都带有一个Encoding entry WinAnsi编码,它们都是嵌入式子集,但只有两个有如此有趣的转Unicode映射,DIN-Medium 和 DIN-Bold,而 Helvetica 没有转Unicode映射。所以它在某种程度上与字体有关。具体如何我也说不上来。

解决方法如果您的样本文档是remove the 转Unicode从字体字典映射。

例如,使用 Java 和 iText 库,您可以这样做:

PdfReader reader = new PdfReader(INPUT);
for (int i = 1; i <= reader.getXrefSize(); i++)
{
    PdfObject obj = reader.getPdfObject(i);
    if (obj != null && obj.isDictionary())
    {
        PdfDictionary dic = (PdfDictionary) obj;
        if (PdfName.FONT.equals(dic.getAsName(PdfName.TYPE)))
        {
            dic.remove(PdfName.TOUNICODE);
        }
    }
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(OUTPUT));
stamper.close();
reader.close();

经过此操作后,Adobe Reader 文本提取结果为

PELLE PIÙ BELLA

显然,这仅适用于示例文档中的情况。

如果在您的其他文档中存在混合字体,其中一些字体需要各自的字体转Unicode地图用于文本提取,而其他字体就像上面的问题字体一样,您可能需要向 Java 代码添加一些额外的条件,以仅删除有问题的字体定义中的地图。

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

PDF 文本提取问题 - 字体/大写不一致 的相关文章

  • 如何使用 Python 将表格从 CSV 写入 PDF [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个CSV文件包含下表 users passwords company Admin test psw test cmp test
  • 指定 iframe 中加载的页面的字符集

    我想知道 是否可以为加载的 iframe 提供自定义字符集 例如 如果我有一个名为www example com带有源代码 Test 现在我有一个名为 www example2 com 我想做的是加载www example com in a
  • 如何在Android中将图像文件转换为pdf文件

    我正在尝试在 Android 应用程序中将图像文件 jpg 转换为 pdf 文件 我用过itextpdf罐子和机器人文本罐 都不适合我 下面是使用时的代码itextpdf Document document new Document Str
  • SQL 查询中的外语/重音字符

    我正在使用 Java 和 Spring 的 JdbcTemplate 类在 Java 中构建一个 SQL 查询来查询 Postgres 数据库 但是 我在执行包含外来 重音字符的查询时遇到问题 例如 修剪后的 代码 JdbcTemplate
  • 在solr中获取pdf搜索结果的页码

    我正在构建一个 Web 应用程序 用户可以在其中搜索 pdf 文档并使用 pdf js 查看它们 我想显示搜索结果 其中包含找到搜索词的段落的简短片段以及用于在右侧页面打开文档的链接 所以我需要的是每个搜索结果的页码和简短的文本片段 我正在
  • 如何使用PDFBOX确定文本的人工粗体样式、人工斜体样式和人工轮廓样式

    我正在使用 PDFBox 来验证 pdf 文档 检查 PDF 中存在的以下类型的文本有一定要求 人工粗体样式文本 人造斜体样式文本 人工轮廓样式文本 我在 PDFBOX api 列表中进行了搜索 但找不到此类 api 任何人都可以帮助我并告
  • 使用 html2canvas 将 highcharts 图表渲染为 pdf 在 IE 和 Firefox 上不起作用

    我们使用 html2canvas js 和 html2canvas svg js 版本 0 5 0 beta1 以及 highcharts js 将圆环图下载为 pdf 这在 Chrome 中按预期工作 但在 IE 和 Firefox 中不
  • 将十六进制字节数组解码为特定代码页在随后编码时会产生错误结果

    我创建了一个简单的应用程序 如下所示 String stringValue new String new byte 0x00 0x00 0x00 0x25 273 byte valueEncoded Arrays copyOfRange s
  • 如何使用 PDFBox 创建转到*上一视图*的链接?

    通过使用 PDFBox 可以轻松创建指向特定页面或页面视图的链接PDPageDestination 例如 以下代码将创建一个转到第 9 页的链接 PDAnnotationLink link new PDAnnotationLink PDPa
  • 设置特定div的字符集

    是否可以为特定的 div 分配字符集 这样你就可以在一页上拥有多个字符集 我目前正在通过 JS 将文本片段导入到我的网站 其中一些文本需要 UTF 8 字符集 为了确保我的文本正确显示在包含的每个页面 有时是外部站点 上 我将元标记强制添加
  • pyPDF通过django合并并显示为httpresponse

    我在合并 pyPDF 逻辑以将两个 pdf 文件合并到我的 django 站点时遇到问题 我编写了在本地服务器上的 python 文件中运行时用于合并文件的代码 但我需要明确识别要合并的文件 from pyPdf import PdfFil
  • 将 PDF 存储在 MySQL 数据库中

    我正在开发一个应用程序 我需要创建 PDF 格式的发票 我在用着pdf包 https github com psliwa PdfBundle并且 PDF 文件已正确创建 public function helloAction format
  • jsoup 的奇怪编码行为

    我用jsoup从不同页面的html源代码中提取一些信息 大多数都是UTF 8编码的 其中一个是用 ISO 8859 1 编码的 这会导致一个奇怪的错误 在我看来 包含错误的页面是 http www gudi ch armbanduhr me
  • UTF8 vs. UTF16 vs. char* vs. 什么?谁来给我解释一下这个烂摊子!

    我已经设法忽略所有这些多字节字符的东西 但现在我需要做一些 UI 工作 我知道我在这方面的无知将会赶上我 谁能用几段或更少的内容解释我需要知道什么 以便我可以本地化我的应用程序 我应该使用什么类型 我同时使用 Net 和 C C 并且我需要
  • pdf文件文本阅读和搜索

    我想从 pdf 文件中读取文本并将文本搜索到 pdf 文件中 这是我知道的链接 这些都帮不了我 使用 Quartz 2D 解析 pdf 时获取文本位置 https stackoverflow com questions 3627745 ge
  • C# 3.0 使用MemoryStream将itextsharp pdf保存到数据库

    我正在尝试将 itextsharp 生成的 pdf 文件保存到数据库 但是 到目前为止我还没有成功 我正在使用 Linq to sql 这是代码 MemoryStream ms new MemoryStream Document d new
  • 英镑符号在商店中显示为未知字符

    对于商店中每次出现的英镑符号 我都会看到一个 黑色菱形中的问号符号 谷歌搜索得到了字符集的建议 我的设置为 utf 8 如下 我相信这家商店最初是在 Os commerce 中开设的 在货币表中 我使用了 pound 的 ascii 代码
  • Zend 框架 PDF 问题

    又是我 伙计们 我有一个小问题 Create new PDF pdf new Zend Pdf Add new page to the document page pdf gt newPage Zend Pdf Page SIZE A4 p
  • itextsharp读取表[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用 itextsharp 创建了一个带有表格的 pdf 我找到了一个例子http itextsharp sourceforge n
  • Rails 4 - 如何链接到 PDF 文件(名称.PDF)?

    我正在生成 PDF 文件 我的链接如下所示 当我点击这个时 它会带我去 display invoice 123456789 这是一个 HTML 版本 在控制器中的操作如下 def display invoice if params invo

随机推荐

  • 进程可以在其虚拟内存的任何地址上读/写吗?

    操作系统中的进程有自己的虚拟地址空间 比如说 我在 C 程序中使用 malloc 函数调用分配一些动态内存 并从它返回的地址中减去一些正值 比如 1000 现在 我尝试读取该位置上写的内容 这应该没问题 但是写入该位置怎么样 虚拟地址空间也
  • 正则表达式将字符串与可选条件相匹配[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Ruby 中使正则表达式的一部分成为可选 https stackoverflow com questions 5239883 how do i make part of a regular e
  • 合并python中的字典列表

    我有 python 中的字典 格式如下 dict1 Name a value 20 Name b value 10 Name c value 15 我想要输出类似这样的内容 dict2 a 20 b 10 c 15 怎么做 我认为你可以用
  • 计算相对于当前行匹配条件的行数

    我有一个像这样构造的数据框 但它实际上有大约 400k 行 library data table df lt fread id start end 174095 2018 12 19 2018 12 31 227156 2018 12 19
  • Dragonfly Gem 与 ImageMagick 和 Passenger

    我在让蜻蜓宝石与乘客很好地配合时遇到了一些问题 Passenger 似乎没有使用当前的 PATH 因此它找不到转换二进制文件 我给蜻蜓添加了一些配置 这似乎解决了这个问题 require dragonfly rails images Dra
  • 解决依赖关系时Maven错误

    我是 Maven 新手 正在尝试建立我的第一个POMs 我的应用程序将使用 EhCache 进行缓存 前往 Maven Central Repo 链接here http mvnrepository com artifact net sf e
  • 状态 Monad 的传播

    我有以下函数用于在游戏世界的 图形 的 边缘 行走 它改变了世界的状态 特别是玩家的位置 我还需要报告一条消息 提醒玩家位置发生变化 所以我可以返回一个 message newWorld 元组 或者我可以使用 State monad 对吧
  • 使用 RabbitMQ 的 SimpMessagingTemplate.convertAndSend 工作速度非常慢

    我正在使用 spring STOMP over Websocket 和 RabbitMQ 一切正常 但 simpMessagingTemplate convertAndSend 工作速度非常慢 调用可能需要 2 10 秒 同步 阻塞线程 能
  • 尝试在 Visual Studio 2010 中包含 winhttp.h 时出现 C++ 307 错误

    我有一个很大的问题 我正在尝试使用 WinHttp 通过 C 下载文件 并且我正在使用 Visual Studio 2010 来执行此操作 我的问题是程序无法编译 因为生成了 307 错误 所有错误都指的是winhttp h 我提到我已经包
  • FileReader javascript 类不适用于 IE

    我使用 javascript FileReader 类在将图像上传到服务器之前预览图像 Firefox 和 Chrome 似乎一切正常 但由于某种原因似乎不适用于 IE 下面是我的代码 这是针对Cakephp框架的 有没有办法解决这个问题
  • Scroll Rect 手动滚动脚本 Unity C#

    我想为 Unity 编写一个 C 脚本 使滚动视图在按 UP 键时向上滚动 在按 DOWN 键时向下滚动 只需使用 ScrollRect horizontalNormalizedPosition value range 0 to 1 or
  • 从静态基类方法调用子类构造函数

    好的 在 Objective C 中 您可以使用 new this 从基类中的静态方法新建子类 因为在静态方法中 this 指的是类 而不是实例 当我第一次发现它时 这是一个非常酷的发现 并且我经常使用它 然而 在 C 中这是行不通的 该死
  • npm install 不会创建 node_modules 目录

    我正在尝试为 mongodb uni 课程做作业 他们给了我们一些文件 说明是 run npm install mongodb then node app js 由于某种原因 npm install 不会创建 node modules 目录
  • Python 绑定的 RPATH 传播失败

    我正在构建一个使用的库 Ubuntu 22 onnxruntime https github com microsoft onnxruntime在引擎盖下 反过来 onnxruntime使用CUDA 动态加载一些专用的 后端 我构建了除 C
  • 反向对象迭代 (javascript)

    如何从后到前迭代 javascript 对象 该物体看起来像这样 33 140 34 100 35 120 36 200 我希望它像这样显示 36 200 35 120 34 100 33 140 我尝试先排序然后显示 但它按第二个数字排序
  • 哪些单元测试框架可用于 F#

    我正在专门寻找允许我利用该语言的独特功能的框架 我知道FsUnit http fsunit codeplex com 您会推荐其他东西吗 为什么 我自己的单元测试库 Unquote http code google com p unquot
  • 使用 Jena 编写 SPARQL 查询来查询 IRI,例如:http://pt.dbpedia.org/

    我正在使用 Jena 写一个SPARQL查询以获取rdfs label来自作为方法参数接收的 URI 的属性 该方法仅接收如下 URI http pt dbpedia org 它应该返回给我rdfs label 但它没有给我任何回报 我查了
  • 使用电话或电子邮件登录/注册以进行 django、allauth 集成

    我想修改我的 django 用户模型以允许电话或电子邮件注册 登录 使用 USERNAME FIELD identifier 如果用户使用电话号码注册 则标识符将是其电话号码或电子邮件 反之亦然 如果有人认为我应该分配一些数字作为标识符 请
  • 如何在 Java 中保持多个服务器之间的数据结构同步?

    有一个地图 其中包含我想要在多个服务器之间保持同步的对象 这样 如果地图中的对象被创建 删除或修改 这会立即 即在一两秒内 反映在所有服务器上 这种方式有可能扩展到数十台服务器 有没有一个轻量级的开源Java工具可以做这样的事情 我知道 T
  • PDF 文本提取问题 - 字体/大写不一致

    我正在尝试从 pdf 书中提取文本 并继续遇到一个问题 即复制的文本部分在粘贴到文本文档中时无法保留正确的大写属性 我有权复制这本书 也有使用所有必要字体的许可 起初我认为问题是由未嵌入字体引起的 但我检查后发现所有字体似乎都是嵌入的子集