CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

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

投稿日:2020年4月29日 更新日:

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の読み込み時に、パスワード入力させるくらいはやっておいたが、独自にいろんなセキュリティを付加する機能なんてのが今後は必要。パスワードを付ける、印刷を禁止する、コピペを禁止するとか。。

-ソフト開発

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

コピー元でzip圧縮後にネットワーク越しにファイルコピーしてコピー先で解凍するのを自動化できないか

コピー元でzip圧縮後にネットワーク越しにファイルコピーしてコピー先で解凍するのを自動化できないか。。とここ数日考えていた。そんなことをしたい理由と要件をはっきりさせておく。 対象のファイルやフォルダ …

PDFアレコレをVer3としてリニューアルしたのは、GUI操作をちゃんできるようにしたかったからだ

PDFアレコレをVer3としてリニューアル。 Ver3.00 2020/5/24 ・起動画面をプレビュー画面(PDFの描画画面)に変更して、起動画面からすべての操作(画像変換・ページ編集・テキスト抽出 …

zipcopy Ver1.06リリース

zipcopyをリビジョンアップして、Ver1.06とした。 詳細は以下の通り。 Ver1.06 2020/2/24 ・ファイル削除時のタイムアウト(秒)を設定可能として、初期値を180秒(3分)とし …

データ暗号化レポート

【様々な暗号化方式】 共通鍵暗号方式と公開鍵暗号化方式の2種類がある。両者を組み合わせてハイブリット方式を用いる場合もある。 共通鍵は、暗号化と復号化で同じ鍵を使う。アルゴリズムがシンプルで素早く実行 …

no image

C#勉強中

Cから入ってC++になり、C#をやることになりました。時代はWebアプリケーションということなので。同じCという文字がついているので、まぁ同じようなもんでしょ、と楽観的観測でいたのですが...。初めて …