Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/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_Encoding - Fatal编程技术网

PDF中的文本搜索和替换

PDF中的文本搜索和替换,pdf,encoding,Pdf,Encoding,我正在使用一个名为Docraptor的HTML到PDF转换工具,生成用户可以从我工作的站点生成的报告PDF。然而,这种转换需要一点时间。因此,我缓存生成的PDF,并使用生成的HTML的十六进制摘要作为缓存键 最近,我们决定将当前日期和时间添加到每个报告中。当然,这意味着HTML(以及十六进制摘要)在报告的每一代上都会发生变化,即使报告的内容保持不变,我们也必须生成另一个PDF 我想,在生成HTML时,我可以在当前日期和时间(例如,“\uuu current\u date\u time\uuuuu

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

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

我想,在生成HTML时,我可以在当前日期和时间(例如,
“\uuu current\u date\u time\uuuuu”
)的位置放置一个标记,然后在缓存的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~^

[代码><0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 C\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\xexez\xAE\xAE\xAE\xAE8.8\X8 8 8\X8 8 8 8\X7\X8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8\X7\X8 8 8\X8 8 8 8 8 8\X8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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您最好缓存PDF,而不是使用“文本”或其他内容作为日期/时间,您可以选择使用“水印”或“戳记”,并确保它位于正确的位置

我知道PDFtk是一个免费的工具,你可以用它来做这件事,虽然它既快又免费,但我不赞成它,因为它不能保存内容(它会改变一些元数据),但肯定有很多其他工具可以做到这一点

希望这种方法能为您节省一些时间

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

只是想告诉你为什么这很可能行不通:

  • 在PDF中,页面内容流(以及其他流)通常以压缩格式存储。因此,应用于文件的普通grep或任何类似文本搜索都不可能找到占位符

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

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

    即使您处于仅使用标准编码的情况下,例如,WinAnsionODing,您也可能会遇到麻烦,因为:

  • 页面内容中的文本绘制操作不必按阅读顺序进行。例如,您的示例占位符可能分为三个数据包,第一次、第二次、第三次、第三次。这会阻止您识别占位符

    即使在您的情况下没有发生这种情况,您也可能会遇到麻烦,因为:

  • 即使占位符的部分按正确的顺序绘制,它们也可能被绘制为单独的块,中间有数字表示紧排信息,即增加或减少字符宽度,以确保某些字母组合在不按标准距离打印时看起来更好。这些信息再次打断您的文本替换一种新的方法

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


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

    取决于PDF的生成方式。例如,如果PDF存储文本的图片,则当前_日期时间不太可能出现在pdf中,如果它出现,几乎可以保证不会出现在您想要的位置。您看到的
    \x
    内容只是UTF-8编码的文本,例如。\x94相当于0x94的十六进制代码。谢谢Marc B。如果有帮助的话,他们正在使用princexml进行转换。也就是说,您可以吗告诉我哪一系列命令可以让我从“当前日期时间”转换到\x转义的UTF-8版本的文本?理论上,如果pdf是UTF-8格式,那么当前日期时间就不需要编码,因为它没有使用任何“高”字符。好的,这就是我想的。有道理。谢谢你的帮助。你的方法有一个大问题,我可以在缓存的PDF中进行文本搜索和替换。PDF中的文本流通常是压缩的。因此,简单的文本搜索可能找不到任何东西。但是,这种方法也有其他问题。我希望我可以我选择mkl是因为他对actu有反应