1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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:

1
3
0

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
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?