Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PDF复制文本问题:奇怪字符_Pdf_Copy Paste - Fatal编程技术网

PDF复制文本问题:奇怪字符

PDF复制文本问题:奇怪字符,pdf,copy-paste,Pdf,Copy Paste,我试图从PDF文件中复制文本,但得到了一些奇怪的字符。奇怪的是,Okular可以识别文本,但苏门答腊PDF或Adobe无法识别,这三个应用程序都安装在64位Windows 10中。为了更好地解释我的问题,这里是视频。“文本层解决方案文件”是我得到的一个解决方案。非常感谢您的帮助。简而言之,(原始)PDF不包含PDF规范中所述的常规文本提取所需的信息。根据任务的具体性质,您可以尝试将所需信息添加到现有的文本对象和字体中,也可以选择OCR 如PDF规范所述,将字符代码映射到Unicode PDF规范

我试图从PDF文件中复制文本,但得到了一些奇怪的字符。奇怪的是,Okular可以识别文本,但苏门答腊PDF或Adobe无法识别,这三个应用程序都安装在64位Windows 10中。为了更好地解释我的问题,这里是视频。“文本层解决方案文件”是我得到的一个解决方案。非常感谢您的帮助。简而言之,(原始)PDF不包含PDF规范中所述的常规文本提取所需的信息。根据任务的具体性质,您可以尝试将所需信息添加到现有的文本对象和字体中,也可以选择OCR

如PDF规范所述,将字符代码映射到Unicode PDF规范ISO 32000-1(以及类似的ISO 32000-2)描述了一种使用PDF中直接提供的信息将字符代码映射到Unicode值的算法

它在其他堆栈溢出答案中经常被引用(请参阅、、或),因此我不再在这里引用它

从本质上讲,这是Adobe Acrobat在复制和粘贴期间使用的算法,也是许多其他文本提取器使用的算法

在不包含文本提取所需信息的PDF中,您最终可以在算法中找到这一点:

如果这些方法无法生成Unicode值,则无法确定字符代码所代表的内容,在这种情况下,一致性读取器可以选择自己选择的字符代码

如果上述算法无法生成Unicode值,会发生什么情况 这就是文本提取实现的不同之处,它们试图通过使用启发法或来自PDF之外的信息,或将OCR应用于所讨论的字形来确定匹配的Unicode值

您尝试的不同程序返回的结果如此不同,这表明

  • 您的PDF不包含PDF规范和

  • 这些程序使用的启发式方法各不相同,Okula的启发式方法最适合您的文档

  • 在这种情况下该怎么办 根据具体情况,有多种选择,或多或少可行:

  • 请向PDF源查询包含适当文本提取信息的版本

    除非您与该来源签订合同,要求他们以机器可读的形式提供PDF,或者该来源有义务这样做,否则他们通常会拒绝,尽管

  • 对有问题的PDF应用OCR

    根据OCR软件的质量和PDF中的字形,结果的质量可能有问题;e、 g.在您的“PDF副本文本发行文本层解决方案.PDF”中,标题“第1章:衍生证券”已被确认为“第1章:Deratve证券”

  • 您可以尝试以交互方式将手动创建的ToUnicode地图添加到PDF中,例如,如中所述

    根据您必须为其创建映射的不同字体的数量,这种方法可能很容易需要太多的时间和精力


  • 请分享有问题的PDF。非常感谢。这里是PDF示例文件的链接,您没有指定奇怪字符的确切位置,但我可以看到PDF中的任何连字都有不正确的Unicode输出。例如,我得到的不是“Metallgesellschaft fired”,而是“Metallgesellschaft®red”,其中“fi”是unicode连字U+FB01。这是制作PDF的软件的一个问题,在PDF中没有生成正确的ToUnicode映射。@Ryan起初我认为问题在整个文件中,因为只有Okula可以识别文本。对于具体提到的单词,苏门答腊PDF将其识别为“I%”,Adobe将其识别为“I%”。但现在我可以确认,Okular也错误地将“Metallge sellschaft fired”识别为Metallge sellschaft®红色“。很高兴知道问题出在哪里,有没有办法更正PDF格式的ToUnicode地图?谢谢,谢谢。这就解释了所有的问题,特别是关于我为什么坚持一个程序可以提取文本,而其他程序不能。请有人详细解释一下代码。我可以看到glyph字符12映射到unicode十六进制值0064,但在PDFDebugger屏幕截图中,拉丁文小写字母D有代码/CID/GID 18。最后,如何运行此代码?是否可以将其直接映射到PDFDebugger ToUnicode CMap表中?对于我来说,OCR作为另一种解决方案不是很理想,虽然我通过了最佳路径(文本层覆盖),因为文本的准确性为回到这里提供了理由,但我不能在上面提到的线程的答案部分发表评论。@ariefcfa“我可以看到glyph字符12映射到unicode十六进制值0064,但在PDFDebugger屏幕截图中,拉丁文小写字母D的代码为/CID/GID 18。“-ToUnicode CMap中的所有映射数据都以十六进制数写入,包括字符代码。因此,
    作为十进制数是18!PDFDebugger将数字输出为十进制数字。因此,您看到的数字毕竟是匹配的@ariefcfa“如何运行此代码”-它是基于PDFBox库的Java代码。因此,您可以使用PDFBox jar及其依赖项编译它,然后运行编译后的代码。