HOWTO · Csharp

C# で PDF ファイルを開く方法

C# で PDF を既定のビューアで開く方法やテキストを抽出する方法と、WinForms ビューアコントロールの評価方法を学びます。

このページの内容

Windows Forms アプリケーションで PDF を開くというのは、別のアプリケーションを起動すること、フォーム内にページをレンダリングすること、またはドキュメントのテキストを抽出することを意味します。UseShellExecute = true を指定した Process.Start() は、ファイルの関連付けを使うよう Windows に依頼します。ページを埋め込むことはしません。レンダリングには、特定のビューアコントロールとその文書化された WinForms API が必要です。この記事で利用できる製品とバージョンの情報では、完全な埋め込みワークフローとして示せるビューア API が特定できないため、ビューアのセクションでは、検証されていないセットアップや読み込みコードを提示するのではなく、何を確認すべきかを説明します。以下の PdfDocument と System.IO.Stream のセクションは、テキスト抽出のみを扱います。

Process.Start() メソッドを使用して C# で PDF ファイルを開く

UseShellExecute = true を指定した Process.Start() を使用して、ユーザーの関連付けられたアプリケーションで PDF を開きます。以下のパスはアプリケーションディレクトリを基準に構築されるため、プロセスの現在の作業ディレクトリに依存しません。report.pdf をアプリケーションの隣の Resources フォルダーに配置するか、OpenFileDialog で選択したパスを使用してください。Microsoft の Process.Start API リファレンス には、シェル実行について記載されています。

この独立した C# サンプルは、従来のパスを構築します。付属の実行結果が確認するのはファイル名のみです。PDF アプリケーションを起動したり、PDF が開くことを確認したりはしません。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string pdfPath = Path.Combine(AppContext.BaseDirectory, "Resources", "report.pdf");
        Console.WriteLine(Path.GetFileName(pdfPath));
    }
}

Output:

report.pdf

WinForms のボタンには、using System.Diagnostics;、using System.IO;、using System.Windows.Forms; を追加します。このハンドラーはファイルの選択を求め、関連付けられたアプリケーションを起動し、一般的なファイルまたはシェル起動の失敗を報告します: private void openPdfButton_Click(object sender, EventArgs e) { using (var dialog = new OpenFileDialog { Filter = "PDF files (*.pdf)|*.pdf|All files (*.*)|*.*" }) { if (dialog.ShowDialog(this) != DialogResult.OK) return; try { Process.Start(new ProcessStartInfo { FileName = dialog.FileName, UseShellExecute = true }); } catch (FileNotFoundException ex) { MessageBox.Show(this, ex.Message, "Could not open PDF"); } catch (System.ComponentModel.Win32Exception ex) { MessageBox.Show(this, ex.Message, "Could not open PDF"); } } }。呼び出しが成功すると外部アプリケーションが起動します。フォーム内に PDF ページが表示されるわけではありません。

DynamicPDF ビューアを使用して C# で PDF ファイルを開く

DynamicPDF という名前だけではビューアコントロールは特定できません。これは、さまざまな製品で使われている製品名です。付属のドキュメントでは、WinForms ビューア、インストール手順、ライセンス条件、PDF 読み込み API を備えた特定の DynamicPDF のエディションとバージョンは特定されていません。そのため、このセクションでは DynamicPDF のセットアップやコードの手順を示したり、DynamicPDF が見出しで求められている埋め込みワークフローを提供すると主張したりはしません。この名前の製品を採用する前に、正確なエディションとバージョンについてベンダーのドキュメントを探し、WinForms のサポート、ライセンス、ファイルの読み込み、ドキュメントの有効期間を確認してください。上記の Process.Start() ハンドラーは、外部起動の選択肢として利用できます。フォーム内にページをレンダリングすることはしません。

PdfDocument を使用して C# で PDF ファイルを開く

PdfDocument は .NET の組み込み型ではなく、そのコンストラクターとレンダリング動作は、それを定義するライブラリによって異なります。付属の製品ドキュメントでは特定の PdfDocument ビューア API が特定されていないため、このセクションではバイト配列からビューアへ渡すワークフローは示しません。以下の例は別のタスクです。iTextSharp 5.5.13.4 で PDF のバイトを読み取り、テキストを抽出します。ページをレンダリングすることはしません。

iTextSharp NuGet パッケージをバージョン 5.5.13.4 でインストールします。using System.IO;、using System.Text;、および2つの iTextSharp 名前空間をインポートしたうえで、byte[] pdfBytes = File.ReadAllBytes(path); var text = new StringBuilder(); using (var reader = new PdfReader(pdfBytes)) { for (int page = 1; page <= reader.NumberOfPages; page++) text.AppendLine(PdfTextExtractor.GetTextFromPage(reader, page)); } を使って選択した PDF パスを読み取ります。ここで path は選択した PDF ファイル名です。PdfReader は解析されたドキュメントを所有し、ループの後に破棄されます。バージョン付きの iTextSharp 5 .NET API リファレンス には、リーダーと抽出の API が記載されています。これらのバイトを WinForms コントロールでレンダリングするには、正確なバージョンでバイト配列の読み込みとページのレンダリングが文書化されているライブラリを使用してください。PdfReader をビューアとして扱わないでください。

System.IO.Stream インスタンスを使用して C# で PDF ファイルを開く

System.IO.Stream はライブラリにバイトを供給します。ストリーム自体が PDF ページを表示することはありません。次の iTextSharp 5.5.13.4 の操作は、メモリ内の PDF からテキストを抽出するもので、レンダリングはしません。using System.IO;、using System.Text;、および iTextSharp の名前空間が必要です: var text = new StringBuilder(); using (var stream = new MemoryStream(pdfBytes, writable: false)) { using (var reader = new PdfReader(stream)) { reader.CloseStream = false; for (int page = 1; page <= reader.NumberOfPages; page++) text.AppendLine(PdfTextExtractor.GetTextFromPage(reader, page)); } }。pdfBytes には PDF データが含まれています。リーダーが先に破棄されます。CloseStream = false によりストリームは所有者のために開いたままになり、外側の using がその後でそれを破棄します。ストリームは、リーダーに渡す時点で読み取り可能で先頭に位置している必要があります。バージョン付きの iTextSharp 5 .NET API リファレンス には、ストリーム入力について記載されています。これはテキスト抽出であり、埋め込みビューアのワークフローではありません。ビューアのストリーム読み込みと所有権のルールは、そのビューア自身のバージョン付きドキュメントに基づかなければなりません。

iTextSharp NuGet パッケージを使用して C# で PDF ファイルを開く

この iTextSharp 5.5.13.4 のワークフローは、WinForms の RichTextBox にテキストを抽出します。PDF ページを表示することはしません。iTextSharp NuGet パッケージをバージョン 5.5.13.4 でインストールし、textBox1 という名前の RichTextBox をフォームに配置して、iTextSharp.text.pdf、iTextSharp.text.pdf.parser、System.Text をインポートします。dialog.FileName に選択したパスがある場合、中心となる操作は var text = new StringBuilder(); using (var reader = new PdfReader(dialog.FileName)) { for (int page = 1; page <= reader.NumberOfPages; page++) text.AppendLine(PdfTextExtractor.GetTextFromPage(reader, page)); } textBox1.Text = text.ToString(); です。バージョン付きの iTextSharp 5 .NET API リファレンス には、これらのリーダーと抽出の API が記載されています。パッケージを選ぶ際には、iText の AGPLv3 ライセンス情報 を確認してください。

PdfReader はページループの後に破棄されます。メモリ内のドキュメントには、文書化されているバイト配列コンストラクターを使用してください。パスワードで保護されたファイルには、同じバージョンでサポートされているパスワードオーバーロードを使用し、パスワードはユーザーから取得してください。抽出されたテキストは、ページのレイアウト、フォント、画像、注釈を保持しません。これはコンテンツを読むためのアプローチであり、ビューアコントロールではありません。

ツールボックスの PdfViewer を使用して C# で PDF ファイルを開く

PdfViewer は製品固有のコントロール名であり、共通の読み込みメソッドを持つ標準の WinForms コンポーネントではありません。付属のドキュメントではベンダーのエディションとバージョンは示されておらず、WinForms での利用可否、ツールボックスへのインストール、ライセンス、PDF の読み込み、ドキュメントとストリームの有効期間について、ベンダーの直接のガイダンスも提供されていません。そのため、このセクションではツールボックスの手順を検証済みのものとして提示したり、利用可能な埋め込みビューアのワークフローを提供したりはしません。実際の WinForms ビューアについては、文書化された製品バージョンを選び、そのベンダーの指示に従ってコントロールを追加し、ファイルまたはサポートされる入力を読み込み、その所有権ルールに従ってドキュメントまたはストリームを破棄してください。上記の外部の Process.Start() の選択肢は、関連付けられた別のアプリケーションを開きます。埋め込み PdfViewer ではありません。