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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

PDFアレコレでPDF暗号化(セキュリティ設定)の第一歩を踏み出した

PDFアレコレをバージョンアップ。約2か月ぶり。 Ver3.01 2020/7/26 ・セキュリティ設定を変更できるようにした。読取パスワード、編集パスワード、編集許可の各種項目が設定可能。  暗号化 …

no image

WM_TIMER

MFCで時間を扱うための基本的なメッセージ。 プログラムの10年以上やってるけど、今まで必要なかった。 必要性を感じて調べたら、けっこうおもしれぇ。 データ変換に要している時間を、ダイアログボックス内 …

no image

プロパティシート

ソフト開発の話です。 私はVC6でソフトを作ってます。 ダイアログボックスの作りこみは、おもしろいものです。 プログラマーにとっては、デザイン的センスを問われる分野ですかね。 プロパティシートとは、ペ …

PDFアレコレはこんなところが落としどころかね

この3連休はPDFiumを使ったサンプルアプリ作成に取り組んでいて、まぁそこそこの感じにできあがったのでここらでいったん完成としておく。

no image

イテレータ(Iterator)

あるコンポーネントで初めて出会いました。コンポーネントがバージョンアップされたときに、オブジェクト指向的な作りに一新されて、いろいろ変わったのですが中でもイテレータという訳の分からないものに遭遇して、 …