Set Metadata in iTextSharp

后端 未结 3 1516
说谎
说谎 2020-12-18 03:28

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

相关标签:
3条回答
  • 2020-12-18 03:49

    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();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-18 03:49

     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 讨论(0)
  • 2020-12-18 03:51

    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!

    0 讨论(0)
提交回复
热议问题