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

PMサーバー版リリース

ペーパーモデル化ツールサーバー版の宣伝。 詳しくは、kensetsu21のこちらのサイト(PDF)をご覧あれ。 クライアントは、サーバー上の共有フォルダにファイルを ドラッグ&ドロップするだけ。 サー …

no image

CArrayで配列の配列(ネスト)を実現する方法

CArrayで配列の配列(ネスト)を実現したいことがよくある。 シンプルにこんなことやると、ビルドエラーになる。 typedef struct { // 構造体 CStringArray m_ary; …

マルチスレッドプログラミング(C++編)

マルチスレッドプログラミング(VB.net編) マルチスレッドプログラミング(C#編) もあるので、ご覧あれ。 5秒以上の時間を要する処理をやらせていると応答なしになってかっこ悪い、なんてことをアラフ …

no image

zlibの研究結果

zip圧縮・解凍のフリーソフトであるzlibについていろいろと調べた結果。最新版の1.2.11を使ってzlibwapi.dllを作ることはできたが、それを実際に使ってみるとまともに動かなかった。圧縮は …

no image

VisualStudio2005

帰国後の1週間を乗り切った。 バカンスモードの体からビジネスモードに切り替えるのは、 なかなか厳しかったが、この1週間で徐々に慣れてきた。 夢のような南国リゾートとは違い、現実世界は厳しい。 さて、V …