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