我想在将其上传到服务器之前将属性设置为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
(中设置了元数据。
显然src
和dest
在这里不应相同。
没有第二个文件
在另一条评论中,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
(