Set Metadata in iTextSharp

你说的曾经没有我的故事 提交于 2019-11-29 07:15:13

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();
                }
            }
        }
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!