2013-04-16 231 views
1

当我使用一个小的PHP类(pdf2text)打开和读取一个“文本” PDF搞砸了特殊字符。阅读PDF

目前我不能让它来处理特殊字符像E,A,ö,ü等正确。我尝试将头文件设置为UTF-8并将接收数据编码为UTF-8,但仍无法正确显示。

的Class可以在这里找到:http://pastebin.com/PSmu03nH

如果有人有什么意见,甚至是解决方案,请让我知道。

+0

你会得到什么? PDF文件的外观如何? – silkfire

+0

Datasprzedaży:=> Datasprzeda | y – ThatMSG

+0

链接到文件? – silkfire

回答

3

一言以蔽之:

您使用的PDF2Text类忽略PDF规范ISO-32000-1:2008的重要组成部分。它仅适用于非常特殊的环境。

为了sligthly提高解码在你的问题中提到的特殊字符(变音,重音符号,...)的结果,您可能希望根据附件d 字符集和编码的PDF specification添加翻译。

详细地:

decodePDF越过在PDF中的对象,并选择流对象。在这里,它完全忽略了这些对象是否仍在使用中(即在一个文档中经常会看到来自所有修订版的修订流)。

从这些流,这一切与一个长度1类型,或子类型键删除。 (好)意图是去除包含除页面内容之外的其他内容的流。不幸的结果是对象流也被删除;对象流自PDF 1.5起是PDF规范的一部分,并捆绑了多种其他任何类型的对象,包括流;它们提供比常规顶级对象更好的压缩属性。因此,使用此功能的文档内容在此丢失。

在剩余流它检查是否含有文本对象与否。如果它们包含文本对象BT ... ET,这些对象的内容由处理getDirtyTexts。如果他们不这样做,他们是由getCharTransformations处理。

getDirtyTexts收集文字运营商TJTJ的字符串参数;一方面,这意味着它忽略文本运营商的论据”,进而对这些字符串是如何定位彼此相关的任何信息。文件具有广泛用途的字距信息和内容在字符串分隔单词使用这样的操作,而不是空间的文件,因此可能完全不可读以下。另外选择字体的操作都扔掉了这里---但这里所有的流没有连接到它们各自的ressources对象,字体信息反正无法匹配......

getCharTransformations假定流是一个ToUnicode映射流,并增加了从所有这些流中的所有映射到一个单一地图。由于多个流如果存在,很可能属于不同的字体并且可能具有完全不同的映射,将它们全部放在一个映射中将丢失大量映射信息,除非所讨论的字体被安排为具有不重叠的字符标识符范围...为什么他们应该!

现在decodePDF调用getTextUsingTransformations来处理这两种方法的结果。它遍历由getDirtyTexts提取的字符串。如果它们是十六进制编码,则它们将被解码,然后使用由getCharTransformations提取的映射进行翻译。如果它们不是十六进制编码的,则它们将被原样复制,而无需进一步翻译。

因此,根据一些ToUnicode映射来解释十六进制编码的字符串的内容,该映射可能是也可能不是与它们使用的相应字体相关的编码,并且非十六进制编码的字符串的内容被用作是完全忽略了各自字体的编码。

因此,从本质上讲,这个类可以在某种程度上被成功地使用,只能使用标准编码来使用非十六进制编码的字符串(直到字符代码127的标准编码都是ASCII-ish)并使用相同的映射进行编码,其中字符代码范围与用于十六进制编码的字符串一起使用的字体重叠。

为了sligthly提高从不是十六进制编码的字符串解码特殊字符的结果,您可能希望根据附件d 字符集和编码的PDF specification添加翻译。

+0

Thx为您的重播!你提到我的班级不是最好的......有没有人喜欢你呢? – ThatMSG

+0

不幸的是我没有在PHP中做太多工作。如果Java是一种选择... – mkl

+0

我只是搜索了一下,唯一正确提取解决方案似乎依赖于某些Java PDF库,例如PDFBox或iText,或二进制xpdf。 – mkl