2011-09-11 18 views
6

私はアプリケーションを開発しており、iTextSharpライブラリを使用しています。メタデータをiTextSharpで設定する

私はまた、マニングから実際にiTextを読んでいるので、私は参考文献を得ることができます。

第12章では、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#で同じことができますか?

答えて

11

JavaからC#への変換は、通常かなり簡単です。規約では、Javaプロパティはgetsetという接頭辞を使用しているため、C#に変換するには接頭辞を削除して.Net getter/setter呼び出しにするだけです。 getInfo()Infoとなり、setMoreInfo(info)MoreInfo = infoとなる。次に、ネイティブのJava型を同等のC#型に変換するだけです。この場合、Java 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のオブジェクトのウォッチウィンドウで適切な場所を検索した後、このいずれかを作っそれは、デフォルトではアクセスできないように、それはPDFで、「PDFファイル作成」を変更します。

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

!:クリーナー、私はそれが反射することによってのみarchievableだった取り払わですが、私はより多くの教育を受けた人のコラボレーションに感謝します:)

Thx!ある

+0

私はあなたの反射のアプローチでPDFプロデューサを交換しようとしています。それは私のために働いていません。それはあなたのために働いたのですか? – Karan

+0

私はもうソースコードを持っていませんが、同様のプロジェクトでPdfSharpのソースをダウンロードし、 "override void PrepareForSave()"を編集しました:if(info.Elements ["/ Creator"] == null ) info.Creator = "ここにあなたのテキスト"; 文字列str = info.Producer; if(str.Length == 0) str = "ここにあなたの文章"; else if(!str.StartsWith( "ここにあなたの文章")) str = "PDFsharp 1.32.2608-g(原文:" + 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(); 
 
       } 
 
      } 
 
     } 
 
    }

関連する問題