我目前有以下类,我试图将元数据属性的哈希表添加到PDF。问题是,尽管它似乎将哈希表分配给了stamper。MoreInfo属性,它似乎不会保存MoreInfo属性,一旦邮票被关闭。
public class PdfEnricher
{
readonly IFileSystem fileSystem;
public PdfEnricher(IFileSystem fileSystem)
{
this.fileSystem = fileSystem;
}
public void Enrich(string pdfFile, Hashtable fields)
{
if (!fileSystem.FileExists(pdfFile)) return;
var newFile = GetNewFileName(pdfFile);
var stamper = GetStamper(pdfFile, newFile);
SetFieldsAndClose(stamper, fields);
}
string GetNewFileName(string pdfFile)
{
return fileSystem.GetDirectoryName(pdfFile) + @"NewFileName.pdf";
}
static void SetFieldsAndClose(PdfStamper stamper, Hashtable fields)
{
stamper.MoreInfo = fields;
stamper.FormFlattening = true;
stamper.Close();
}
static PdfStamper GetStamper(string pdfFile, string newFile)
{
var reader = new PdfReader(pdfFile);
return new PdfStamper(reader, new FileStream(newFile, FileMode.Create));
}
}
任何想法?
一如既往,使用来源
-
在这种情况下,我很快就看到了一种可能性(Java源代码):
public void close()抛出DocumentException, IOException {if (!hasSignature) {说的好听。close(moreInfo);返回;}
此表单是否已经有某种形式的签名?让我们看看什么时候hasSignatures会为真。
你的来源不可能是这种情况。只有当你通过PdfStamper.createSignature(…)签名PDF时才会设置hasSignatures,所以这显然不是它。
-
呃……如何检查MoreInfo是否已添加?它不会在XMP元数据中。MoreInfo直接添加到Doc Info字典中。你可以在Acrobat的"自定义"选项卡中看到它们(很可能是Reader,尽管我现在没有它)。
-
你绝对确定MoreInfo不是空的,它的所有值都不是空的吗?
-
字典只是通过引用传递,所以任何更改(在另一个线程中)都会在PDF中反映出来,因为它是写的。
遍历文档"Doc info dictionary"的正确方法:
PdfReader reader = new PdfReader(somePath);
Map<String, String> info = reader.getInfo();
for (String key : info.keySet()) {
System.out.println( key + ": " + info.get(key) );
}
注意,这将遍历文档信息字典中的所有字段,而不仅仅是自定义字段。还要注意,getInfo()
对Map
所做的更改将而不是转移到PDF中。映射被新建、填充并返回。