PDF, созданный с помощью itext, становится «поврежденным» при использовании SetSimpleColumn () - PullRequest
1 голос
/ 23 ноября 2011

Во-первых, я хотел бы отметить, что stackowerflow помог мне со многими проблемами в прошлом, поэтому спасибо всем.Но теперь я столкнулся с проблемой, решение которой пока не найдено, и это сводит меня с ума.Я не являюсь носителем английского языка, поэтому прошу прощения за любые языковые ошибки.

Итак, вот оно:

Я создаю pdf с библиотекой itextsharp (кстати, отличная библиотека).Я начинаю с какой-то формы / шаблона в формате PDF, к которому я добавляю данные для заполнения.Я использую PdfReader, чтобы прочитать шаблон PDF и, набрав PdfStamper метод GetOverContent(pageNum) для отдельных страниц, я получаю PdfContentByte.С этим PdfContentByte я добавляю свой текст / данные (BeginText и EndText используется на каждой странице).Большую часть текста я добавляю методом ShowTextAligned.Это все хорошо, сгенерированный PDF содержит мой текст.Проблема начинается там, где мне нужно добавить текст с колонками.Я делаю это с помощью следующего кода:

ColumnText ct = new ColumnText(cb);//cb is PdfContentByte
Phrase p = new Phrase(txt, FontFactory.GetFont(DEFAULT_FONT, BaseFont.CP1250, true, font_size));
ct.SetSimpleColumn(p, x, y, x+width, y+height, 10, alignment);
ct.Go();
setDefaultFont();//sets font to PdfContentByte again with setFontAndSize and SetColorFill

Текст с колонками добавляется с этим кодом ОК, но текст (на той же странице / тот же PdfContentByte), добавленный ПОСЛЕ этого с ShowTextAligned, не отображается вAcrobat Reader.

Вот часть «забавы» - текст в том же pdf-файле, открываемом с помощью программы «Foxit Reader», выглядит хорошо / видно / нормально.

Таким образом, текст, добавленный с помощью ShowTextAligned после добавления ColumnText, не отображается в Acrobat Reader, но виден в Foxit Reader просто отлично.Эта проблема существует на одной странице, новая страница сбрасывает эту проблему (PdfContentByte для следующей страницы является новой).

Мой обходной путь для этого заключался в добавлении всех ColumnText ПОСЛЕ всех вызовов ShowTextAligned.Это работало до сегодняшнего дня, когда заказчик распечатал сгенерированный PDF с помощью Acrobat Reader, который после печати документа отобразил сообщение о том, что PDF содержит ошибку, и следует связаться с автором PDF.Версия Adobe Reader: 10.1.1.Проблема не в клиентском компьютере, то же самое происходит и на моем компьютере.

После исследования Интернета я установил Adobe Acrodat Pro Trial, который содержит инструмент Preflight, предназначенный для анализа PDF-файлов (насколько я понимаю).Этот инструмент выводит предупреждение «Недопустимый поток состояния содержимого для оператора».И вот я застрял.Я полагаю, что проблема существует внутри добавленного ColumnText, потому что документ, сгенерированный без них, не вызывает проблем с отображением / печатью и состояниями предварительной проверки "Проблема не найдена".

Возможно, я упускаю какой-то факт и чтопроблема в моем коде ...

Пожалуйста, помогите мне, потому что у меня закончились идеи.Надеюсь, этот пост когда-нибудь поможет кому-то еще с такой же проблемой.Я не могу прикрепить образец PDF, потому что он содержит конфиденциальные данные, но если нет другого способа, я воссоздаю сценарий / код.

1 Ответ

2 голосов
/ 28 ноября 2011

Итак, чтобы ответить на мой вопрос / проблему: при записи в pdf с использованием PdfContentByte и при использовании метода ShowTextAligned перед записью необходимо вызвать BeginText, а после завершения необходимо вызвать EndText.Так я и сделал.НО, если вы хотите добавить какой-то другой элемент (например, ColumnText, Image и, возможно, что-нибудь еще), вы не можете сделать это, прежде чем вызвать EndText.В противном случае сгенерированный pdf будет «проблематичным» / поврежденным.

Так что в псевдокоде неверно следующее:

BeginText();
ShowtextAligned();
AddImage();
ShowtextAligned();
EndText();

Правильное использование:

BeginText();
ShowtextAligned();
EndText();
AddImage();
BeginText();
ShowtextAligned();
EndText();

Iнадеюсь, это когда-нибудь кому-нибудь поможет.

...