如何为仅包含Java Itext的图像的现有PDF设置属性



我想在将其上传到服务器之前将属性设置为PDF。

Document document = new Document();
try
{
    OutputStream file = new FileOutputStream({Localpath});
    PdfWriter.getInstance(document, file);
    document.open();
    //Set attributes here
    document.addTitle("TITLE");

    document.close();
    file.close();           
} catch (Exception e)
{
    e.printStackTrace();
} 

但它不起作用。该文件正在损坏

在对另一个答案的评论中澄清:

我想将属性设置为现有的PDF(不创建新PDF(

显然,他的代码从头开始创建一个新文档(从仅使用FileOutputStream的事实来看,很明显

要操纵现有的PDF,必须使用PdfReader/PdfWriter夫妇。布鲁诺·洛吉(Bruno Lowagie(在回答堆栈溢出问题的回答" Itext设置创建日期&amp&Sandbox.stamper.superimpose.java中的修改日期:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    Map info = reader.getInfo();
    info.put("Title", "New title");
    info.put("CreationDate", new PdfDate().toString());
    stamper.setMoreInfo(info);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    XmpWriter xmp = new XmpWriter(baos, info);
    xmp.close();
    stamper.setXmpMetadata(baos.toByteArray());
    stamper.close();
    reader.close();
}

(changemetadata.java(

您看到的代码在OL'FASINDED PDF信息字典(stamper.setMoreInfo(和XMP Metadata(stamper.setXmpMetadata(中设置了元数据。

显然srcdest在这里不应相同。

没有第二个文件

在另一条评论中,OP澄清说他已经尝试了类似的解决方案,但他想防止

第二文件的临时存在

可以通过首先将原始PDF读为byte[],然后将其作为目标文件盖章,从而可以轻松地防止这种情况。例如。如果File singleFile引用了也是目标文件的原始文件,则可以实现:

byte[] original = Files.readAllBytes(singleFile.toPath());
PdfReader reader = new PdfReader(original);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(singleFile));
Map<String, String> info = reader.getInfo();
info.put("Title", "New title");
info.put("CreationDate", new PdfDate().toString());
stamper.setMoreInfo(info);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XmpWriter xmp = new XmpWriter(baos, info);
xmp.close();
stamper.setXmpMetadata(baos.toByteArray());
stamper.close();
reader.close();

(updatemetadata test testChangeTitleWithoutTempFile(

最新更新