2013-08-16 92 views
0

我使用的是HTML轉換爲PDF的工具,叫做Docraptor生成報告的用戶的PDF文件可以從一個網站,我的工作產生。然而,這種轉換需要一點時間。因此,我緩存我生成的PDF,並使用生成的HTML的十六進制摘要作爲緩存鍵。文本搜索和替換PDF

最近我們決定將當前日期和時間添加到每個報告。這當然意味着,即使報表內容保持不變,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__'(正確編碼),可以發現有什麼地方?如果是的話,我將如何去編碼該字符串,以便我可以做一個簡單的搜索和替換?

+0

取決於pdf是如何生成的。例如如果pdf正在存儲文本的圖片,那麼__current_date_time__非常不可能出現在pdf內,如果存在,幾乎可以保證不會出現在你想要的位置。您看到的'\ x'內容只是UTF-8編碼的文本,例如\ x94與十六進制代碼相當於0x94。 –

+0

感謝Marc B.如果有幫助,他們正在使用princexml進行轉換。這就是說,你能告訴我什麼系列的命令會讓我從'__CURRENT_DATE_TIME__'到文本的x轉義的UTF-8版本嗎? – Josh

+1

理論上講,如果pdf是utf-8,那麼current_date_time不需要編碼,因爲它沒有使用任何「高」字符。 –

回答

1

我可以把令牌當前日期和時間(例如,「CURRENT_DATE_TIME」),並且我可以做一個文本搜索和高速緩存的PDF內更換的地方

只給你一個想法,爲什麼這很可能不會工作:

  1. 在PDF中最常見的網頁內容流(和其他流,太)都存儲在一個泄了氣的壓縮格式。因此,應用於該文件的正常grep或任何可比較的文本搜索無法找到您的佔位符。

    即使您配置PDF生成軟件,以不壓縮的內容流,你最有可能有麻煩,這是因爲:

  2. 串在網頁內容的編碼不一定是一個標準的ASCII'ish編碼。特別是在部分嵌入字體的情況下,您經常會看到一種自定義編碼,其中文檔中使用的第一個字形編碼爲0,第二個字形編碼爲1,...這樣的自定義編碼顯然會破壞文本替代方法。

    即使你是在唯一標準編碼使用的情況下,例如WinAnsiEncoding,你仍可能有麻煩,這是因爲:

  3. 在頁面內容文本繪製的操作不一定是在閱讀順序。例如。您的樣本佔位符可能會被抽成三個數據包,分別是TIME,DATE,CURRENT。這可以防止您識別佔位符。

    即使不以你的情況發生,你可能還是會遇到麻煩,因爲:

  4. 即使你的佔位符的部分按照正確的順序繪製,它們可以被畫成單獨的塊中間的數字表示字距信息,即增加或減少字符寬度,以免某些字母組合在未按標準距離打印時看起來更好。這些信息再次打破您的文字替代方法。

如果有問題的文件沒有提供這些信息字距也採用上述任何其他選項,你的佔位符很可能被畫成一個文本塊,可以通過文本搜索找到。但是,如果您的編輯更改了內容的長度,那麼您還必須在PDF中提供交叉引用信息,因爲PDF中的許多對象的偏移量都是由它們的偏移量引用的文檔開始。

+0

非常有用和信息豐富。謝謝! – Josh

1

你可能會更好緩存PDF和而不是使用「文字」或其他內容,日期/時間,你可以選擇使用「水印」或「郵票」,並確保它在正確的位置。

這樣,你就可以使用您已有的PDF,並添加你需要在任何特定時刻的信息。我知道PDFtk是一個免費的工具,可以用來做這件事,雖然它快速且免費,但我並不贊成,因爲它不會保留內容(它會改變一些元數據),但是必須有足夠的那裏有其他工具可以做到這一點。

希望這種方式可以節省你一些時間。

+0

我希望我可以把這個標記爲答案。我選擇了mkl,因爲他回答了實際問題。這是一個很好的替代方法。謝謝。 – Josh