只是将一些文本标记为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
答案 0 :(得分:2)
问题是您正在打开文件流,如下所示:
using (Stream pdfStream = new FileStream(pdfPath, FileMode.Open, FileAccess.ReadWrite))
FileMode.Open
保留旧内容,写入它只是覆盖它。特别是,如果新文档比原始文档短,则保留原始文档的旧尾部。由于PDF交叉引用位于其末尾,因此会将旧的交叉引用应用于新文档。这显然不匹配。
如果您使用FileMode.Create
,则不会发生此问题。
顺便说一句,您提供的示例文件的代码完全失败,因为该示例文件在最终页面上没有文本。因此,finderReason
确定没有边距矩形,您对finderReason.GetLlx()
的访问权限会尝试访问null
矩形成员,从而导致失败。你应该添加一些适当的检查。