2011-09-11 29 views
6

Estoy desarrollando una aplicación y uso la biblioteca iTextSharp.Establecer metadatos en iTextSharp

También estoy leyendo el iText en acción de Manning para que pueda obtener referencias.

En el Capítulo 12 tiene el siguiente código para cambiar los metadatos en 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("Creator", "Silly standalone example"); 
info.put("Author", "Also Bruno Lowagie"); 
stamper.setMoreInfo(info); 
stamper.close(); 

¿Cómo puedo hacer lo mismo en C#?

Respuesta

11

La conversión de Java a C# suele ser bastante sencilla. Por convención, las propiedades de Java usan los prefijos get y set, por lo tanto, para convertir a C# solo necesita soltar el prefijo y convertirlo en una llamada .Net getter/setter. getInfo() se convierte en Info y setMoreInfo(info) se convierte en MoreInfo = info. Entonces solo necesita convertir los tipos de Java nativos a sus tipos de C# equivalentes. En este caso, Java FileOutputStream se convierte en .Net FileStream y HashMap<String, String> se convierte en Dictionary<String, String>.

Por último, he actualizado el código para reflejar los cambios recientes en iTextSharp que ahora (a partir de la versión 5.1.1.0) implementan ahora 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

Eso es. Muchas gracias por su respuesta :) –

7

acabo de hacer esto después de buscar el lugar correcto en la ventana del reloj del objeto PDFWriter, cambia el "PDF Creator" en el PDF ya que no es accesible por defecto:

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

tengo una sugerencia de "@ Yannic-donot-texto" y es forma mucho más clara !:

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

me listada fue sólo por la reflexión archievable pero aprecio la colaboración de las personas con mayor nivel educativo :)

Thx!

+0

Estoy tratando de reemplazar el PDF Producer con su enfoque de reflexión. No está funcionando para mí. ¿Funcionó para ti? – Karan

+0

Ya no tengo ese código fuente, pero en un proyecto similar he descargado la fuente de PdfSharp y he editado el "override void PrepareForSave()", como: if (info.Elements ["/ Creator"] == null) info.Creator = "Su texto aquí"; cadena str = info.Producer; if (str.Length == 0) str = "Su texto aquí"; else if (! Str.StartsWith ("Su texto aquí")) str = "PDFsharp 1.32.2608-g (www.pdfsharp.net) (Original:" + 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(); 
 
       } 
 
      } 
 
     } 
 
    }

Cuestiones relacionadas