Web 上で多ページの PDF を配信する際、ユーザーがファイル全体をダウンロードし終えるまで最初のページすら表示されない、という問題に遭遇したことはないだろうか。特にページ数の多い技術資料やカタログでは、この待ち時間がユーザーの閲覧離脱につながり得る。
この問題への技術的な対処法の一つが「線形化 PDF(Linearized PDF)」である。線形化 PDF は別名「Fast Web View」とも呼ばれ、PDF ファイルの内部構造を Web 配信向けに再配置した形式である。通常の PDF ではファイル末尾に配置される相互参照テーブルが、線形化 PDF ではファイル先頭に配置される。これにより PDF ビューアはファイル全体をダウンロードする前に最初のページの描画情報を取得でき、段階的な表示が可能になる。
本記事では、C# で Spire.PDF for .NET を使用して既存の PDF を線形化 PDF に変換する手順を解説する。
環境準備
Spire.PDF for .NET は NuGet パッケージとして提供されている。Visual Studio のパッケージマネージャーコンソール、または .NET CLI からインストールできる。
# Package Manager Console
PM> Install-Package Spire.PDF
# .NET CLI
dotnet add package Spire.PDF
なお、Free Spire.PDF for .NET は商用利用も可能だが、処理できる PDF のページ数に制限(10 ページまで)がある。それ以上のページ数を扱う場合は商用ライセンスの確認が必要となる点に留意されたい。
PDF を線形化するコード
Spire.PDF for .NET で線形化 PDF への変換を行う場合、PdfToLinearizedPdfConverter クラスを使用する。このクラスは Spire.Pdf.Conversion 名前空間に含まれている。
以下が基本的な変換コードである。
using Spire.Pdf.Conversion;
namespace ConvertPdfToLinearized
{
class Program
{
static void Main(string[] args)
{
// 対象のPDFファイルを読み込む
PdfToLinearizedPdfConverter converter = new PdfToLinearizedPdfConverter(@"Sample.pdf");
// 線形化PDFとして保存
converter.ToLinearizedPdf("Linearized.pdf");
}
}
}
処理の流れはシンプルである。まず PdfToLinearizedPdfConverter のコンストラクタに変換元の PDF ファイルパスを渡してインスタンスを生成する。次に ToLinearizedPdf() メソッドを呼び出し、引数に出力先のファイルパスを指定する。この 2 ステップのみで線形化 PDF が生成される。
変換結果の確認方法
生成された PDF が実際に線形化されているかどうかは、Adobe Acrobat または Acrobat Reader で確認できる。ファイルを開いた後、「ファイル」メニューから「プロパティ」を選択し(または Ctrl+D / Cmd+D)、「概要」タブを確認する。「Fast Web View」という項目が「はい」と表示されていれば、そのファイルは線形化されている。
プログラム上で確認したい場合は、生成された PDF ファイルの先頭数百バイトをテキストエディタで開き、/Linearized というキーを含む辞書が存在するかどうかを調べる方法もある。
線形化の仕組みと効果
線形化 PDF の効果を理解するには、その内部構造の違いを押さえておくとよい。
通常の PDF ファイルでは、ページの描画に必要なオブジェクト群の後に、ファイル全体の構造を示す相互参照テーブルが末尾に配置される。PDF ビューアはこのテーブルを参照して各オブジェクトの位置を特定するため、ファイル全体をダウンロードするまで最初のページすら表示できない。
線形化 PDF では、ファイルの先頭に「Linearization Dictionary」と「Hint Tables」が配置される。Hint Tables には、各ページのオブジェクトがファイル内のどのバイト範囲に存在するかという情報が格納されている。Web サーバーが HTTP の Range リクエスト(バイト範囲指定)に対応していれば、PDF ビューアは Hint Tables を参照して、表示したいページに必要なバイト範囲だけをサーバーに要求できる。結果として、最初のページを素早く表示でき、ユーザーが後半のページに移動した場合も、必要なデータのみを追加で取得できる。
なお、線形化によるファイルサイズの増加はごくわずかである。Hint Tables や Linearization Dictionary の追加分は通常 1 KB 未満であり、それ以外のデータは順序が変わるだけで内容自体は同じである。
注意点
無料版のページ数制限:前述の通り、Free Spire.PDF for .NET は 10 ページまでの PDF にしか対応していない。11 ページ以上のドキュメントを処理する必要がある場合は、商用ライセンスの購入を検討する必要がある。
暗号化 PDF の扱い:パスワードで保護された PDF の場合、変換前に復号処理が必要となる。Spire.PDF には暗号化 PDF を扱うための API も用意されているが、本記事の範囲では割愛する。
変換元ファイルの形式:PdfToLinearizedPdfConverter は PDF ファイルを入力として想定している。ストリームやバイト配列からの変換が必要な場合は、API ドキュメントで対応するオーバーロードを確認されたい。
まとめ
本記事では、Spire.PDF for .NET の PdfToLinearizedPdfConverter クラスを使用して、既存の PDF を線形化 PDF に変換する手順を示した。コードは 2 ステップのみで完結し、特別な設定は不要である。
線形化 PDF は、特に Web 経由で大きな PDF を配信する際に有効な最適化手法である。ユーザーが最初のページを素早く閲覧できるようになることで、ドキュメントの閲覧体験が改善される。既存の PDF 配信パイプラインに線形化処理を組み込むことを検討する価値は十分にあるだろう。