Itext使用Java在pdf中创建XMP

Gia*_*mma 6 java xmp metadata itext

我需要在java(使用itext)中创建以下xmp元数据并将其放在我的一个pdf中.

<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>
Run Code Online (Sandbox Code Playgroud)

到现在为止我尝试了这部分代码:

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());
Run Code Online (Sandbox Code Playgroud)

创建的xmp如下:

<pdfaExtension:schemas>
    <rdf:Bag>
      <rdf:li>a</rdf:li>
    </rdf:Bag>
Run Code Online (Sandbox Code Playgroud)

现在我无法理解如何继续下去.有关如何做到这一点的任何想法?

提前致谢

fun*_*ain 3

我能够用 iText5 来回答这个问题,尽管我认为这个答案有点“黑客”,因为它没有使用任何 iText 语义元数据对象,其中大多数似乎已被弃用。请特别注意,xmp.DublinCoreSchema、xmp.PdfSchema和xmp.XmpArray已xmp.XmpSchema被弃用,并且xmp.CustomSchema不再存在。

\n\n

iText 文档在这方面非常差。

\n\n

答案应该可以在这里或这里或这里找到,但这些都没有帮助。它们仅展示如何操作信息部分。

\n\n

可以从线程使用 XMP 添加和检索自定义属性到 PDF 派生解决方案,但不推荐使用所有使用的 iText 类。

\n\n

最后,我注意到任何XML 都可以通过stamper.setXmpMetadata(metadata)wheremetadata是byte[]包含 XML 来插入。该 XML 可以使用 DOM 创建,但在下面的快速和肮脏的文件中使用。

\n\n
package itext.sandpit;\n\nimport com.itextpdf.text.Document;\nimport com.itextpdf.text.DocumentException;\nimport com.itextpdf.text.Paragraph;\nimport com.itextpdf.text.pdf.PdfReader;\nimport com.itextpdf.text.pdf.PdfStamper;\nimport com.itextpdf.text.pdf.PdfWriter;\nimport com.itextpdf.xmp.XMPException;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\n\n\npublic class ItextSandpit {\n\n    public static void main(String[] args) throws DocumentException,\n            IOException,\n            XMPException {\n\n        // Create PDF\n        Document document = new Document();\n        PdfWriter.getInstance(\n                document, new FileOutputStream("mypdf.pdf"));\n        document.open();\n        document.add(new Paragraph("Hello World!"));\n        document.close();\n\n        // Read metadata\n        File fff = new File("metadata.xml");\n        FileInputStream fileInputStream = new FileInputStream(fff);\n        int byteLength = (int) fff.length(); //bytecount of the file-content\n        byte[] metadatabytes = new byte[byteLength];\n        fileInputStream.read(metadatabytes, 0, byteLength);\n\n        // Add metadata\n        PdfReader reader = new PdfReader("mypdf.pdf");\n        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("mypdf_plus_xmp.pdf"));\n\n        stamper.setXmpMetadata(metadatabytes);\n        stamper.close();\n        reader.close();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建一个文件metadata.xml,将 OP 中的 XML 复制并粘贴到该文件中,然后运行。要确认元数据确实位于创建的 PDF 内,pdfinfo -meta mypdf_plus_xmp.pdf请执行以下操作:

\n\n
Producer:       iText\xc2\xae 5.5.12 \xc2\xa92000-2017 iText Group NV (AGPL-version); modified using iText\xc2\xae 5.5.12 \xc2\xa92000-2017 iText Group NV (AGPL-version)\nCreationDate:   Tue Oct 10 21:01:21 2017\nModDate:        Tue Oct 10 21:01:21 2017\nTagged:         no\nUserProperties: no\nSuspects:       no\nForm:           none\nJavaScript:     no\nPages:          1\nEncrypted:      no\nPage size:      595 x 842 pts (A4)\nPage rot:       0\nFile size:      3224 bytes\nOptimized:      no\nPDF version:    1.4\nMetadata:\n<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>\n<rdf:Bag>\n<rdf:li rdf:parseType="Resource">\n<pdfaSchema:schema>ABI Assegni Schema</pdfaSchema:schema> <pdfaSchema:namespaceURI>http://abi.it/std/cheque/xmlns</pdfaSchema:namespaceURI> <pdfaSchema:prefix>assegni</pdfaSchema:prefix>\n<pdfaSchema:property>\n    <rdf:Seq>\n<rdf:li rdf:parseType="Resource">\n<pdfaProperty:name>IDDocumento</pdfaProperty:name> <pdfaProperty:valueType>Text</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Identificativo univoco del documento</pdfaProperty:description>\n</rdf:li>\n<rdf:li rdf:parseType="Resource">\n<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>\n</rdf:li>\n<rdf:li rdf:parseType="Resource">\n<pdfaProperty:name>oggettodocumento</pdfaProperty:name> <pdfaProperty:valueType>Text</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Oggetto del documento</pdfaProperty:description>\n</rdf:li>\n<rdf:li rdf:parseType="Resource">\n<pdfaProperty:name>soggettoproduttore</pdfaProperty:name> <pdfaProperty:valueType>soggetto</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Soggetto produttore</pdfaProperty:description>\n</rdf:li>\n<rdf:li rdf:parseType="Resource">\n<pdfaProperty:name>destinatario</pdfaProperty:name> <pdfaProperty:valueType>soggetto</pdfaProperty:valueType> <pdfaProperty:category>external</pdfaProperty:category> <pdfaProperty:description>Destinatario</pdfaProperty:description>\n</rdf:li> </rdf:Seq>\n\n</pdfaSchema:property>\n</rdf:li>\n</rdf:Bag>\n</pdfaExtension:schemas>\n</rdf:Description>\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果可能,请使用iText“包装器”,例如 PDFBox或移至 iText7。

\n