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つのDictionaryをつくります。
- そして、このDictionaryにパラメーターを追加します。しおりのタイトルや移動先ページといったパラメータを追加します。
- 最後にListを作成し、Dictionaryを1つのListにまとめます。
- PDFCopyオブジェクトのOutlinesプロパティにListをsetします。
- ストリームをクローズすれば、しおりが追加された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
ページ番号のみならず、表示倍率やページ表示(幅に合わせるなど)もしおりに設定することができます。
まとめ
C#でPDFにしおりを追加する方法を紹介しました。
実際にこのコードを使って開発してみましたが、それほど苦労なく実装できました。DictionaryとListの関係性さえ理解できれば、かんたんでしょう。ぜひお試しあれ。
コメント