【问题标题】:Read/Modify PDF Metadata using iTextSharp without showing any data to user on pdf properties使用 iTextSharp 读取/修改 PDF 元数据,而不向用户显示 pdf 属性上的任何数据
【发布时间】:2016-03-01 05:33:43
【问题描述】:

我正在尝试使用 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();
    }
}

我将非常感谢任何指向解决方案的指针。

【问题讨论】:

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


    【解决方案1】:

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

    当然,该问题的答案中使用的代码是用 Java 编写的,但将其移植到 C# 相当容易。这是另一个sn-p:

    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

    此功能将读取和调整 Info 字典(您在代码 sn-p 中引用的内容)。 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 元数据流之间的区别。

    【讨论】:

    • 在文档属性窗口中不想向用户显示价值。那么我们如何从 pdf 文件中隐藏元数据并在 c# 中使用 iTextShapr 库读取该元数据
    • 您想删除元数据。美好的!将其替换为 "" 和/或删除 XMP 流。您不能“隐藏”元数据,只能将其删除。请用人们可以理解的语言表达您的问题。当你写“我们在 c# 中使用 iTextShapr 库读取元数据”时,我不知道你的意思。更准确!
    • 感谢您的回复。我正在使用 PdfLayer 隐藏文本。我们如何从 PdfLayer 中获取文本。这是我使用 PdfLayer 隐藏文本的代码: PdfLayer layer = new PdfLayer("Do you see me?", writer);层.On = true; writer 是 PdfWriter 类的对象。
    • 我们如何禁用从 pdf 文件复制图像。
    • 有什么方法可以隐藏并从 itextsharp pdf inc# 中获取价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2011-03-22
    • 2014-06-02
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多