2016-07-26 29 views
6

Ich muss in Java (mit ITEXT) die folgenden XMP-Metadaten erstellen und in eine meiner PDF-Dateien einfügen.Itext erstellen XMP in pdf mit Java

<rdf:Description rdf:about="" xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/" xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#" xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#" xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#" xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#"> <pdfaExtension:schemas> 
<rdf:Bag> 
<rdf:li rdf:parseType="Resource"> 
<pdfaSchema:schema>ABI Assegni Schema</pdfaSchema:schema> <pdfaSchema:namespaceURI>http://abi.it/std/cheque/xmlns</pdfaSchema:namespaceURI> <pdfaSchema:prefix>assegni</pdfaSchema:prefix> 
<pdfaSchema:property> 
    <rdf:Seq> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>IDDocumento</pdfaProperty:name> <pdfaProperty:valueType>Text</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Identificativo univoco del documento</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>datachiusura</pdfaProperty:name> <pdfaProperty:valueType>Date</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Data e ora della produzione del file</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>oggettodocumento</pdfaProperty:name> <pdfaProperty:valueType>Text</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Oggetto del documento</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>soggettoproduttore</pdfaProperty:name> <pdfaProperty:valueType>soggetto</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Soggetto produttore</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>destinatario</pdfaProperty:name> <pdfaProperty:valueType>soggetto</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Destinatario</pdfaProperty:description> 
</rdf:li> </rdf:Seq> 

</pdfaSchema:property> 
</rdf:li> 
</rdf:Bag> 
</pdfaExtension:schemas> 
</rdf:Description> 

Bis jetzt habe ich versucht, diesen Teil des Codes:

PdfReader reader = new PdfReader(baos.toByteArray()); 
     PdfAStamper stamper = new PdfAStamper(reader, baos,  PdfAConformanceLevel.PDF_A_1B); 

     String namespaceExtension = new String("http://www.aiim.org/pdfa/ns/extension/"); 
     String namespaceSchema = new String("http://www.aiim.org/pdfa/ns/schema#"); 
     String namespaceProperty = new String("http://www.aiim.org/pdfa/ns/property#"); 
     String namespaceType = new String("http://www.aiim.org/pdfa/ns/type#"); 
     String namespaceField = new String("http://www.aiim.org/pdfa/ns/field#"); 
     XMPSchemaRegistry registry = XMPMetaFactory.getSchemaRegistry(); 
     registry.registerNamespace(namespaceExtension, "pdfaExtension"); 
     registry.registerNamespace(namespaceSchema, "pdfaSchema"); 
     registry.registerNamespace(namespaceProperty, "pdfaProperty"); 
     registry.registerNamespace(namespaceType, "pdfaType"); 
     registry.registerNamespace(namespaceField, "pdfaField"); 

     XmpWriter w = new XmpWriter(baos); 
     w.appendArrayItem(namespaceExtension, "schemas", "a"); 

     w.close(); 

     writer.setXmpMetadata(baos.toByteArray()); 

Und die erstellte XMP ist die folgende:

<pdfaExtension:schemas> 
    <rdf:Bag> 
     <rdf:li>a</rdf:li> 
    </rdf:Bag> 

Jetzt kann ich nicht auf verstehen, wie weiter zu gehen. Irgendeine Idee, wie man das macht?

Vielen Dank im Voraus

+1

Was hast du probiert? Welche Version von iText benutzt du? Ab einer bestimmten Version 5.x.y (ich habe nicht geprüft, welche), verwendet iText eine Bibliothek von Adobe, um XMP zu erstellen. Mit iText 7 wurde die API vollständig geändert. Erwarten Sie daher keine Antwort, ohne die von Ihnen verwendete iText-Version freizugeben. –

+0

Ich habe es versucht: XmpWriter w = neuer XmpWriter (baos); \t \t \t w.appendArrayItem (NamespaceExtension, "Schemata", "a"); \t \t \t \t \t \t w.close(); \t \t \t \t \t writer.setXmpMetadata (baos.toByteArray()); , die das schafft: ein Keine Ahnung, wie man weitergehen. Unter Verwendung von itext 5.5.8 – Giamma

+0

@Giamma bitte fügen Sie solche Klärungen der Frage hinzu (es gibt einen [edit] (http://stackoverflow.com/posts/38593088/edit) Link darunter); Code in Kommentaren ist schwer zu lesen. – mkl

Antwort

3

ich in der Lage bin, die Frage zu beantworten, wie mit iText5 formuliert, obwohl ich diese Antwort zu sein, ein bisschen eines „Hack“ betrachte, in dem Sinne, dass es keine Verwendung irgendeiner iText semantischer Metadaten macht Objekte, von denen die meisten als veraltet erscheinen. Beachten Sie, dass insbesondere xmp.DublinCoreSchema, , xmp.XmpArray und xmp.XmpSchema veraltet sind, während xmp.CustomSchema nicht mehr existiert.

Die iText-Dokumentation ist in dieser Hinsicht sehr schlecht.

Die Antwort sollte zur Verfügung stehen here oder here oder here aber keiner von ihnen geholfen. Sie zeigen nur, wie man den Infobereich manipuliert.

Eine Lösung kann aus dem Thread Adding & retrieve custom properties to PDF using XMP abgeleitet werden, aber alle verwendeten iText-Klassen sind veraltet.

Am Ende habe ich festgestellt, dass jede XML über stamper.setXmpMetadata(metadata) eingesetzt werden kann, wo ein metadatabyte[] enthält XML ist. Diese XML könnte mit DOM erstellt werden, aber im Folgenden wird schnell und schmutzig eine Datei verwendet.

package itext.sandpit; 

import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfStamper; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.itextpdf.xmp.XMPException; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 


public class ItextSandpit { 

    public static void main(String[] args) throws DocumentException, 
      IOException, 
      XMPException { 

     // Create PDF 
     Document document = new Document(); 
     PdfWriter.getInstance(
       document, new FileOutputStream("mypdf.pdf")); 
     document.open(); 
     document.add(new Paragraph("Hello World!")); 
     document.close(); 

     // Read metadata 
     File fff = new File("metadata.xml"); 
     FileInputStream fileInputStream = new FileInputStream(fff); 
     int byteLength = (int) fff.length(); //bytecount of the file-content 
     byte[] metadatabytes = new byte[byteLength]; 
     fileInputStream.read(metadatabytes, 0, byteLength); 

     // Add metadata 
     PdfReader reader = new PdfReader("mypdf.pdf"); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("mypdf_plus_xmp.pdf")); 

     stamper.setXmpMetadata(metadatabytes); 
     stamper.close(); 
     reader.close(); 
    } 

} 

Erstellen Sie eine Datei metadata.xml und kopieren und die XML-Daten aus dem OP in diese Datei einfügen, und ausführen. Um zu bestätigen, dass die Metadaten wirklich innerhalb der PDF ist, pdfinfo -meta mypdf_plus_xmp.pdf ergibt

Producer:  iText® 5.5.12 ©2000-2017 iText Group NV (AGPL-version); modified using iText® 5.5.12 ©2000-2017 iText Group NV (AGPL-version) 
CreationDate: Tue Oct 10 21:01:21 2017 
ModDate:  Tue Oct 10 21:01:21 2017 
Tagged:   no 
UserProperties: no 
Suspects:  no 
Form:   none 
JavaScript:  no 
Pages:   1 
Encrypted:  no 
Page size:  595 x 842 pts (A4) 
Page rot:  0 
File size:  3224 bytes 
Optimized:  no 
PDF version: 1.4 
Metadata: 
<rdf:Description rdf:about="" xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/" xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#" xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#" xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#" xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#"> <pdfaExtension:schemas> 
<rdf:Bag> 
<rdf:li rdf:parseType="Resource"> 
<pdfaSchema:schema>ABI Assegni Schema</pdfaSchema:schema> <pdfaSchema:namespaceURI>http://abi.it/std/cheque/xmlns</pdfaSchema:namespaceURI> <pdfaSchema:prefix>assegni</pdfaSchema:prefix> 
<pdfaSchema:property> 
    <rdf:Seq> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>IDDocumento</pdfaProperty:name> <pdfaProperty:valueType>Text</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Identificativo univoco del documento</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>datachiusura</pdfaProperty:name> <pdfaProperty:valueType>Date</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Data e ora della produzione del file</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>oggettodocumento</pdfaProperty:name> <pdfaProperty:valueType>Text</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Oggetto del documento</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>soggettoproduttore</pdfaProperty:name> <pdfaProperty:valueType>soggetto</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Soggetto produttore</pdfaProperty:description> 
</rdf:li> 
<rdf:li rdf:parseType="Resource"> 
<pdfaProperty:name>destinatario</pdfaProperty:name> <pdfaProperty:valueType>soggetto</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Destinatario</pdfaProperty:description> 
</rdf:li> </rdf:Seq> 

</pdfaSchema:property> 
</rdf:li> 
</rdf:Bag> 
</pdfaExtension:schemas> 
</rdf:Description> 

Wenn möglich, verwenden ein iText „Wrapper“ wiePDFBox oder iText7 bewegen.

+1

PDFBox ist kein iText-Wrapper, sondern ein anderes Produkt. –

+0

@ TilmanHaushuser Danke. Ich musste überprüfen, warum mein Build abhängig von iText während der Verwendung von PDFBox, und der Täter ist * nicht * PDFBox. – fundagain