[英]Replacing a pdf file — it works with sed, but when using Java, the images inside the pdf file disappear. Why?
我有一個從該鏈接下載的pdf文件:
https://invoicetemplates.com/wp-content/uploads/freelance-writer-invoice-template.pdf
我用pdf tk解壓pdf
pdftk file.pdf輸出未壓縮.pdf未壓縮
當我嘗試使用sed
替換它時,它可以工作。
但是,當我使用Java
,pdf中的徽標和文本圖像就會消失。
我不知道為什么-請幫助我。
這是我在shell中的代碼:
sed -e "s/ORIGINALSTRING/NEWSTRING/g" <uncompressed.pdf >modified.pdf
這是我使用Groovy的代碼:
(new File('uncox3.pdf')).write( new File('uncompressed.pdf').getText().replaceAll(/ORIGINALSTRING/,"NEWSTRING"))
首先,如果原始字符串和替換字符串的大小不同,您的sed
命令也確實會損壞pdf。 在這種情況下,替換將更改間接pdf對象的實際起始偏移量,而無需在文件的交叉引用部分中對其進行更新。
PDF閱讀器經常在發現問題而沒有警告的情況下立即嘗試修復交叉引用,這可能就是您沒有注意到的原因。
但是,檢索您的發票文件的人可能會拒絕它們為無法分析的文件,您不能期望他們接受損壞的文件。
話雖如此,您的常規代碼更明顯地損壞pdf的原因可能是使用getText
顯式二進制到文本轉換以及write
的隱式文本到二進制轉換。
如果在假定的編碼中每個可能的字節序列都沒有一個字符(序列),則在命中這樣的字節序列時,二進制到文本的轉換將使用替換字符,而最終的文本到二進制的轉換不會知道那些替換字符的原始字節序列。
同時,utf-8是此處假定的常見默認編碼,對於utf-8,確實存在許多沒有意義的字節序列。
顯式使用類似Latin-1的編碼可能會使您的Java代碼運行與sed命令類似。
但是如上所述,即使這樣做也會損壞pdf,並且除了實驗外,不得用於其他任何用途,不得將結果PDF發送給其他人,尤其是不能用於發票或合同之類的重要內容。
我從另一個問題中發布解決方案
非常感謝大家的幫助
def s = new File("uncompressed.pdf").getText("ISO-8859-1").replaceAll("ORIGINALSTRING", "NEWSTRING")
def bb = s.getBytes("ISO-8859-1")
new File("uncox3.pdf").setBytes(bb)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.