C#でiText7を使う
C#でiText7を使ってPDFファイルのページ分割と結合をやってみました。
巷ではiTextSharpの情報は見かけるのですが、JavaではなくC#のiText7の記事が少ないと思い書いてみました。
iText7はiTextSharpの後継版で、.NET6と組み合わせればMacでも使えます。
嬉しいなあ、クロスプラットフォーム
動作確認は、
で行いました。
ページの分割
以下、ちょっと難のあるサンプルですが、使い方の理解を目的に書いてみました。
まず、9ページのパスワード無しのPDFファイルを用意します。それを適当なディレクトリに置いてください。ここではホームーディレクトリに置くことにしました。
Macで試したのでファイルパスはMac用です。Windowsでもファイルパスを適切に書き換えれば問題なく動作します。
1〜3ページ、4〜7ページ、8〜9ページ、と3つのPDFファイルに分割を行います。
元ファイルのhoge.pdf
は、hoge1.pdf
、hoge2.pdf
、hoge3.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);
}
読み込み用PdfDocument
のCopyPagesTo
メソッドで、書き込み用PdfDocument
にコピーを行います。
CopyPagesTo メソッド
PDFファイルのコピーを作ります。
- 第一引数 コピーしたい最初のページ番号
- 第二引数 コピーしたい最後のページ番号
-
第三引数 書き込み用
PdfDocument
クラス(コピー先のPDFファイル)
最後に、読み込み用としていたコピー元ファイルを削除します。
ページの結合
結合も基本的に分割と同様です。読み込み用PdfDocument
の全てのページを書き込み用PdfDocument
にコピーするだけです。書き込みの際、書き込み用PdfDocument
に既にページがあれば、後ろに追加されます。
先ほどの分割メソッドで作られた3つのファイル、hoge1.pdf
、hoge2.pdf
、hoge3.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つに戻ったりします。
(しょーもな)
本当に限定的な状況下でのサンプルコードですが、目的に合わせて書き換えれば、色々と活用できると思います