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でするだけでなくpng画像でもできるようにしたPDFアレコレを公開

昨日に引き続き今日もPDFアレコレをバージョンアップ。変更点は以下の通り。 Ver2.03 2020/3/22 ・捺印データとしてpng画像に対応した。 ・捺印時にマウスカーソルにプレビューデータを表 …

PDFファイルを扱うプログラミング用ライブラリ一覧

以下の記事がよく読まれているみたいなので、もっと幅広く「PDFファイルを扱うプログラミング用ライブラリ一覧」という本記事を書いてみる気になった。 iTextSharpのバージョンとライセンスが難しい …

特定サーバーにアクセスするためのIDと一致するものだけを許容するプログラムをつくるには(1)

Windowsで動作させるC#のプログラムの話で、特定サーバーにアクセスするためのIDと一致するものだけを許容するプログラムを作ろうとしていて、なかなか難航したのでその記録を残しておく。ようするに、I …

no image

マルチスレッド

ついに出来ました。 マルチスレッド技術を利用した画期的機能が。 って、そんな大したものではありません。 スレッド化技術は、この時代当たり前になりつつありますが、 なかなか難しそうで、手をつけてませんで …

no image

SE

妻に勧められて、この本を呼んでみました。 SEのフシギな生態―失敗談から学ぶ成功のための30ヶ条 作者: きたみ りゅうじ 出版社/メーカー: 幻冬舎 発売日: 2005/12 メディア: 文庫 一言 …