C#でPDFにしおりを追加するには?(iTextsharp)

C#

C#で既存のPDFファイルにしおりを追加したいときのサンプルを紹介します。iTextSharpを使用した方法です。

スポンサーリンク

サンプルコード

コードは以下のとおりです。

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;

private void AddBookmarksToExistingPDF()
{
    //出力PDFファイル名
    string srcPdfFilePath = @"test.pdf";
    string makePdfFilePath = @"test_out.pdf";
    Document pdfDocument = new Document();
    pdfDocument.Open();

    //FileStreamを作成
    FileStream fileStream = new FileStream(makePdfFilePath, FileMode.Create);

    //PDFをストリームにコピーする
    PdfCopy pdfCopy = new PdfCopy(pdfDocument, fileStream);
    var pdfReader = new PdfReader(srcPdfFilePath);
    pdfCopy.AddDocument(pdfReader);
    pdfReader.Close();

    //しおりのリストを作成
    List<Dictionary<string, object>> bookmarks = new List<Dictionary<string, object>>();

    // しおりアイテムを作成(※複数のしおりを追加する場合はここを繰り返します)
    Dictionary<string, object> bookmark = new Dictionary<string, object>();
    bookmark.Add("Title", "Sample");
    bookmark.Add("Action", "GoTo");
    bookmark.Add("Page", "1");
    bookmarks.Add(bookmark);//しおりのリストに追加

    //リストをしおりに設定する
    pdfCopy.Outlines = bookmarks;

    //新しいPDFファイルに書き出す
    pdfDocument.Close();
}

なお、iTextSharpのバージョンは5.5.13.1です。

スポンサーリンク

解説

全体の流れは以下のとおりです。

  1. まず、しおり1つに対し、1つのDictionaryをつくります。
  2. そして、このDictionaryにパラメーターを追加します。しおりのタイトルや移動先ページといったパラメータを追加します。
  3. 最後にListを作成し、Dictionaryを1つのListにまとめます。
  4. PDFCopyオブジェクトのOutlinesプロパティにListをsetします。
  5. ストリームをクローズすれば、しおりが追加されたPDFが出力されます。

Dictionaryには1つのしおりに対するパラメータを束ねます。1つのしおりに対して、1つのDictionaryができることになります。

最後に複数のDictionaryを1つのListにまとめて、iTextSharpに渡します。あとはiTextSharpが自動的にしおりを追加してくれます。

しおりに設定できるパラメータについて

しおりに設定できるパラメーターについては、Adobeが発行しているPDF標準仕様書に記載があります。

https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf

Action types
Actionで指定できるプロパティ
Destination Syntax
ページ番号とともに表示形式も指定できる。(Portable document format — Part 1: PDF 1.7 – Adobeより)

ページ番号のみならず、表示倍率やページ表示(幅に合わせるなど)もしおりに設定することができます。

まとめ

C#でPDFにしおりを追加する方法を紹介しました。

実際にこのコードを使って開発してみましたが、それほど苦労なく実装できました。DictionaryとListの関係性さえ理解できれば、かんたんでしょう。ぜひお試しあれ。

コメント

タイトルとURLをコピーしました