2011-09-11 4 views
6

में मेटाडाटा सेट करें मैं एक एप्लिकेशन विकसित कर रहा हूं और मैं iTextSharp लाइब्रेरी का उपयोग करता हूं।iTextSharp

मैं मैनिंग से कार्रवाई में iText भी पढ़ रहा हूं इसलिए मुझे संदर्भ मिल सकते हैं।

अध्याय 12 में जावा में मेटाडेटा बदलने के लिए निम्न कोड है।

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

मैं सी # में ऐसा कैसे कर सकता हूं?

उत्तर

11

जावा से सी # में रूपांतरण आमतौर पर बहुत सरल है। सम्मेलन के अनुसार, जावा गुण get और set उपसर्गों का उपयोग करते हैं ताकि सी # में कनवर्ट किया जा सके, आपको केवल उपसर्ग ड्रॉप करने और उसे नेट गेटर/सेटर कॉल में बदलने की आवश्यकता है। getInfo()Info और setMoreInfo(info)MoreInfo = info बन जाता है। फिर आपको मूल जावा प्रकारों को उनके समकक्ष सी # प्रकारों में परिवर्तित करने की आवश्यकता है। इस मामले में जावा FileOutputStream एक .Net FileStream बन जाता है और HashMap<String, String>Dictionary<String, String> बन जाता है।

आखिरकार, मैंने iTextSharp में हालिया परिवर्तनों को दर्शाने के लिए कोड अपडेट किया है जो अब (5.1.1.0 के रूप में) 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

है। आपके उत्तर के लिए बहुत बहुत धन्यवाद :) –

7

मैं सिर्फ PdfWriter वस्तु की घड़ी विंडो में सही जगह खोज करने के बाद यह एक बना दिया, यह "पीडीएफ निर्माता" पीडीएफ में बदल जाता है के रूप में यह डिफ़ॉल्ट रूप से सुलभ नहीं है:

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

मैं "@ yannic-donot-पाठ" से एक सुझाव मिला है और यह तरीका अधिक स्वच्छ !:

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

मैं tought यह केवल प्रतिबिंब द्वारा archievable था है, लेकिन मैं अधिक शिक्षित व्यक्तियों के सहयोग की सराहना करते हैं :)

Thx!

+0

मैं आपके प्रतिबिंब दृष्टिकोण के साथ पीडीएफ निर्माता को बदलने की कोशिश कर रहा हूं। यह मेरे लिए काम नहीं कर रहा है। क्या यह आपके काम आया। – Karan

+0

मेरे पास अब उस स्रोत कोड नहीं है, लेकिन इसी तरह की प्रोजेक्ट पर मैंने पीडीएफशर्प के स्रोत को डाउनलोड किया है और "ओवरराइड शून्य तैयार करें फॉरसेव()" संपादित किया है, जैसे: if (info.Elements ["/ Creator"] == null) जानकारी। निर्माता = "आपका पाठ यहां"; स्ट्रिंग str = info.Producer; यदि (str.Length == 0) str = "आपका टेक्स्ट यहां"; और यदि (! Str.StartsWith ("आपका टेक्स्ट यहाँ")) str = "पीडीएफशर्प 1.32.2608-जी (www.pdfsharp.net) (मूल:" + 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(); 
 
       } 
 
      } 
 
     } 
 
    }

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^