文本搜索和PDF替换

时间:2013-08-16 17:38:15

标签: pdf encoding

我正在使用名为Docraptor的HTML到PDF转换工具来生成用户可以从我工作的网站生成的报告的PDF。然而,这种转换需要一点时间。因此,我缓存了我生成的PDF,并使用生成的HTML的十六进制摘要作为缓存键。

最近我们决定在每个报告中添加当前日期和时间。当然,这意味着即使报告的内容保持不变,HTML(以及因此十六进制摘要)也会在每一代报告中发生变化,并且我们将始终必须生成另一个PDF。

我认为,在生成HTML时,我可以在当前日期和时间(例如'__CURRENT_DATE_TIME__')放置一个令牌,并且我可以在缓存中进行文本搜索和替换PDF。不幸的是,PDF似乎使用的编码使这更加复杂。以下是编码文本的示例:

\x947+\xbf\xad|H\xf9c\xe5\xcf\x95\xa7\x941\xd5\x1d\xaa\x07US\xaa\xb7\xd4\t\xea\nu\xbbz\xad\xfa&\xf5w\xd5\x87\xd5\xbfS\xc74\xb9\xe8Om\xc8}\xfe\xbc4w\x07\xb9T\xe1\xe5\xf6\x90\x187\x85r\xff\x90\x1b\xe3\xff\x8d\xfb:y\xe2\xbcL\xb8\x1b9\xe8\x85\x8d\xdc\x14\xff\x0c\xf7\xcd\xab\xf6\xf0o\xf0\xdf\xe3\xae\x05P4\xb3\xe9E\x98\xc5^\x82\x1f\xc0K\xca_+\x92\x95o\xc1\x8b\\:\xbc\x87\xf9\xf0\xeb\xbc\x9f\xfb!w/g%\x15\xfcB\xc5\r\x8a\x970\xebL \x9f\x0fq\'85\xb7\x0f1\xfe\x84\xd6\xd8\x08\x17\x934\xf8\x8bb\x1d\xbc\x8f\xfa?\xa2\xdc\x8d:]\xcc\x1d\'Op/p\x17\xa1\'\x1f\x83\x87\xb9\xc3p/\xec\x85\x00\xa9D\xeez\xe1I\xf8\x18\xbeF\x0e\xf1"9\x88~\xb7\x03\x8e\xc2\xbbp\xf2\x1c\xb7\n\xef\xd9F\xae^e\xe5\xb6\xaaj\xd0B\x87\xc8\xaa\xd8\x8b\\~\xecO\x18\xf5\xbf\'7\xc0\xeb\xfc\xc7\xe8\xfb\xeb\xc8\n\xe2\x85G\xe1M\xb4\xfao\x88\x8f\xd8\x153\n\x1b\xbc\x8c\x99/\x0b\xeeG\xaf\xfd#Lb\x0c\xfe\\\x91\x8d\x11\xf4\x11\x1c\xe2}\xb0^q\x12m\xee=\xfb\xb3\x99f\xe5\x18\x7f\x1d9\xc35\xa09SY\xe6^I\xb31\xe6\xe0{0W\xd1<\x9a\x08\xfb\xd0\x130\x8b\xb0\x88\xfe\x13\xfc\x828Q\x8b\xbfV\xbd\x06\xf7\xc1\xed\xf04\x9f\x0c9\xfc#\xdcN.\xc6\xffT!\xc2\xbf\xc0I~9\xeez5\xe6\xa7\x0c\xe2CJC0\x80r\x88\xb1?\xcc<\x8c\x14.\x87*\xa8"\x9b\xc8zh\xc6\x99\xa5\x90\x15\x1bB\xce\x1f\xc5\\$\xc56\xc4\xeeUv*=\xf0K\xb2\x9c$\xc3\xb3\x98\xbd\xac\xa8\xc5\xbb\x94\xda\x99\xd3\x88y\x00\xe3\xf0uXJn\x86\xc9\x99^\x98\xc6s\xc5JrH)z\xd3i\xe5V\xe5\x1e\xe5\xe3\xca\x03\xca\x1f*\x7f\xa1Z\x00W`\xd4\xde\x8fV|\x03>\xc4SC$=\xa8\x8bw\xe0o\xe8\xeb\x8d\x18=\x85\x18?\r\xc8\xc5R<\xc3\x06\xb9N\xfe\x19h"\xe90\x8290\x0f\xf3v#\xea`=Z2\x8cT\xae\x85[0\x9e\x1e\xc13\xe4\x97\xf0\x01\x11\xc8\x06\xf8!\x1c\xc3\xc8I\xc58\xef\xc1\xfd5H\xa7\x15.F\xab\x87\xe1Q\xcc\x8e\xd7\x91I\x1c\xe9\x85,(@=}L\x12I\x157\x86\xfb\xd1<{\x17\xe6\xd9i\xe4\xe9w\xf0\x07\xcc\x1c1\xc6W!YH\x9a\xd1z=\xf07\x1a\xcb\xb8C\x05\xb4\x93\xfd\xb08v\x10=a\x054\xf3/\xc1\x7fB6\x9e\xae\x8d\x18\xa3\x0f\xe3\xban\xf4\x8dD\xc8\x84j\xe5\x9b\x84\x83\xc2\x99\x15\xb1*n\x80\x7f\x86\xa4\xe0i\x98\x88^\xb5\x16O\xf6Ed\x14\xb90\xa2\x1cg!\x99\xac\x84\xf2\x99%P\x8dg\xecNhW>"IR}\xdd\xa2\xda\x855\xd5U\x95\xe5\xbe\xb2\xd2\x05%\xde\xe2\xa2BOA~^

首先,期望在某处可以找到'__CURRENT_DATE_TIME__'(正确编码)是否合理?如果是的话,我将如何编码该字符串,以便我可以进行简单的搜索并替换?

2 个答案:

答案 0 :(得分:1)

您可能最好缓存PDF而不是使用“文本”或其他内容作为日期/时间,您可以选择使用“水印”或“标记”并确保它位于正确的位置。

通过这种方式,您可以使用已有的PDF并在任何给定时刻添加所需的信息。我知道PDFtk是一个免费的工具,你可以用来做到这一点,虽然它快速而且免费,我不赞成它,因为它不是内容保留(它改变了一些元数据),但必须有很多其他工具就是这样做的。

希望这种方法可以节省你一些时间。

答案 1 :(得分:1)

  

我可以在当前日期和时间的位置放置一个令牌(例如,' CURRENT_DATE_TIME ')并且我可以在缓存的PDF中进行文本搜索和替换

只是为了让你知道为什么这很可能不会起作用:

  1. 在PDF中,大多数情况下,页面内容流(以及其他流)也以压缩的压缩格式存储。因此,应用于文件的普通grep或任何类似的文本搜索都无法找到占位符。

    即使您将PDF生成软件配置为不压缩内容流,您也很可能遇到麻烦,因为:

  2. 页面内容中字符串的编码不一定是标准的ASCII'编码。特别是在部分嵌入字体的情况下,您经常会看到一种自定义编码,其中文档中使用的该字体的第一个字形编码为0,第二个编码为1,...这样的自定义编码显然会破坏您的文本替代方法。

    即使您处于仅使用标准编码的情况,例如 WinAnsiEncoding ,您仍有可能遇到麻烦,因为:

  3. 页面内容中文本绘制的操作不必按阅读顺序排列。例如。你的样本占位符可以用三个数据包绘制,第一个是TIME,然后是DATE,然后是CURRENT。这可以防止您识别占位符。

    即使你的情况没有发生,你仍可能遇到麻烦,因为:

  4. 即使占位符的各个部分按正确的顺序绘制,也可以将它们绘制为单独的块,其间的数字表示字距调整信息,即增加或减少字符宽度,以确保某些字母组合看起来更好以标准距离打印。这些信息再次破坏了您的文本替换方法。

  5. 如果相关文档既没有提供这些字距调整信息也没有使用上面提到的任何其他选项,那么您的占位符很可能被绘制为一个文本块,可以通过文本搜索找到。

    您可能仍会感到惊讶:如果您的编辑更改了内容的长度,您还必须在PDF中修改交叉引用信息,因为PDF中的许多对象都是通过它们与文件开始。