CAD日記

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

ソフト開発

PDFアレコレをバージョンアップ

投稿日:2019年10月14日 更新日:

1年ぶりにPDFアレコレをバージョンアップ。変更点は以下の通り。
Ver2.00 2019/10/13
・プレービューからのページ回転に対応。PDFiumのPDF編集能力は低いため、iTextSharpによるPDF編集の第一歩。PDF編集はこれからも機能拡張していくつもり。
・セーブにおいて、開いているファイルに対する上書き保存を可能とした。
・シングルページTIFFへの画像変換に対応した。
詳細はコチラ。

上でも少し触れたように、iTextSharpを組み込んだことが大きい。PDFiumにページを回転できそうなAPIがあったものの、使えないものだったので実装を断念していたのに対して、iTextSharpによるページ回転を実装。PDFのプレビューを見ながらページの回転(半時計回りに90度)できるフリーソフトはあんまないんじゃないかな。これもPDFiumの描画エンジンがあるからこそ。

iTextSharpはVer5.5.13.1を利用。Ver5系のライセンス規約では、ソースコードを公開しなければいけないらしいので、とりあえずiTextSharpの実装部分のみ公開しておく。今後、いい感じに仕上がってきたら、PDFium利用部を含めてPDFアレコレ全体のソースコードを公開する予定。

using iTextSharp.text;
using iTextSharp.text.pdf;
using System.Windows.Forms;

namespace PDFiumTest
{
	class ITSharp
	{
		Uty uty = new Uty();

		public ITSharp()
		{
		}
		public bool PageRotate(ref string file, int pno)
		{
			string temp = uty.GetTempPDFName();
			bool stat = true;
			PdfReader reader = new PdfReader(file);
			try
			{
				int pagesCount = reader.NumberOfPages;
				if (0 < pno && pno <= pagesCount)
				{
					PdfDictionary page = reader.GetPageN(pno);
					PdfNumber rotate = page.GetAsNumber(PdfName.ROTATE);
					int rotation = rotate == null ? 90 : (rotate.IntValue + 90) % 360;
					page.Put(PdfName.ROTATE, new PdfNumber(rotation));

					PdfStamper stamper = new PdfStamper(reader, new FileStream(temp, FileMode.Create));
					stamper.Close();
				}
				else
				{
					stat = false;
					MessageBox.Show("ページが範囲外");
				}
			}
			catch(PdfException ex)
			{
				stat = false;
				MessageBox.Show(string.Format("ページ回転に失敗({0})", ex.Message));
			}
			finally
			{
				reader.Close();
				if (stat)
				{
					uty.FileDelete(file);
					file = temp;
				}
			}
			return stat;
		}
	}
}

PDFiumとiTextSharpをつなぐのはテンポラリファイル。つまり、一度ファイルに保存してから行き来するってこと。iTextSharpのPDF編集は定評があるので、さらなる強化を図っていくつもり。また、PDFiumの描画まわりは、任意指定の拡大縮小をやってみたい。今はウインドウサイズに応じて拡大率が変わる仕様なので実用的でないから。

-ソフト開発

執筆者:


comment

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

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

関連記事

iTextSharpのバージョンとライセンスが難しい

iTextSharpがPDFを作るオープンソースであることはよく知られているが、そのバージョンとライセンスについてくわしく調べようとすると深みにはまる。 バージョンについて。 4系、5系、7系があって …

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

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

Pythonでプロポーショナルフォントかどうかをチェックする

PythonからWin32APIを呼び出すには、ライブラリpywin32を使う必要がある。 けっこうな数のWin32APIを使えるのはいいんだけど、使い方にくせがあってしかもネットに情報がないので、以 …

no image

環境変数TEMPトラブルについて振り返る

プログラムから環境変数TEMPで指定されたフォルダにファイルが作れないことがわかった時点で、この問題は解決したも同じだった。TEMPの値を「%USERPROFILE%\AppData\Local\Te …

no image

Breaker

以前、Layout Breakerという名前のソフトを作ろうと考えていました。レイアウトはともかく、ブレーカー、つまり破壊者です。周囲の反対により、取り下げましたが、個人的にはけっこう気に入っていて、 …