サイトアイコン CAD日記

PDFアレコレにページ抽出機能を追加して独自アイコンも組み込んだ

PDFアレコレに念願のページ抽出機能を追加した。ページの操作っていうのはPDF編集においてキモだ。ページの回転を考慮した編集操作が必要だからけっこう苦労しちゃった。変更点は以下の通り。
Ver2.06 2020/4/29
・プログラムおよびフォームのアイコンを独自のものに差し替えた。
・ページ削除で最初のページを対象にしてもページずれが発生しないようにした。PDFiumによる処理の問題なのでiTextSharpの処理に変更。
・ページ抽出に対応した。
・ページ削除およびページ抽出においては、元PDFおよび編集結果のpdfでファイルのプロパティやセキュリティ情報を引き継げていない(今後の課題)
詳細はコチラ。

以下は、iTextSharpでページ操作をしている処理。

private void _pageDel(PdfReader reader, string temp, bool blAll, bool blDel, params int[] pages)
{
	using (FileStream fileStream = new FileStream(temp, FileMode.Create, FileAccess.Write, FileShare.None))  // 削除後PDFを作成する
	{
		using (Document document = new Document())
		{
			using (PdfWriter pdfWriter = PdfWriter.GetInstance(document, fileStream))
			{
				document.Open();  // 削除後PDFを開く
				for (int i = 1; i <= reader.NumberOfPages; i++)
				{
					bool judge = pages.Contains(i);
					if (!blAll)  // trueなら全ページを対象とする(抽出で元ファイルから削除しないときの動作)
					{
						if (blDel)  // trueなら指定ページ以外を抜き出す、falseなら指定ページを抜き出す
							judge = !judge;
					}
					else
						judge = true;
					if (judge)
					{
						int rotate = reader.GetPageRotation(i);
						float height = reader.GetPageSizeWithRotation(i).Height;
						float width = reader.GetPageSizeWithRotation(i).Width;
						document.SetPageSize(reader.GetPageSizeWithRotation(i));
						document.NewPage();
						PdfImportedPage page = pdfWriter.GetImportedPage(reader, i);
						if (rotate == 0)
							pdfWriter.DirectContent.AddTemplate(page, 1, 0, 0, 1, 0, 0);
						else if (rotate == 90)
							pdfWriter.DirectContent.AddTemplate(page, 0, -1, 1, 0, 0, height);
						else if (rotate == 180)
							pdfWriter.DirectContent.AddTemplate(page, -1, 0, 0, -1, width, height);
						else // if (rotate == 270)
							pdfWriter.DirectContent.AddTemplate(page, 0, 1, -1, 0, width, 0);
					}
				}
				document.Close();
			}
		}
	}
}

引数にあれこれ追加しちゃったのでわかりずらいが、以下のように呼び出せば、pagesで指定したページ番号配列が削除されたpdfファイルがtempという名前で作成される。

_pageDel(reader, temp, false, true, pages);

ページ削除以外に抽出をする必要もあったので、ページ番号配列だけを抜き出したpdfをつくる場合は以下のように呼び出せばよい。

_pageDel(reader, temp, false, false, pages);

ページ削除および抽出時に、プロパティやセキュリティを引き継げていないというのが課題。プロパティは容易だが、セキュリティはやっかい。そもそもセキュリティ操作を現時点で何もやっていないから。パスワード付きPDFの読み込み時に、パスワード入力させるくらいはやっておいたが、独自にいろんなセキュリティを付加する機能なんてのが今後は必要。パスワードを付ける、印刷を禁止する、コピペを禁止するとか。。

モバイルバージョンを終了