如何使用iTextSharp保存PDF的.MoreInfo属性?

时间:2011-04-15 20:59:30

标签: pdf itextsharp

我目前有以下类,我正在尝试将元数据属性的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));
    }
}

有什么想法吗?

1 个答案:

答案 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) );
}

请注意,这将遍历文档信息字典中的所有字段,而不仅仅是自定义字段。另请注意,更改使MapgetInfo()转移到PDF。地图是新的,填充的,并且已经返回。