2016-07-26 233 views
6

我需要在java(使用itext)中创建以下xmp元数据并将其放入我的pdf中。Itext使用Java创建PDF格式的XMP

<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> 

直到现在我试过这个代码部分:

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()); 

而创建XMP如下:

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

现在,我不能就如何去理解。任何想法如何做到这一点?

在此先感谢

+1

你试过了什么?您使用的是哪种版本的iText?从某个5.x.y版本(我没有检查哪一个版本)开始,iText使用Adobe提供的库来创建XMP。对于iText 7,API完全改变了,所以请不要期望没有共享您正在使用的iText版本的答案。 –

+0

我试过这个: XmpWriter w = new XmpWriter(baos); \t \t \t w.appendArrayItem(namespaceExtension,“schemas”,“a”); \t \t \t \t \t \t w.close(); \t \t \t \t \t \t writer.setXmpMetadata(baos。toByteArray()); 创建此: 一个 如何去不知道。使用itext 5.5.8 – Giamma

+0

@Giamma请在问题中添加这样的说明(其下有一个[编辑](http://stackoverflow.com/posts/38593088/edit)链接);评论中的代码很难阅读。 – mkl

回答

3

我能够回答这个问题与iText5措辞虽然我认为这个答案是一个有点“黑客”,在某种意义上说,它并没有使用任何iText的语义元数据的对象,其中大部分似乎已被弃用。请注意,xmp.DublinCoreSchema,xmp.PdfSchema,xmp.XmpArrayxmp.XmpSchema已弃用,而xmp.CustomSchema不再存在。

iText文档在这方面很差。

答案hereherehere但这些都不帮。他们只显示如何操作信息部分。

解决方案可以从线程Adding & retrieve custom properties to PDF using XMP派生而来,但不推荐使用所有使用的iText类。

最后,我注意到任何 XML可以经由stamper.setXmpMetadata(metadata)被插入其中metadata是含byte[] XML。这个XML可以用DOM创建,但是在下面的快速和肮脏的文件被使用。

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(); 
    } 

} 

创建一个文件metadata.xml从OP复制并粘贴到XML文件,并运行。为了确认该元数据真的是创建PDF内,pdfinfo -meta mypdf_plus_xmp.pdf产生

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> 

如果可能的话,使用一个iText的“包装”,比如PDFBox或移至iText7。

+1

PDFBox不是iText包装,它是不同的产品。 –

+0

@TilmanHausherr谢谢。我需要验证为什么我的构建依赖于iText,而使用PDFBox,罪魁祸首是*不* PDFBox。 – fundagain