2014-09-10 4 views
0

Я создаю веб-приложение, которое заполнит форму PDF с помощью iText. Чтобы создать формы PDF, я сначала использую Microsoft Word для создания шаблона, сохранения его, затем открытия этого файла в Adobe Acrobat Xi Pro, добавления полей формы и сохранения его в формате PDF. Проблема заключается в PDF не спасает с прицепом, так когда я исполню это:iText Ошибка: java.io.IOException: трейлер не найден

PdfReader reader = new PdfReader(templateName); 

Он бросает исключение «java.io.IOException: трейлер не найден». Я знаю, что могу читать PDF-файл, если у него есть трейлер, потому что я пробовал читать другие PDF-файлы. Поэтому, похоже, проблема заключается в том, что Acrobat не добавляет трейлер в мой PDF-файл. Даже если я попытаюсь создать PDF-форму с нуля в Acrobat, она не будет сохранена в трейлере.

Неужели кто-нибудь еще сталкивается с этой проблемой? Есть ли какие-то настройки в Acrobat, которые добавят трейлер? Есть ли способ заставить iText читать его без трейлера?

==== ==== UPDATE

я должен был иметь старую версию IText, потому что, когда я скачал последнюю версию я был в состоянии прочитать мой файл PDF. Однако после прочтения файла и штамповки я получил исключение, закрывающее штамп. Код выглядит следующим образом:

PdfReader reader = new PdfReader(templateName); 
FileOutputStream os = new FileOutputStream(outputPath); 
PdfStamper stamper = new PdfStamper(reader, os); 
AcroFields acroFields = stamper.getAcroFields(); 

List<String> fields = getFieldNames(getContextCd()); 
for (String field : fields) { 
    acroFields.setField (field, StringUtil.checkEmpty(request.getParameter(field))); 
} 

stamper.setFormFlattening(true); 
stamper.close(); 

ошибка я получил:

java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature (Ljava/языки/String; Z) V в com.itextpdf.xmp.impl.XMPMetaParser.createDocumentBuilderFactory (XMPMetaParser.java:423) на com.itextpdf.xmp.impl.XMPMetaParser. (XMPMetaParser.java:71) в com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer (XMPMetaFactory .java: 167) at com.itextpdf.xmp.XMPMetaFactory.parseFromBuffer (XMPMetaFactory.java:153) at com.itextpdf.text.pdf.PdfStamperIm p.close (PdfStamperImp.java:337) в com.itextpdf.text.pdf.PdfStamper.close (PdfStamper.java:208)

только баночка файл я добавил в мой путь к классам является itextpdf-5.5.2. баночка. Нужна ли мне какая-либо из других банок?

+1

Показать нам PDF. Adobe Acrobat всегда добавляет трейлер. Возможно, в игре есть еще одна проблема. Также: какую версию iText вы используете? Я помню, что мы очень строго относились к позиции трейлера: мы реализовали спецификации буквально, и в какой-то момент нам пришлось быть менее строгими, потому что не все PDF-файлы подчиняются спецификациям (но те, которые созданы Acrobat Professional, всегда делают). –

+0

Как я могу показать PDF? Я рад поделиться им, я просто не знаю, как это сделать. – Mike

+0

Поместите его в службу обмена файлами, такую ​​как Dropbox, и поделитесь ссылкой. Снимок экрана не будет, нам нужен PDF. –

ответ

0

Мое решение будет работать ... Предположение 1: ФПВ отсутствует прицеп, он помещается под ресурсы/ххх и после сборки этого перемещается в classess/ххх Успенская 2: вы пытаетесь прочитать PDF из classpath и пытается создать объект PdfReader из этого пути к файлу PDF.

Если вышеприведенные предположения правы, ниже приведено решение, за которым следуют рассуждения: перейдите в свой файл pom или когда-либо создайте файл конфигурации, который у вас есть, и измените параметр, чтобы исключить файлы PDF из фильтра во время сборки. мы хотим, чтобы pdf-файл переместился с ресурсов/xxx на classess/xxx без каких-либо манипуляций с помощью операций сборки. что-то, как показано ниже:

<build> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <excludes> 
       **<exclude>**/*.pdf</exclude>** 
      </excludes> 
      </resource> 
     </resources> 

Объяснение необходимости? ОК. Когда ресурсы перемещаются из ресурсов/xxx в classess/xxx, независимо от того, какой тип файла они являются, все они интерпретируются процессом сборки. при этом для PDF-файлов ожидаются трейлер и теги EOF. Если нет, инструмент построения добавляет дополнительные символы в pdf-контент, чтобы сообщить о проблеме любым кодом, пытающимся использовать этот PDF-файл. Если мы пропустим фильтрацию PDF из активности сборки, тот же pdf будет работать, даже если трейлер отсутствует.

Надеюсь, это поможет!

Смежные вопросы