如何保存.moreinfo属性的PDF与iTextSharp



我目前有以下类,我试图将元数据属性的哈希表添加到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中。映射被新建、填充并返回。

最新更新