2016-10-26 2 views
0

Просто прошивка какого-либо текста в pdf и itextsharp создает поврежденный файл. Когда пытался читать 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(); 

      } 

файлы PDF создаются с Apache FOP 1.1 и itextsharp используется для редактирования вопрос 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

Спасибо, сработало! –