使用iTextSharp读取/修改PDF元数据,而不向pdf属性的用户显示任何数据

时间:2015-11-27 04:18:48

标签: c# wpf pdf visual-studio-2012 itextsharp

我正在尝试使用iTextSharp来读取/修改PDF元数据。不向用户显示任何信息。我看了下面的代码:

iTextSharp.text.Document document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 20f, 20f, 20f, 20f);
using (MemoryStream memStream = new MemoryStream())
{
    using (PdfWriter wri = PdfWriter.GetInstance(document, memStream))
    {
        document.Open(); document.AddSubject("Test"); document.Close();
    }
}

我非常感谢任何有关解决方案的提示。

1 个答案:

答案 0 :(得分:1)

您使用的代码段是关于向从头创建的PDF文档添加元数据。您要求从现有 PDF文档中读取元数据。请查看iText网站上的文档,更具体地说是Q& A条目How to add / delete / retrieve information from a PDF using a custom property?

当然,在回答这个问题时使用的代码是用Java编写的,但将它移植到C#相当容易。这是另一个片段:

public byte[] ManipulatePdf(byte[] src) {
    PdfReader reader = new PdfReader(src);
    using (MemoryStream ms = new MemoryStream()) {
        using (PdfStamper stamper = new PdfStamper(reader, ms)) {
            Dictionary<String, String> info = reader.Info;
            info["Title"] = "Hello World stamped";
            info["Subject"] = "Hello World with changed metadata";
            info["Keywords"] = "iText in Action, PdfStamper";
            info["Creator"] = "Silly standalone example";
            info["Author"] = "Also Bruno Lowagie";
            stamper.MoreInfo = info;
        }
        return ms.ToArray();
    }
}

您可以通过PdfReader从现有PDF中检索元数据。你得到一个Dictionary,其中的键与ISO-32000-1中的信息字典的键对应。如果要更改元数据,可以使用PdfStamper

进行更改

此功能将读取和修改信息词典(这是您在代码段中引用的内容)。 PDF还可以包含XMP元数据。

XMP元数据可以这样读取:

public string ReadXmpMetadata(byte[] src) {
    PdfReader reader = new PdfReader(src);
    byte[] b = reader.Metadata;
    return Encoding.UTF8.GetString(b, 0, b.Length);
}  

您可以像这样更改XMP元数据:

public byte[] ManipulatePdf(byte[] src) {
    PdfReader reader = new PdfReader(src);
    using (MemoryStream ms = new MemoryStream()) {
        using (PdfStamper stamper = new PdfStamper(reader, ms)) {
            Dictionary<String, String> info = reader.Info;
            using (MemoryStream msXmp = new MemoryStream()) {
                XmpWriter xmp = new XmpWriter(msXmp, info);
                xmp.Close();
                stamper.XmpMetadata = msXmp.ToArray();      
            }
        }
        return ms.ToArray();
    }
}

我假设你知道Info字典和PDF格式的XMP元数据流之间的区别。