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を無料の枠で使ってみようかとは思っとりますので、いずれって感じで!

コーイチ へ返信する コメントをキャンセル

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

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

関連記事

no image

VC6デバッグ

ここ数年抱えていた問題が一つ解決したので、ここに記しておこう。 VC6でデバッグしていると、たまに戻ってこないことがあったのさ。 別の言い方をすると、固まる、凍る、フリーズ、ハングアップ。 マウスは動 …

zipcopy Ver1.06リリース

zipcopyをリビジョンアップして、Ver1.06とした。 詳細は以下の通り。 Ver1.06 2020/2/24 ・ファイル削除時のタイムアウト(秒)を設定可能として、初期値を180秒(3分)とし …

no image

簡単インストーラ

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

no image

テキストファイルの最大行数

【2018/12/24追記】以下の記事も参考になるかな。 扱えるテキストファイルの最大行数は1億行 バカでかいテキストファイルを作る必要があって、結果約2GBにもなった。 CADから出力するんだけど、 …

no image

通常使うプリンタを取得する

通常使うプリンターを取得する方法をいくつか挙げる。 ①GetDefaultPrinter TCHAR printerName[1024]; DWORD dwBufferSize = 1024; BOO …