2016-11-03 6 views
0

В спецификации Adobe 32000 для PDF/A указано, что данные XFA могут храниться в специальном месте в PDF/A- 2 подтверждающий PDF. Вот текст этого раздела.Как перенести данные XFA xml в файл соответствия PDF/A-2 с помощью iText/XFA Worker

Включение XFA Datasets в PDF/A-2 файл удовлетворял Для поддержки PDF/A-2, соответствующие файлы, ExtensionLevel 3 добавлена ​​поддержка данных форм XML (РФА наборов данных) через имя дерева XFAResources, который является частью словарного имени каталога документов.

(См. «ТАБЛИЦА 3.28 Записи в словаре имен» на стр. 23.) Хотя формы Acrobat (и данные формы) равны , разрешенным в файле соответствия PDF/A-2, форматы XML не являются. Такие формы XML указываются как потоки XDP , на которые ссылаются словари интерактивной формы. Потоки XDP могут содержать наборы данных XFA.

Для приложений, преобразующих PDF документы в формат PDF/A-2, имя дерева XFAResources поддерживает перемещение данных форм XML из XDP потоков в PDF документе в XFAResources имя дерева.

В XFAResources имени дерево состоит из имени строки и косвенной ссылки на поток. Строка имя создается во время преобразования документа в файл соответствия PDF/A-2. Поток содержит элемент XFA, состоящий из элементов.

В дополнении к значениям данных для формы XML-полей, элементы позволяют хранение и поиск других типов информации, которые могут быть полезны для других рабочих процессов, в том числе данные, которые не связаны с полой формы, и один или более XML-подпись (ы).

Смотрите XML Архитектуру, XML Forms Architecture (РФ) Спецификация, версия 2.6 в библиографии

У нас есть форма РФА, что мы перейдем к XML и теперь нужно преобразовать этот документ в формат PDF/A- 2.

В настоящее время мы тестируем Работника XFA, чтобы убедиться, что это позволит нам сделать это, я не смог найти образец Работника XFA, который сделает это за нас.

Сначала я попытался сгладить работу с XFA Worker, но полностью удалит данные и больше не может быть извлечен.

Как вы получаете данные XFA xml в месте, которое Adobe говорит, чтобы положить его в XFA Worker?

ОБНОВЛЕНИЕ: Спасибо Бруно, мой код не позволяет мне преобразовать форму XFA в формат PDF/A-2. Вот код, который я использовал.

xfa.fillXfaForm(new ByteArrayInputStream(xmlSchemaStream.toByteArray())); 

    stamper.close(); 
    reader.close(); 

    try (ByteArrayOutputStream outputStreamDest = new ByteArrayOutputStream()) { 
     PdfReader pdfAReader = new PdfReader(output.toByteArray()); 

     PdfAStamper pdfAStamper = new PdfAStamper(pdfAReader, outputStreamDest, PdfAConformanceLevel.PDF_A_2A); 
.... 

и я получаю com.itextpdf.text.pdf.PdfAConformanceException ошибки: документы только в формате PDF/A может быть открыт в PdfAStamper.

Итак, теперь я предполагаю, что новый PdfAStamper не является конвертером, а просто считывает в массиве байтов XFA PDF.

+1

Er ... Конечно, 'PdfAStamper' не является конвертером. Это класс, который позволяет печатать дополнительный контент (водяные знаки, номера страниц, заполнять формы) в существующий документ PDF/A. Вы не можете «подать» его форму XFA. 'PdfAStamper' ожидает документ PDF/A. –

+1

Вы сказали, что используете XML Worker для преобразования данных XFA в документ PDF/A, но теперь вы изменили свой вопрос, сказав, что используете 'PdfAStamper'. Это очень запутанно. Я предположил, что вы использовали XSLT для внедрения XML в форме XFA для преобразования данных XFA в HTML. Я предположил, что вы конвертируете этот HTML в PDF с помощью XML Worker. Теперь я больше не уверен. –

+0

Извините Бруно, я совершенно не знаком с XFA и PDF/A. Суды диктуют, что мы его используем. Но у меня есть XFA PDF для суда, я беру XML, сгенерированный JAXB в виде байтового массива, и использую XMLWorker для заполнения уже созданного файла Court PDF этим байтовым массивом. Когда это будет сделано, я должен преобразовать их форму XFA в PDF/A в Java-код, без HTML, без XSLT, чистой Java. Затем мне нужно перенести данные XFA, которые у меня были в JAXB XML в каталог. – user1567291

ответ

0

Позвольте мне начать с отцовского совета. XFA будет устаревшим в ISO-32000-2 (PDF 2.0), и здорово, что вы превращаете ваши документы XFA в документы PDF/A. Однако почему вы выбрали для PDF/A-2? PDF/A-3 идентичен в PDF/A-2 с одним исключением: в PDF/A-3 вам разрешено вставлять файлы XML. Вы можете даже указать связь между прикрепленным XML и PDF. Не было бы разумнее создать файл PDF/A-3 и прикрепить исходные данные (а не файл XFA) в качестве вложения?

Предположим, что вы проигнорировали бы этот отцовский совет, что вы могли сделать?

Приложение D ISO-19005-2 (и -3) сообщает, что вы должны добавить запись в словарь Names каталога документов. К сожалению, iText 5 не позволяет вам добавлять свои собственные записи в этот словарь имен при создании файла, поэтому вам придется выполнять пост-обработку документа.

Предположим, что у вас есть файл, расположенный в filePath, то вы можете получить Catalog запись и Names запись в Catalog запись так:

PdfReader reader = new PdfReader(filePath); 
PdfDictionary catalog = reader.getCatalog(); 
PdfDictionary names = catalog.getAsDict(PdfName.NAMES); 

Вы можете добавлять записи в этот names словарь. Например: предположим, что я хочу, чтобы добавить поток с содержанием some bytes в качестве пользовательского ввода, я хотел бы использовать этот код:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(src); 
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
    PdfDictionary catalog = reader.getCatalog(); 
    PdfDictionary names = catalog.getAsDict(PdfName.NAMES); 
    if (names == null) { 
     names = new PdfDictionary(); 
    } 
    PdfStream stream = new PdfStream("Some bytes".getBytes()); 
    PdfIndirectObject objref = stamper.getWriter().addToBody(stream); 
    names.put(new PdfName("ITXT_Custom"), objref.getIndirectReference()); 
    catalog.put(PdfName.NAMES, names); 
    stamper.close(); 
    reader.close(); 
} 

Результат будет выглядеть следующим образом:

enter image description here

в вашем случай, вы не хотите, чтобы запись называлась ITXT_Custom. Вы хотите добавить запись с именем XFAResources, и значение этой записи должно быть деревом имен, состоящим из имени строки и косвенной ссылки на поток. Для этого достаточно легко адаптировать мой пример.

Примечание: Весь код, предоставленная мной на переполнение стека можно использовать под CC-BY-SA, как это определено в Stack Exchange Network Terms of Service. Если вам не нравится CC-BY-SA, я также предоставляю этот код той же лицензии, что и для iText, а именно AGPL.

+0

Большое вам спасибо @Bruno У нас есть парень, который пишет нам нашу форму XFA, и стресс повлиял на мой сон на этом, так как с нашей стороны прошло срочное решение. У нас нет выбора в отношении технологии, она продиктована нами тем, кому мы должны подчиниться, и вы столкнулись с другим человеком, который был на той же позиции здесь http://stackoverflow.com/questions/ 28304006/экстракт встраиваемый-XML-из-PDF-с-itextsharp-с. И вы код выше, это просто iText, нет необходимости в XFA Worker? Это было бы просто лицензией для iText, а не iText и XFA Worker. – user1567291

+1

Если вы используете XML Worker для создания PDF-файла, вам нужен только основной iText без XFA Worker. До сих пор XML Worker поставляется с основным iText без дополнительной оплаты. Код для добавления XFAResource не требует XFA Worker. –

+0

Обратите внимание, что я не понимаю, как вы конвертируете форму XFA в PDF/A-2 с помощью XML Worker. Я никогда не видел, чтобы кто-то делал это без XFA Worker. Я просто предположил, что вы использовали XSLT для преобразования вашего XFA в HTML. –

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