数値は、圧縮されたコンテンツストリームの一部であるため、クリアテキストでは利用できません。
"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
ビルド番号はどのように取得できますか。それは通常のPDFビューアで表示する必要がありますか?それとも隠された場所に入れるべきでしょうか? – mkl
フッタや附属書などのテキストに表示する必要があります。 –
この場合、@ Brunoの答えは、すばやく汚れたソリューションがどのように表示されるかを示しています。 – mkl