我目前有以下类,我正在尝试将元数据属性的Hashtable添加到PDF。问题是,即使它似乎将hashtable分配给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));
}
}
有什么想法吗?
答案 0 :(得分:1)
与往常一样,使用来源。
在这种情况下,我很快就看到了一种可能性(Java源代码):
public void close() throws DocumentException, IOException { if (!hasSignature) { stamper.close( moreInfo ); return; }
这个表单是否已经有某种签名?让我们看看hasSignatures何时成真。
您的来源不是这种情况。 hasSignatures仅在通过PdfStamper.createSignature(...)签署PDF时设置,因此显然不是它。
呃......你怎么检查你的MoreInfo是否被添加了?它不会出现在XMP元数据中。 MoreInfo直接添加到Doc Info词典。您可以在Acrobat的“自定义”选项卡中看到它们(很可能是Reader,但我目前还没有方便)。
您是否绝对确定MoreInfo不为空,且其所有值都不为空?
字典只是通过引用传递,因此任何更改(在另一个线程中)都会在写入时反映在PDF中。
迭代文档的“文档信息词典”的正确方法:
PdfReader reader = new PdfReader(somePath);
Map<String, String> info = reader.getInfo();
for (String key : info.keySet()) {
System.out.println( key + ": " + info.get(key) );
}
请注意,这将遍历文档信息字典中的所有字段,而不仅仅是自定义字段。另请注意,更改使Map
从getInfo()
将不转移到PDF。地图是新的,填充的,并且已经返回。