2016-07-26 2 views
6

다음과 같이 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> 

지금은 계속하는 방법을 이해할 수 없습니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 사전에

덕분에 나는 "해킹"의 비트가이 대답을 고려하더라도 그것이 어떤 iText를 의미 메타 데이터를 전혀 사용하지 않습니다한다는 의미에서, iText5으로 표현한 나는이 질문에 대답 할 수 있어요

+1

무엇을 시도 했습니까? iText의 어떤 버전을 사용하고 있습니까? 특정 5.x.y 버전 (어느 버전인지 확인하지 않음)부터 iText는 Adobe에서 제공 한 라이브러리를 사용하여 XMP를 만듭니다. iText 7에서는 API가 완전히 변경되었으므로 사용중인 iText 버전을 공유하지 않고도 대답을 기대하지 마십시오. –

+0

나는 이것을 시도했다 : XmpWriter w = 새로운 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를 사용하여 질문에 설명을 추가하십시오 (아래에 [edit] (http://stackoverflow.com/posts/38593088/edit) 링크가 있습니다); 주석의 코드는 읽기가 어렵습니다. – mkl

답변

3

대부분의 객체는 비추천으로 간주됩니다. 특히 xmp.DublinCoreSchema, xmp.PdfSchema, xmp.XmpArrayxmp.XmpSchema은 더 이상 사용되지 않으며 xmp.CustomSchema은 더 이상 존재하지 않습니다.

iText 설명서는 이와 관련하여 매우 열악합니다.

대답 사용할 수 있어야 here 또는 here 또는 here 그러나이 중 어느 것도 도움이되지 않습니다. 정보 섹션을 조작하는 방법 만 보여줍니다.

해결책 은 스레드 Adding & retrieve custom properties to PDF using XMP에서 파생 될 수 있지만 사용 된 모든 iText 클래스는 사용되지 않습니다.

는 결국, 나는 metadatabyte[] 포함 된 XML입니다 어떤 XML은 stamper.setXmpMetadata(metadata)을 통해 삽입 할 수있는 것으로 나타났습니다. 이 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> 

가능한 경우는, 같은 PDFBox로를 iText를 "래퍼"를 사용하거나 iText7로 이동 산출한다.

+1

PDFBox는 iText 래퍼가 아니며 다른 제품입니다. –

+0

@TilmanHausherr 감사합니다. 필자는 PDFBox를 사용하면서 iText에 의존하는 빌드를 확인해야했으며 범인은 * PDFBox가 아니 었습니다. – fundagain

관련 문제