CAD日記

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

ソフト開発

PDFアレコレにパスワード入力と情報表示を追加

投稿日:2018年9月23日 更新日:

オープン時のパスワードが設定されているPDFでパスワード入力できるようにしたのと、タイトルや作成者の情報を確認できるようにした版はこちら。
PDFアレコレ紹介ページ

パスワードについては、こんなダイアログを出すようにした。

パスワードなしでLoadさせようとしたときの例外エラーの内容が「パスワードで守られている」であった場合に、パスワード入力フォームを出して、パスワードを渡すLoad関数を呼び出してやるようにした。パスワードを間違ったら何度も試したいだろうということで、whileループでずっと続けるようにしつつ、パスワード入力をキャンセルしたらループを抜ける。ファイルオープン時の主要コードを抜き出してみる。

try
{
    m_pdfDoc = PdfDocument.Load(src);
}
catch (PdfException ex)
{
    if (ex.Error == PdfError.PasswordProtected)
    {
        while (true)
        {
            using (Form3 f = new Form3())
            {
                if (f.ShowDialog(this) == DialogResult.OK)
                {
                    bool stat2 = true;
                    try
                    {
                        m_pdfDoc = PdfDocument.Load(src, f.password);
                    }
                    catch (PdfException)
                    {
                        stat2 = false;
                        MessageBox.Show("パスワードが正しくない。");
                    }
                    if (stat2 && m_pdfDoc != null && !m_pdfDoc.Equals(null))
                        break;
                }
                else
                {
                    detail = "パスワード入力をキャンセル";
                    break;
                }
            }
        }
    }
    else
        detail = string.Format("例外エラー({0})", ex.Message);
}

次はPDFのファイル情報。日本語表記はAcrobatに合わせた。ピンと来なかったのは、Autohor=作成者、Creator=アプリケーション、Producer=PDF変換。3つとも作成者っぽい英語表現だけど、それぞれ意味が違うんですな。

PdfInformation info = pdfDoc.GetInformation();
textBox1.Text = info.Title;
textBox2.Text = info.Author;
textBox3.Text = info.Subject;
textBox4.Text = info.Keywords;
DateTime? creationdate = info.CreationDate;
textBox5.Text = creationdate.ToString();
DateTime? modificationdate = info.ModificationDate;
textBox6.Text = modificationdate.ToString();
textBox7.Text = info.Creator;
textBox8.Text = info.Producer;

こうやってC#でいろんな機能を実現していると、C#という言語の使い方が学べる。フォーム間での受け渡し、OKボタン・キャンセルボタンを押したときの挙動なんていうUIまわりの基本がわかってきた。C++のDoModalはShowDialogなんだねぇ、とか。

PDFiumのAPI的には、タイトルや作成者のような情報は取得するだけでなく変更することもできる模様。オープンとクローズをすでに実装してるわけだから、情報変更後に保存や名前を付けて保存ができるとおもしろい。PdfDocumentクラスにSaveという関数があるのは確認したので次の課題とする。あとはページ処理か。DeletePage(ぺージ削除)、RotatePage(指定ページを回転)が見つかった。AddPage(ページ追加)やDividePage(ページ分割)なんてものがあるかなと探したが見当たらず。PDFのページを操作するというのはやや苦手なようだ。でも、うまく機能を組み合わせればできるような気もしている。ググればなんか出てくるかもしれないしな。

なかなか機能がそろってきたので、このアプリをフリーソフトとしてVectorや窓の杜に公開してみるというのもおもしろいな。当初の目的は、PDFimuでできることを試すためのテストだったわけだけれども、なかなか使えるんじゃねぇかという機能の盛り込み具体になってきている。Acrobat Readerでできないラスター変換、テキスト抽出なんてところを売りにしつつ、その他機能を盛りだくさん入れておけば、PDF参照・編集・変換アプリとして需要をつかめるような気がするぞ。

-ソフト開発

執筆者:


  1. コーイチ より:

    C#は、デスクトップアプリだけではなく、Webアプリも作成できるので、Webアプリもチャレンジしては、いかがでしょうか。

    • com より:

      Webアプリはちょいとハードル高いっすね。なんせ作ったことないんで。。仕事でメンテしたことはありますけどクソゲーだったから、その思いがよみがえってきちゃって。でもAzureを無料の枠で使ってみようかとは思っとりますので、いずれって感じで!

com へ返信する コメントをキャンセル

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

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

関連記事

no image

簡単インストーラ

インストーラと言えば、Install Shield です。最新バージョンは11.0で価格は44万1千円。高いんです。高機能版(Premier Edition)で、多国語(全33ヶ国語)対応という代物だ …

no image

クラッカー

知人が被害を受けました。以下、知人の経験談です。 便利なソフトを作って一儲けしたい! シェアウェアとして公開して、誰でもダウンロードできるようにすることを考えました。まずは使ってもらわないと、その良さ …

高速なPDFビューアをC#とPDFiumでサクっと作ってみよう!

どんなPDFビューアを作ったのかというと、こんなモノ。 開いたPDFがCADの図面っぽいが、れっきとしたPDFファイルであり、ベクトル情報をちゃんと表現しているかを明らかにしたかったので使ったデータ。 …

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

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

no image

WM_TIMER

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