2016-10-26 41 views
0

pdfにテキストをスタンプするだけで、itextsharpは破損したファイルを作成します。文書が何ページのルートがありません:「iTextSharp.text.exceptions.InvalidPdfException」 追加情報タイプのItextsharpはテキストをスタンプした後に破損したpdfを作成します

例外を次のようにエラーがスローされますPDFファイルの読み取りしようとしたときに(意味を:それは無効なPDFです)。コードは、PDFファイルがApacheのFOP 1.1とitextsharpで作成されたPDFやスタンプ、テキストコンテンツ

using (PdfReader pdfReader = new PdfReader(System.IO.File.ReadAllBytes(pdfPath))) 
      using (Stream pdfStream = new FileStream(pdfPath, FileMode.Open, FileAccess.ReadWrite)) 
      { 
       PdfReaderContentParser parserReason = new PdfReaderContentParser(pdfReader); 
       PdfStamper pdfStamper = new PdfStamper(pdfReader, pdfStream); 
       PdfContentByte pdfContentByte = pdfStamper.GetOverContent(pdfReader.NumberOfPages); 
       BaseFont baseFont = BaseFont.CreateFont(BaseFont.COURIER_BOLD, BaseFont.CP1250, BaseFont.NOT_EMBEDDED); 
       pdfContentByte.SetColorFill(BaseColor.BLACK); 
       pdfContentByte.SetFontAndSize(baseFont, 12); 
       pdfContentByte.BeginText(); 
       TextMarginFinder finderReason = parserReason.ProcessContent(pdfReader.NumberOfPages, new iTextSharp.text.pdf.parser.TextMarginFinder()); 
       pdfContentByte.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "Some text : " + annotation, finderReason.GetLlx(), finderReason.GetLly() - 20f, 0); 
       pdfContentByte.EndText(); 
       pdfStamper.Close(); 

      } 

を編集するために使用された後は、file.Theの問題がすべてで起きていない編集するために使用される

pdfファイルの場合のみです。 You can find the PDF which creates the issue here

+3

問題のPDFを投稿すると、ページルートがないかどうかを確認するのにも役立ちます。 – confusedandamused

+0

ありがとう@confusedandamused。私はファイルをアップロードし、私の質問をリンクで更新しました。 –

答えて

2

問題は、次のようにファイルストリームを開いているということです。

using (Stream pdfStream = new FileStream(pdfPath, FileMode.Open, FileAccess.ReadWrite)) 

FileMode.Openは単にそれを上書きし、それへの書き込み、代わりに古いコンテンツを残します。特に、新しい文書が元の文書よりも短い場合、元の文書の古いテール部分が残る。 PDFの相互参照が終了すると、古い相互参照が新しい文書に適用されます。これは明らかに一致しません。

代わりにFileMode.Createを使用している場合、この問題は発生しません。


ちなみに、サンプルファイルには最後のページにテキストがないため、提供したサンプルファイルのコードは完全に失敗します。したがって、finderReasonは余白の矩形を決定しません。finderReason.GetLlx()へのアクセスは、nullの矩形のメンバーにアクセスしようとし、結果として失敗します。適切なチェックをいくつか追加する必要があります。

+0

これは、最初にコピーした新しい文書を作成し、次にその文書をスタンプテキストにする必要があることを意味します。 –

+0

ありがとうございました! –

関連する問題