开发者

Set Metadata in iTextSharp

I am developing an application and i use the iTextSharp library.

I am also reading the iText in action from Manning so i can get references.

In Chapter 12 it has the following code to change the metadata in Java.

PdfReader reader = new PdfReader(src);
PdfStamper stamper =
new PdfStamper(reader, new FileOutputStream(dest));
HashMap<String, String> info = reader.getInfo();
info.put("Title", "Hello World stamped");
info.put("Subject", "Hello World with changed metadata");
info.put("Keywords", "iText in Action, PdfStamper");
info.put("Cr开发者_开发百科eator", "Silly standalone example");
info.put("Author", "Also Bruno Lowagie");
stamper.setMoreInfo(info);
stamper.close();

How can i do the same in C#?


Conversion from Java to C# is usually pretty straightforward. By convention, Java properties use get and set prefixes so to convert to C# you just need to drop the prefix and turn it into a .Net getter/setter call. getInfo() becomes Info and setMoreInfo(info) becomes MoreInfo = info. Then you just need to convert the native Java types to their equivalent C# types. In this case the Java FileOutputStream becomes a .Net FileStream and the HashMap<String, String> becomes a Dictionary<String, String>.

Lastly, I've updated the code to reflect recent changes to iTextSharp that now (as of 5.1.1.0) implement IDisposable now.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string workingFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string inputFile = Path.Combine(workingFolder, "Input.pdf");
            string outputFile = Path.Combine(workingFolder, "Output.pdf");

            PdfReader reader = new PdfReader(inputFile);
            using(FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)){
                using (PdfStamper stamper = new PdfStamper(reader, fs))
                {
                    Dictionary<String, String> info = reader.Info;
                    info.Add("Title", "Hello World stamped");
                    info.Add("Subject", "Hello World with changed metadata");
                    info.Add("Keywords", "iText in Action, PdfStamper");
                    info.Add("Creator", "Silly standalone example");
                    info.Add("Author", "Also Bruno Lowagie");
                    stamper.MoreInfo = info;
                    stamper.Close();
                }
            }

            this.Close();
        }
    }
}


I just made this one after searching the right place in the watch window of the PdfWriter object, it changes the "PDF Creator" in the PDF as it is not accessible by default:

private static void ReplacePDFCreator(PdfWriter writer)
    {
        Type writerType = writer.GetType();
        PropertyInfo writerProperty = writerType.GetProperties(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance).Where(p => p.PropertyType == typeof(PdfDocument)).FirstOrDefault();

        PdfDocument pd =  (PdfDocument)writerProperty.GetValue(writer);
        Type pdType = pd.GetType();
        FieldInfo infoProperty = pdType.GetFields(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance).Where(p => p.Name == "info").FirstOrDefault();
        PdfDocument.PdfInfo pdfInfo = (PdfDocument.PdfInfo)infoProperty.GetValue(pd);

        PdfString str = new PdfString("YOUR NEW PDF CREATOR HERE");
        pdfInfo.Remove(new PdfName("Producer"));
        pdfInfo.Put(new PdfName("Producer"), str);
    }

I got a suggestion from "@yannic-donot-text" and it is way much cleaner!:

private static void ReplacePDFCreator(PdfWriter writer)
    {
       writer.Info.Put(new PdfName("Producer"), new PdfString("YOUR NEW PDF CREATOR HERE"));
    }

I tought it was only archievable by reflection but I appreciate the collaboration of more educated persons :)

Thx!


 public void pdfproperties()
    {
        string inputFile = @"D:\1.pdf";
        string outputFile = @"D:\48.pdf";
        PdfReader reader = new PdfReader(inputFile);
        foreach (KeyValuePair<string, string> KV in reader.Info)
        {
            reader.Info.Remove(KV.Key);
        }
        using (FileStream FS = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using (Document Doc = new Document())
            {
                using (PdfCopy writer = new PdfCopy(Doc, FS))
                {
                    Doc.Open();
                    Doc.AddTitle("Add Title");
                    Doc.AddSubject("Add Subject");
                    Doc.AddKeywords("Add Keywords");
                    Doc.AddCreator("Application Creator");
                    Doc.AddAuthor("Add Author");
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        writer.AddPage(writer.GetImportedPage(reader, i));
                    }
                    writer.Info.Put(new PdfName("Producer"), new PdfString("Producer Name"));
                    Doc.Close();
                }
            }
        }
    }

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜