2017-02-13 100 views
0

我正在开发一个项目,该项目将元数据嵌入到现有PDF(PDF/A3标准)的每个页面中。我的xml文件和页数一样多,程序会将相应的xml文件作为元数据嵌入到页面中。如何将xmp填充到/元数据条目的PDF页面

到目前为止,我的程序使用iText 5为每个页面添加了一个/ Metadata条目,并且我还能够在每个页面的元数据条目中添加一个简单的字符串或文本,并且可以在PDF下显示Adobe Acrobat Pro中的树结构。 这里是我的代码中添加/元数据条目页面:

 writer.addPageDictEntry(PdfName.METADATA, new PdfString("123")); 

问题至今是如何将XML添加到/元数据条目?我的xml文件是一些简单的树结构,我不知道如何将xml文件转换为PdfObject。通过iText开发者网站,它说每个页面中的/ Metadata条目应该包含xmp的引用,我不知道如何做到这一点。我是否应该将每个xml文件嵌入到一起,并将该部分的引用传递给每个页面的条目?

This screenshot of acrobat pro shows what my program can do so far, click here to see the pic

回答

0

addPageDictEntry()方法是不是你所需要的。你应该尝试setPageXmpMetadata()方法。请参阅API docs

该方法接受byte[]。确保byte[]包含正确的XMP数据。该方法将在内部完成所有繁重的工作。即:它将创建一个包含XML的流对象,并将从页面字典向该流对象添加引用。正如您可能知道的那样,PDF中禁止使用PDF流作为直接对象。

如果你想这样做艰难地,通过创建Stream对象自己,通过将其添加到PdfWriter得到引用,然后使用该引用作为页字典的项的值,你可能会从这个问题的答案中找到灵感:How do I add XMP metadata to each page of an existing PDF using iTextSharp(或this example),但是捷径方法应该更容易使用。

+0

谢谢你的回答!这真的会有很大的帮助!现在,我想出了将PDF填入PDF页面。但是我遇到了一个新问题,我厌倦了用Adobe Acrobat CC来验证我的PDF是否为真PDF/A。但是,该软件告诉我,我的PDF文件不是真正的PDF/A-3A,错误消息是“XMP属性是预定义的,但没有按照定义使用(XMP 2005)”。这个错误属性恰恰是“http://purl.org/dc/elements/1.1/dc:title”。我对此感到困惑,因为我不知道如何解决这个问题。 –

+0

任何人都可以在没有看到PDF的情况下回答这个问题?我只能猜测你在'/ Info'字典中的元数据和XMP中的元数据之间存在差异。 –

+0

嗨布鲁诺,我已经将我的测试pdf文件上传到下面的Dropbox链接。请检查这一点,我不知道如何通过PDF/A-2B有效性检查。 https://www.dropbox.com/s/wibx73w99utbmmp/Univ.Of.Arizona_Libraries_azu_acku_z3016_ray29_1349_merged.pdf?dl=0 –