CAD日記

AutoCAD,DXF,DWG,SXFなどCADのことから、仮想通貨や投資関係、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を無料の枠で使ってみようかとは思っとりますので、いずれって感じで!

comment

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

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

関連記事

no image

アプリでzip圧縮と解凍をやりたくてzlibを組み込んでみたんだけど。。

でかいファイルは、圧縮してコンパクトに扱いたくなる。 テキスト形式で定義されているファイルをアプリで読み書きする。 テキストは圧縮すれば1/5くらいになるので、その結果小さくなった ファイルをアプリの …

no image

CADツール第2弾

 PMツールに続いてのCADツール第2弾を思いつきました。今まで、いくつかの企画があり、手をつけたものもあるのですが、いまいち乗り気にならなくてポシャってました。シリーズものとして継続したいところなの …

no image

BMPをJPEGに

ビットマップ(BMP)ファイルをJPEGファイルに変換できないものか。 そんなテーマが頭の中で渦巻いていた。 既存のアプリ(フリーソフトなど)を使えば簡単だが、 プログラム的にやるとなると、なかなか。 …

no image

マルチスレッド

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

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

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