在标记一些文本后,Itextsharp会创建一个损坏的pdf

时间:2016-10-26 15:33:25

标签: c# pdf itext

只是将一些文本标记为pdf,而itextsharp会创建一个损坏的文件。当试图阅读pdf时,它会抛出错误,如下所示

  

'iTextSharp.text.exceptions.InvalidPdfException'类型的例外   附加信息:该文档没有页面根(意思是:它是无效的PDF)。

以下代码用于编辑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();

           }

使用apache fop 1.1创建pdf文件,使用itextsharp编辑文件。所有pdf都没有发生问题,但只有一些文件。  You can find the PDF which creates the issue here

1 个答案:

答案 0 :(得分:2)

问题是您正在打开文件流,如下所示:

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

FileMode.Open保留旧内容,写入它只是覆盖它。特别是,如果新文档比原始文档短,则保留原始文档的旧尾部。由于PDF交叉引用位于其末尾,因此会将旧的交叉引用应用于新文档。这显然不匹配。

如果您使用FileMode.Create,则不会发生此问题。

顺便说一句,您提供的示例文件的代码完全失败,因为该示例文件在最终页面上没有文本。因此,finderReason确定没有边距矩形,您对finderReason.GetLlx()的访问权限会尝试访问null矩形成员,从而导致失败。你应该添加一些适当的检查。