1

アプリケーションで iText 2.1.7 を使用しようとしています。私は次のコードに問題を突き止めました:

InputStream inputFile = ...
OutputStream outputStream = ...
PdfReader pdfReader = new PdfReader(fis);
PdfStamper pdfStamper = new PdfStamper(pdfReader, os, '0', true);

pdfStamper.close();
pdfReader.close();
outputStream .close();

入力としてこのpdfを使用すると、このコードは破損したpdf(エラー118)を生成します(これはポーランドの課税フォームです)。この問題の簡単な回避策があるかどうか知っていますか? c#/iTextSharp の対応するコードが機能することはわかっています。

編集:これは暗号化の問題ではありません。私はすでにこれを解決しました。

4

1 に答える 1

1

コメントとして述べたように、問題のドキュメントは暗号化されてアクセス許可が制限されています。したがって、公式の iText 2.1.7 jar のコードは、PdfStamper をインスタンス化するときに、正しいパスワードが提供されなかったため、BadPasswordException をスローします。したがって、破損した PDF は生成されないため、ここでの問題はバグではありません。;)

そうは言っても、パスワードが提供されなかったという事実を無視するように iText 2.1.7 を強制することはもちろん可能です。その場合、プログラム (必要に応じて変数名を修正した) は実際に PDF を生成し、Adobe Acrobat はエラー コード 118 を表示して開くことを拒否します。

一方、現在の iText 5.x で同じことを行うと、Adobe Acrobat で問題なく開くドキュメントが生成されます。

これら 2 つの出力を比較すると、問題が明確になります。iText 2.1.7 の場合、更新された情報辞書は次のようになります。

16 0 obj
<<
/Creator(ADEP Document Services … Designer 10.0)
/Producer(Adobe LiveCycle Forms ES3; modified using iText 2.1.7 by 1T3XT)
/schemat(http://crd.gov.pl/wzor/2011/12/19/732/)
/Title(PIT-37)
/wersja_schemy(1-0E)
/ModDate(D:20121129153659+01'00')
/Subject(þÿ Z e z n a n i e   o   w y s o k o[ c i   o s i g n i t e g o   d o c h o d u \( p o n i e s i o n e j   s t r a t y \)   p r z e z   p o d a t n i k a   p o d a t k u   d o c h o d o w e g o   o d   o s ó b   f i z y c z n y c h)
/wariant(17)
/Author(Ministerstwo Finansów)
/CreationDate(D:20120816122649+02'00')
>>
endobj 

現在の iText 5.x では次のようになります。

16 0 obj
<<
/Creator(Ìû±d\\‘0Ú¼U´N°4@è4÷¤&‚ŸWŠÖsW¦ïôeå¿ê¹@aC<M¹^\t¯p; Um­…‡&amp;U$“)
/Producer(Ìû±d\\‘0Ú¼U´NSH<š¶CìœhMÙg6\(@+C“rxó3% èúáž#„~îí$´Ñ\rEÿ\){â®ø×ÇMõÒ”/k«'T“…Ô»6D±Šàûèq}=_]YùèM»Lõ‡!õØûÚ©'é+t#Väò¿ÃSVõñý)
/schemat(Ìû±d\\‘0Ú¼U´N„hÙÚújñÂð\)÷Lsg—¥oÏ0<Á@õ5/•X6úJ!–nÈÒvU‚nð)
/Title(Ìû±d\\‘0Ú¼U´NÅÎéÈ€Ã3 ÅpC„¡H)
/wersja_schemy(Ìû±d\\‘0Ú¼U´NAÞ&·4ul‰¡b‘Œó)
/ModDate(Ìû±d\\‘0Ú¼U´NÏbZk£&"!õH³Î¨l\f6\)¥+¥ûcoûÒ\rÕ8˜Í)
/Subject(Ìû±d\\‘0Ú¼U´N:¡Ž”"ؘí¹~KŸpS†ÑŽäQ%”ýãtõÌt\t‚Ý3t\r9Ñ}#M …O¦\nqWóm: íÑ;A“GÝ.mÐÔéÔ]Ùn“Ƽä°'0%±@ \rÞªeé¶T<“¾./ýÂA"ÆRvoo€‚—Ý{?Ü“Nö\r¼¨]üv•¯y©Tˆ aŸ?"y°à¡ÀaÂÛ”ÄR’rèŽêKD•M6{Ä£t´é¾ù|%¬ƒÒˆM….’Ëð½˜B‡lƳ¤+¦Š¹ôTÝ^å¤=‹BAO‚Ø€°ú̱æj9_!#÷h‡5)
/wariant(Ìû±d\\‘0Ú¼U´N6©BÛâ`Ì¡k‹Ô &lt;½`)
/Author(Ìû±d\\‘0Ú¼U´NŒ’×,ïZ2ä¡Åöw윭?bjÃô‚w|éUÆÐ±)
/CreationDate(Ìû±d\\‘0Ú¼U´N'·¬‡jHÎâÃë&šZ¦Ñ.U©ü«s¾½Ý;2¸Q)
>>
endobj 

したがって、iText 2.1.7 は更新された情報辞書のエントリを暗号化せず、Adobe Acrobat はそれを解読しようとしてヒックアップしました。

編集

残念ながら、暗号化されていない情報ディクショナリを離しても、ファイルをロードしようとすると 118 が表示されます。したがって、ファイルをもう一度見てみると、別の違いがあります。iText 2.1.7 で作成されたバージョンには小さなオブジェクト ストリームが含まれていますが、他のバージョンには含まれていません。そのオブジェクトストリームを読み取ろうとすると、iText自体がつまずきます...

于 2012-11-29T15:05:01.567 に答える