PDFのメタデータの取得(C#)
はじめに
PDFファイルに保存されているメタデータ内には、作成者名が含まれており、不用意に配布すると個人名の流出となりそうです。PDFファイルにどういった情報が保存されているのかを調査しつつ、閲覧するソフトを作ってみました。
有料版のAdobe、Acrobatを使用すれば、簡単に確認できますが、せっかくだし実装です。
環境
Windows11 Pro
VisualStudio 2022
使用言語 C#
Adobe Acrobatでの確認方法
PDFファイルを開いて、左上の「メニュー」から「文書のプロパティ」を選択で確認できます。
せいぜい個人名程度で、気にすることないかなと思いつつ、せっかくなのでソフト作ってみます。
ライブラリ
PDF関連のライブラリとしては、
- itext
- Aspose
- pdfSharpCore
の3つがありました。他にもありましたけど、とりあえず。
itext/Asposeはどちらも有料の様ですので、ご使用には注意下さい。
Asposeでの実装
Asposeは非常に簡単に実装出来ました。
VisualStudioで新しいプロジェクトの作成より、コンソールアプリを選択して下さい。
Nugetで以下をインストールしてください。
var pdfFile = Path.Combine(filePath);
var pdfDocument = new Aspose.Pdf.Document(pdfFile);
var docInfo = pdfDocument.Info;
foreach (var n in docInfo)
{
Console.WriteLine($"{n.Key},{n.Value}");
}
Asposeは有料であり、Nugetからのダウンロードは試用版との事です。
iTextでの実装
せっかくなので、ドラッグ&ドロップ操作に対応したものを作りたいと思い、以下はWPFで実装しました。
VisualStudioで、新しいプロジェクトの作成より、WPFアプリケーションを選択してください。
Nugetで以下をインストールしてください。
Nugetには、「itext」もありますが、こちらは、暗号化されたPDFに対応していないとかの様で、新しい方が良いです。
var pdf = File.ReadAllBytes(filePath);
using var inputStream = new MemoryStream(pdf);
using var reader = new PdfReader(inputStream);
using (var document = new PdfDocument(reader))
{
// PDFのメタデータを読み取る
var docInfo = document.GetDocumentInfo();
if (docInfo != null)
{
var a = docInfo.GetMoreInfo("map");
sb.AppendLine("PDFメタデータ:");
sb.AppendLine($"タイトル: {docInfo.GetTitle() ?? "-"}");
sb.AppendLine($"著者: {docInfo.GetAuthor() ?? "-"}");
sb.AppendLine($"クリエイター: {docInfo.GetCreator() ?? "-"}");
sb.AppendLine($"サブジェクト: {docInfo.GetSubject() ?? "-"}");
sb.AppendLine($"キーワード: {docInfo.GetKeywords() ?? "-"}");
sb.AppendLine($"プロデューサー: {docInfo.GetProducer() ?? "-"}");
sb.AppendLine($"とラッピング情報: {docInfo.GetTrapped()}");
sb.AppendLine($"ページ数: {document.GetNumberOfPages()}");
sb.AppendLine($"PDFバージョン: {document.GetPdfVersion()}");
}
}
なぜか日付情報の「CreationDate」「ModDate」が取得できないんですよ。
pdfSharpCoreでの実装
こちらもWPFで実装です。
Nugetから以下をインストール下さい
実装は以下です。非常にシンプルですね。
PdfDocument document = PdfReader.Open(filePath, PdfDocumentOpenMode.ReadOnly);
foreach(var n in document.Info)
{
sb.AppendLine($"{n.Key}: {n.Value}");
}
こちらは、2byte文字を表示するときに、コード表示になっちゃいます。
n.ValueがpdfString型とやらで、toString()で文字列に変換するとダメ見たいです。
Discussion