PDF, созданный с помощью itext, становится "поврежденным" при использовании SetSimpleColumn()


Во-первых, я хотел бы отметить, что 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", выглядит хорошо /visible/ok.

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

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

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

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

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам