使用C#编辑PDF文件的元数据

18

我正在寻找编辑PDF文件元数据的方法或库,就像程序becypdfmetaedit一样。

我想编写一个程序,需要此选项。也许您有一些C#示例。

谢谢

6个回答

25
使用PDF Sharp的步骤如下:
using System;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main (string[] args)
    {
      Program p = new Program();
      p.Test();

    }

    public void Test ()
    {
      PdfDocument document = PdfReader.Open ("Test.pdf");

      document.Info.Author = "ME";

      document.Save ("Result");
    }
  }

}


1
我已经尝试过了,但生产者无法更改 :( 这很糟糕,VS2008说它是只读的。 - subprime
3
因为这个软件是开源的,所以你可以修改它。如果你想改变文档的制作者,你需要修改PdfDocument.PrepareForSave()方法。如果文档不是使用PDFSharp创建的,它将使用原始文档的制作者。改变PdfDocumentInformation的Producer属性,使其可设置,并修改PrepareForSave()方法即可实现。 - crauscher
2
遗憾的是,pdfsharp不支持XMP元数据。 - N_A
还有一件事。PdfSharp的最新版本无法处理iref流。请参见https://dev59.com/U1oV5IYBdhLWcg3wCrAn - AndyUK
直接下载 DLL 的快捷方式:https://www.dllme.com/dll/download/33562/PdfSharp.dll - KADEM Mohammed

8

对于PDFSharp: 如果您想更改/添加PDF的自定义属性元数据,可以使用PdfDocument.Info.Elements对象。

    String filename = @"d:\temp\Hugo-input.pdf";
    String outputfile = @"d:\temp\Hugo-output.pdf";
    PdfDocument document = PdfReader.Open(filename);
    document.Info.Elements.Add(new KeyValuePair<String,PdfItem>("/MyKey",new PdfString("MyValue")));
    document.Save(outputfile);

始终使用斜杠作为自定义键的起始符号!

您可以在Adobe Acrobat Reader中打开此文档,然后找到键和值 -> 文件 -> 属性 -> 自定义。

这适用于PDFSharp 1.32。


3

我想你可以使用iTextSharp来完成这个任务。


是的,使用Info属性可以访问PDF元数据,而使用Metadata属性可以访问XML元数据(XMP格式)。 - Marc Climent

2
“PdfDocumentInformation”类来自PDF Sharp,是否符合您的要求?

你能向我解释一下它是如何工作的吗,@crauscher? - subprime
http://www.pdfsharp.net/wiki/HelloWorld-sample.ashx 展示了如何创建 PdfDocument 以及如何更改 PdfDocumentInformation (PdfDocument.Info)。如果您想要打开现有的 Pdf,可以使用 PDF sharp 中的 PfdReader 类。 - crauscher
我能否在PDF中删除/添加XMP代码? 感谢提供示例! - subprime

0
这里推销一下 - 我的公司Atalasoft,为处理图像提供.NET组件。其中一部分套件包括读写PDF文档元数据的功能。虽然不是免费的,但对于桌面应用程序来说是运行时免版税的。
阅读代码很简单:
PdfDocumentMetadata metadata = PdfDocumentMetadata.FromStream(sourceStream);

编辑并将其写回到相同的流中:

meta.Title = "Knicholas Knickleby";
meta.Author = "Edmund Wells";
sourceStream.Seek(0, SeekOrigin.Begin);
meta.Append(sourceStream, false); // false means don't merge - overwrite

自定义字段通过哈希表进行支持。


0

谢谢您提供的信息,但我正在寻找非商业解决方案。 - subprime
3
Aspose 不再允许修改制造商名称。在这里进行更新,以帮助像我一样正在寻找解决方案的任何人。 :) - CSS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接