2011-09-11 17 views
6

Pracuję nad aplikacją i korzystam z biblioteki iTextSharp.Ustawianie metadanych w iTextSharp

Jestem również czytanie iText w akcji z Manning, więc mogę uzyskać odniesienia.

W rozdziale 12 ma następujący kod, aby zmienić metadane w Javie.

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("Creator", "Silly standalone example"); 
info.put("Author", "Also Bruno Lowagie"); 
stamper.setMoreInfo(info); 
stamper.close(); 

Jak mogę zrobić to samo w języku C#?

Odpowiedz

11

Konwersja z Java do C# jest zwykle dość prosta. Zgodnie z konwencją, właściwości Java używają prefiksów get i set, więc aby przekonwertować do C# wystarczy upuścić prefiks i przekształcić go w wywołanie getter/setter .NET. getInfo() staje się Info i setMoreInfo(info) staje się MoreInfo = info. Następnie wystarczy przekonwertować rodzime typy Java na odpowiadające im typy C#. W tym przypadku Java FileOutputStream staje się .Net FileStream, a HashMap<String, String> staje się Dictionary<String, String>.

Na koniec zaktualizowałem kod, aby odzwierciedlić ostatnie zmiany w iTextSharp, które teraz (od wersji 5.1.1.0) implementują teraz: IDisposable.

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(); 
     } 
    } 
} 
+1

to jest. Bardzo dziękuję za odpowiedź :) –

7

Zrobiłem ten jeden po wyszukaniu odpowiedniego miejsca w oknie zegarka obiektu PdfWriter, zmienia „PDF Creator” w formacie PDF, ponieważ nie jest dostępna domyślnie:

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); 
    } 

dostałem propozycję z „@ Yannic-dawca tekstu” i jest to sposób znacznie czystsze !:

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

i nauczyła było archievable tylko przez odbicie, ale cenię sobie współpracę osób bardziej wykształconych :)

Thx!

+0

Próbuję zastąpić producenta PDF twoim podejściem do refleksji. To nie działa dla mnie. Czy to działa dla ciebie. – Karan

+0

Nie mam już tego kodu źródłowego, ale na podobnym projekcie pobrałem źródło PdfSharp i edytowałem "nadpisuję void PrepareForSave()", jak: if (info.Elements ["/ Creator"] == null) info.Creator = "Twój tekst tutaj"; string str = info.Producer; if (str.Length == 0) str = "Twój tekst tutaj"; else if (! Str.StartsWith ("Twój tekst tutaj")) str = "PDFsharp 1.32.2608-g (www.pdfsharp.net) (Oryginał:" + str + ")"; – coloboxp

0

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(); 
 
       } 
 
      } 
 
     } 
 
    }