0

我正在使用一个名为 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__'在某处可以找到(正确编码的)是否合理?如果是,我将如何对该字符串进行编码,以便我可以进行简单的搜索和替换?

4

2 回答 2

1

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

只是为了让您了解为什么这很可能不起作用:

  1. 在 PDF 中,页面内容流(以及其他流也是)通常以压缩的压缩格式存储。因此,应用于文件的普通 grep 或任何类似的文本搜索都没有机会找到您的占位符。

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

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

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

  3. 页面内容中的文字绘制操作不必按照阅读顺序进行。例如,您的样本占位符可以分为三个数据包,第一个是 TIME,然后是 DATE,然后是 CURRENT。这会阻止您识别占位符。

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

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

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

但是,您可能仍然会感到惊讶:如果您的编辑更改了内容的长度,您还必须更新 PDF 中的交叉引用信息,因为 PDF 中的许多对象是通过它们与文档开头的偏移量来引用的。

于 2013-08-17T17:04:14.130 回答
1

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

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

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

于 2013-08-17T14:41:12.603 回答