人気ブログランキング | 話題のタグを見る

iTextSharpでPDFの文書プロパティを書き換える

 仕事で大量のドキュメントをPDFで集めたのはいいのだが、どいつもこいつも文書タイトルや作者名の文書のプロパティを埋めてきやがらない。
 これじゃあ、後で検索するときに困るだろうが。ちゃんと指示書に書いといたのに、まったく最近の若い奴ときたら…と、ジジイの繰言は置いておくとして、さて、どうしよう?と困ってしまった。

 いくらなんでも一件一件Acrobatで設定つーのはかっちょ悪いではないか。
 そんなくだらない作業に時間を費やしているほど、先行き長い人生でも無いし

 もちろん愛用のpdftkなど、既存ツールでもいいのだが、ちょっとプログラム的に操作したいようなこともあるので、簡単なツールを作ることにした。

 先だって、Javaで、FOPの代替としてiTextを使ったプログラムを作ったばかりだったので、iTextならできるだろうと判っちゃいたのだが、生来Javaという言語がキラいだし(笑)、同じことをやってもあまり面白くないので、iTextのC#へのポーティングであるiTextSharpを使ってみることにした。

 iTextSharpに関してはCodeZine:iTextSharpを利用して.NETでPDF帳票を出力するなどに詳しい。PDFを作成したいのならこのあたりの記事を読めばよろしかろう。俺的にはプロパティを変えたいだけなのでもっと簡単。

iTextSharpをしかるべく配置し、概略こんな感じで文書プロパティは読み出せた。
using iTextSharp.text;
using iTextSharp.text.pdf;



string ReadFile; // 読み出すファイル名(パス名)

PdfReader reader = new PdfReader(ReadFile); // パスワード付だとここで例外を吐くので対処要

infoTitle = (string)reader.Info["Title"];

 文書プロパティを保持してくれるreader.Infoはリストなので、全部読み出したいのなら

foreach (string infostr in reader.Info.Keys) {
… infostrに対する処理
みたいにすればよかろう。俺的には変えたいトコは決め打ちなんで reader.Info["Title"] みたいにダイレクトに指定してる。

で、問題は書き換えである。
いちおう別ファイルとして出力しておこうか。バグってると困るしな(笑)
当初ストリーム作ってコピって…みたいな操作が必要かと思ったのだが、マニュアル読んだらPdfStamperつー便利なものがあるではないか。
// 拡張子を変える
newFile = Path.ChangeExtension(ReadFile, ".FDF");

// PdfStamperを作成。
PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create));

// 一時格納用のハッシュテーブル。
Hashtable info = new Hashtable();

// ハッシュに値を設定する
info["Title"] = "超極秘文書 マジェスティック12";
info["Author"] = "少年密偵 禿田正太郎";

// Stamperにハッシュテーブルの内容を入れて
stamper.MoreInfo = info;

// Stamperを閉じればア~ラ不思議ファイルの出来上がり
stamper.FormFlattening = true;
stamper.Close();
 iTextSharpは、オリジナルと比べるとまだ多少「こなれて」いない印象だが、C#からは使いやすい。今後が楽しみなソフトである。
by SIGNAL-9 | 2006-12-28 11:17 | TIPSとかKludgeとか
<< 安価な3Dスキャナーを自作する方法 メモ:プロキシ自動構成PACフ... >>