Baji Jabbar
Baji Jabbar

Reputation: 167

Itextsharp creates a corrupted pdf after stamping some text

Just stamping some text into a pdf and itextsharp creats a corrupted file. When tried to read the pdf it throws error as follows

An exception of type 'iTextSharp.text.exceptions.InvalidPdfException' Additional information: The document has no page root (meaning: it's an invalid PDF).

Following code is used to edit the pdf and stamp text content

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();

           }

The pdf files are created with apache fop 1.1 and itextsharp is used to edit the file.The issue is not happening with all pdf but only with some files. You can find the PDF which creates the issue here

Upvotes: 0

Views: 1218

Answers (1)

mkl
mkl

Reputation: 95918

The issue is that you are opening the file stream like this:

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

FileMode.Open leaves the old content in place, writing to it merely overwrites it. In particular, if the new document is shorter than the original one, an old tail piece of the original document remains. As the PDF cross references are at its end, this results in the old cross references being applied to the new document. This obviously does not match.

If your use FileMode.Create instead, this issue does not happen.


By the way, your code completely fails for the sample file you provided because that sample file has no text on the final page. Thus, finderReason determines no margins rectangle, your access to finderReason.GetLlx() tries to access a null rectangle member, and consequentially it fails. You should add some appropriate checks.

Upvotes: 2

Related Questions