LoginSignup
1

C#でiText7を使ってPDFファイルのページ分割・結合をする

Last updated at Posted at 2023-04-03

C#でiText7を使う

C#でiText7を使ってPDFファイルのページ分割と結合をやってみました。
巷ではiTextSharpの情報は見かけるのですが、JavaではなくC#のiText7の記事が少ないと思い書いてみました。

iText7はiTextSharpの後継版で、.NET6と組み合わせればMacでも使えます。
嬉しいなあ、クロスプラットフォーム:bangbang:

動作確認は、

  • macOS Ventura 13.2
  • .NET6
  • Visual Studio for Mac 17.5 Preview
  • iText7 7.2.5
    スクリーンショット 2023-04-03 22.52.41.png

で行いました。

ページの分割

以下、ちょっと難のあるサンプルですが、使い方の理解を目的に書いてみました。
まず、9ページのパスワード無しのPDFファイルを用意します。それを適当なディレクトリに置いてください。ここではホームーディレクトリに置くことにしました。

Macで試したのでファイルパスはMac用です。Windowsでもファイルパスを適切に書き換えれば問題なく動作します。
1〜3ページ、4〜7ページ、8〜9ページ、と3つのPDFファイルに分割を行います。
元ファイルのhoge.pdfは、hoge1.pdfhoge2.pdfhoge3.pdfに分割されます。

using iText.Kernel.Pdf;

public void SplitPdfPages() // ページ分割
{
    string sourcePdfPath = "/Users/mackohei/hoge.pdf";
    using PdfReader pdfReader = new(sourcePdfPath);
    using PdfDocument srcPdfDoc = new(pdfReader);
    int i = 1;
    int firstPage = 1;
    int[] lastPages = { 3, 7, 9 };
    foreach (int lastPage in lastPages)
    {
        string destPdfPath = "/Users/mackohei/hoge" + i.ToString() + ".pdf";
        using PdfWriter pdfWriter = new(destPdfPath);
        using PdfDocument destPdfDoc = new(pdfWriter);
        srcPdfDoc.CopyPagesTo(firstPage, lastPage, destPdfDoc);
        firstPage = lastPage + 1;
        i++;
    }
    File.Delete(sourcePdfPath);
}

読み込み用PdfDocumentCopyPagesToメソッドで、書き込み用PdfDocumentにコピーを行います。

CopyPagesTo メソッド

PDFファイルのコピーを作ります。

  • 第一引数 コピーしたい最初のページ番号
  • 第二引数 コピーしたい最後のページ番号
  • 第三引数 書き込み用PdfDocumentクラス(コピー先のPDFファイル)

最後に、読み込み用としていたコピー元ファイルを削除します。

ページの結合

結合も基本的に分割と同様です。読み込み用PdfDocumentの全てのページを書き込み用PdfDocumentにコピーするだけです。書き込みの際、書き込み用PdfDocumentに既にページがあれば、後ろに追加されます。
先ほどの分割メソッドで作られた3つのファイル、hoge1.pdfhoge2.pdfhoge3.pdfは、この結合メソッドを実行することでhoge.pdfに結合されます。

public void MergePdfPages() // ページ結合
{
    string destPdfPath = "/Users/mackohei/hoge.pdf";
    using PdfWriter pdfWriter = new(destPdfPath);
    using PdfDocument destPdfDoc = new(pdfWriter);
    for(int i = 1; i <= 3; i++)
    {
        string sourcePdfPath = "/Users/mackohei/hoge" + i.ToString() + ".pdf";
        using (PdfReader pdfReader = new(sourcePdfPath))
        using (PdfDocument srcPdfDoc = new(pdfReader))
        {
            srcPdfDoc.CopyPagesTo(1, srcPdfDoc.GetNumberOfPages(), destPdfDoc);
        }
        File.Delete(sourcePdfPath);
    }
}

二つのメソッドを交互に繰り返し実行すると、ファイルが3つに分かれたり1つに戻ったりします。
(しょーもな:sweat_smile:

本当に限定的な状況下でのサンプルコードですが、目的に合わせて書き換えれば、色々と活用できると思います:rocket:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1