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

関連記事

no image

ベクタープロレジ大賞

Vectorがやってる、もっとも人気のあったダウンロードソフトを決める賞です。 Vectorと言えば、フリーウェアやシェアウェアをダウンロードできるところで一番有名なところです。窓の杜というところもあ …

PDFium第2弾はPDFを画像化するWindowsフォームアプリケーションなり

「PDFium ViewerによるPDFレンダリングがイケてる」では、最低限のWindowsフォームアプリケーションを作ったわけだが、その第2弾は普通の人(非プログラマー)でも使えるPDFの画像変換ア …

zipcopyが設計上まちがっていることを書いたがホントにそうかを調べてみた

以下にzipcopy Ver1.07開発中に気付いたことを転記する。 いろいろ直していて気付いたんだけど、そもそものところでこのソフトの設計思想があやまっていた。 ネットワーク上のサーバーにあるファイ …

マルチスレッドプログラミング(VB.net編)

マルチスレッドプログラミング(C++編)に続き、今度はVB.net編を公開。マルチスレッドプログラミング(C#編)はこちら。

no image

メイリオが他のフォントとくらべて小さく表示される件

左側がMS Pゴシックで、右側がメイリオ。 高さを同じ80pixcelで書いているのに、メイリオは3割型小さくなる。 メイリオの場合、GetTextMetricsで取得できるtmInternalLea …