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();
Надеюсь, это когда-нибудь кому-нибудь поможет.