【レポート】C#でPDFを編集するには?(PDFSharp編)

C#

皆さん、こんにちは!
上越市を拠点にし、「FA設備・装置開発」と「画像処理」に強い会社、NSIです!
私達は豊富な経験と専門知識で、各種業界の自動化・システム化のお手伝いをしています。

今回は C#を使ってPDFを編集する方法 をまとめました。
PDFを結合・抽出したい!という方の参考になれば嬉しいです。

PDFとは?

PDFとは、Portable Document Formatの略で、Adobe Systems社が開発した電子文書フォーマットで、特定の環境に依存せずに表示できる のが特徴です。
PDFは、電子文書の配布や共有、印刷物の電子化など、様々な用途で利用されています。

活用事例を元にメリットを考える

本記事では、主にPDFの結合・抽出方法について説明していきます。
これらができるメリットとは何なのか、活用事例を元に考えてみました。

事例1. 報告書の統合(結合)

例えば、複数人の報告書をメールで送付する際、資料が個別になっていると1つずつ開く必要があり、確認が大変です。
PDFを結合することで、効率的に内容の確認が可能となります。

事例2. スキャン資料の抜粋(抽出)

例えば、ある別々の資料を誤って連続でスキャンしてしまった場合、別々にスキャンし直すのは手間となります。
PDFを抽出することで、スキャンし直す手間がなくなります。

事例3. マニュアルの作成(結合+抽出)

例えば、あるマニュアルを作成する際、資料Aから一部分だけ抽出し、それを資料Bと結合させたいという場合があったとします。
PDFの結合と抽出を組み合わせることで、複雑な編集も可能となります。

PDFを編集してみる:導入

それでは早速、PDFを編集する処理を作っていきましょう!
長くなりそうなので、今回は要点を絞って説明していきます。

C#でPDFを扱えるライブラリは「iTextSharp」「PDFSharp」「Spire.PDF」など、いくつか存在します。
今回はオープンソースの「PDFSharp」を使用します。こちらはMITライセンスであるため、商用利用も可能です。

べんぞうくん
べんぞうくん

MITライセンスを商用利用する場合、著作権の記載をお忘れなく!

まず、Windowsアプリケーション(.NET Framework)のプロジェクトを作成します。
NuGetパッケージマネージャーで「PDFSharp」と検索し、先頭に表示された項目をインストールします。
なお、バージョンは「1.50.5147」を選択しました。

補足:バージョンについて
バージョンは「6.0.0」が最新ですが、.NET Framework6.0が必要となります。
使用しているPCの環境に応じてバージョンを選択してください。

PDFを編集してみる:作成

続いて、画面と処理を作成していきます。

画面の作成

以下の画面を作成します。

No.コントロール名名前
ListBoxlistBox_結合
Buttonbutton_結合
Buttonbutton_結合実行
TextBoxtextBox_抽出
Buttonbutton_抽出
NumericUpDownnumericUpDown_開始ページ
NumericUpDownnumericUpDown_終了ページ
Buttonbutton_抽出実行

今回は必要最低限の機能ですが、対象のPDFの中身も閲覧できるとより使いやすくなりそうですね。
C#でPDFを表示させる方法は、こちらの記事をご覧ください。

処理の作成

複数のPDFを結合する処理を作成します。
「button_結合実行」のクリックイベントに以下の処理を追加します。

/// <summary>
/// 結合実行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_結合実行_Click(object sender, EventArgs e)
{
    // 結合先のPDFを作成
    PdfDocument dstPDF = new PdfDocument();

    // リストボックス内のPDF
    foreach(string pdf in listBox_結合.Items)
    {
        // PDFを開く
        PdfDocument srcPDF = PdfReader.Open(pdf, PdfDocumentOpenMode.Import);
        foreach(PdfPage page in srcPDF.Pages)
        {
            // 結合先のPDFに各ページを追加
            dstPDF.AddPage(page);
        }
    }
    // PDF保存
    dstPDF.Save($"{DateTime.Now.ToString("yyMMddHHmmss")}.pdf");
}

続いて、1つのPDFから指定したページ範囲を抽出する処理を作成します。
「button_抽出実行」のクリックイベントに以下の処理を追加します。

/// <summary>
/// 抽出実行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_抽出実行_Click(object sender, EventArgs e)
{
    // PDFを開く
    PdfDocument srcPDF = PdfReader.Open(textBox_抽出.Text, PdfDocumentOpenMode.Import);

    // 抽出先のPDFを作成
    PdfDocument dstPDF = new PdfDocument();

    // 抽出範囲
    int startPage = (int)numericUpDown_開始ページ.Value;
    int endPage = (int)numericUpDown_終了ページ.Value;

    // 指定範囲のページ
    for (int i = startPage; i <= endPage; i++)
    {
        // 抽出するページを取得
        PdfPage page = srcPDF.Pages[i - 1]; // Indexは0スタートなので-1

        // 抽出先のPDFにページを追加
        dstPDF.AddPage(page);
    }

    // PDF保存
    dstPDF.Save($"{DateTime.Now.ToString("yyMMddHHmmss")}.pdf");
}

後は、ファイル選択処理を作成すれば準備完了です。
ソースコードは省略しますが、ファイル選択ダイアログを表示 → 選択されたファイル名を画面にセット というような処理を作成します。注意点として、結合時は複数ファイル選択をできるようにする必要があるため、忘れないようにしてください。

PDFを編集してみる:実行

それでは早速、作成した処理を実行してみましょう!
今回は2つのPDFファイルを用意しました。

【テスト用PDF①.pdf】

【テスト用PDF②.pdf】

PDFの結合

ソフトを起動し、[…]ボタンから結合するPDFを選択します。
リストボックスにPDFのパスが追加されていることを確認し、[結合]をクリックします。

結合されたPDFは、exeと同じ階層に保存されています。

果たして結合できているのか…?

バッチリ結合できました!

PDFの抽出

ソフトを起動し、[…]ボタンから抽出するPDFを選択します。
テキストボックスにPDFのパスが追加されていることを確認後、抽出したいページ範囲を指定し、 [抽出]をクリックします。

保存先は結合と同様です。
果たして抽出できているのか…?

指定したページが抽出できました!

最後に

今回は C#でPDFを編集する方法 をご紹介しました。
ライブラリを使用することで、簡単にPDFの結合・抽出ができました。
PDFの編集は意外と使うので、ぜひ参考にしてみてください。

ここまで読んでいただき、ありがとうございました。
ご質問・ご要望・ご相談などは、下記お問い合わせフォームからお気軽にご連絡ください。
http://www.net-nsi.co.jp/toiawase.html

べんぞうくん
べんぞうくん

この記事が役に立ったらGoodボタンを押してね~

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