2016-08-30 2 views
2

自動ビルドプロセスの一環として、ビルド番号を一連のPDFファイル(リファレンスガイド)にパッチしたいと思います。綺麗なやり方は、フィールドを更新してPDFを再度出力するために、LibreOfficeの一部のマクロを自動化することです。PDFドキュメントをパッチする方法

しかし、PDFファイル内のプレースホルダのバイナリ検索と置換を実行するより直接的な(おそらく間違いなく汚い)ソリューションがあるかどうかを知りたいと思います。しかし、内容はPDFでは平文で表示されないようです。助けるトリックはありますか?

+0

ビルド番号はどのように取得できますか。それは通常のPDFビューアで表示する必要がありますか?それとも隠された場所に入れるべきでしょうか? – mkl

+0

フッタや附属書などのテキストに表示する必要があります。 –

+0

この場合、@ Brunoの答えは、すばやく汚れたソリューションがどのように表示されるかを示しています。 – mkl

答えて

2

数値は、圧縮されたコンテンツストリームの一部であるため、クリアテキストでは利用できません。

"Hello World!"例。そのテキストはできる表すコンテンツストリームは次のようになります。

2 0 obj 
<</Length 65/Filter/FlateDecode>>stream 
xœ+är 
á26S°00SIá2PÐ5´ 1ôÝBÒ¸4<RsròÂó‹rR5C²€[email protected]*\C¸¹ Çq° 
endstream 
endobj 

バイナリ一部を解凍するとき、あなたはこの見つける:

q 
BT 
36 806 Td 
0 -18 Td 
/F1 12 Tf 
(Hello World!) Tj 
0 0 Td 
ET 
Q 

ただし、次の構文も正しいことになります。

BT 
/F1 12 Tf 
88.66 806 Td 
(ld!) Tj 
-22 0 Td 
(Wor) Tj 
-15.33 0 Td 
(llo) Tj 
-15.33 0 Td 
(He) Tj 
ET 

この構文ははるかに読みにくいですが、すべての計算を行い、テキストマトリックスの変更に基づいて異なるテキストスニペットを再編成すると、出力は前にあった構文の出力と同じです。

PDFが簡単に作成された場合、つまり、圧縮された構文で文字列を簡単に認識できる場合は、ページのコンテンツストリームを取得し、解凍し、変更し、圧縮して、それをPDFに戻します。

これは、探している文字列がページのコンテンツストリームに存在し、外部コンテンツストリームには存在しないと仮定します。つまり:フォームXObjectです。これらすべての前提条件が満たされている場合

、あなたはこのようにiTextのを使用することができます。

PdfReader reader = new PdfReader(src); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
int total = reader.getNumberOfPages() + 1; 
for (int i = 1; i < total; i++) { 
    byte[] content = reader.getPageContent(i); 
    byte[] alteredBytes = doSomethingWith(content); 
    reader.setPageContent(i, alteredBytes); 
} 
stamper.close(); 
reader.close(); 

あなたはdoSomethingWith()メソッドを実装する必要があり、それはあなたが必要と置き換えるバイナリ検索&を実行するように。

重要:クイック&汚いやり方を求め、これは非常に迅速&汚い方法です。私の従業員の一人がこのコードを提出するのを見ると、私はこのコードを使用するためのまともな議論を私に与えることができなければ、その場で彼または彼女を打ち殺すだろう。このコードは多くのPDFでは失敗しますが、非常に具体的な使用例で必要なものだけかもしれません。

iText or iTextSharp rudimentary text edit

+0

このような包括的な答えをありがとう。非常に洞察力!私たちはその時をあきらめて、後でクリーンなソリューション(libreofficeを自動化する)に行きます。 –

関連する問題