SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(LEADTOOLS)

画像をパスワード付きPDFドキュメントに変換する.NETアプリケーションの作成

LEADTOOLS 16.5J Document ImagingのRasterImageViewerコンポーネントを使ったアプリケーションの作成

  • このエントリーをはてなブックマークに追加

 LEADTOOLS 16.5J Document ImagingのPDF Write Plug-Inでは、画像をPDFに変換する機能とともに、PDF作成時に読み取りパスワードや文書の属性変更に制限をかける機能が用意されています。そこで、今回はJPEGフォーマットの画像をPDF化し、読み取りとPDF文書の属性に制限をかけるアプリケーションを作成してみました。

  • このエントリーをはてなブックマークに追加

はじめに

 最近では、業務連絡や申請書などをPDF文書で配布する機会が多くなってきています。印刷による配布はもちろんのこと、E-Mailに添付して関係者だけに配ることも多くなっています。重要な書類や機密性の高い文書を間違って違う相手にメールして見られたら大変なので、PDF作成アプリケーションのほとんどにパスワードを設定する機能が用意されています。

 しかし、画像の機密保護に対してはどうでしょうか。被写体によっては機密性の高いものや勝手に配布されては困るものがあります。画像に対しても閲覧や編集/印刷などの制限をかけるセキュリティ設定ができるといいですね。

 LEADTOOLS 16.5J Document ImagingのPDF Write Plug-Inには、画像をPDFに変換する機能とともに、PDF作成時に読み取りパスワードや文書の属性変更に制限をかける機能が用意されています。今回は、JPEGフォーマットの画像をPDF化し、読み取りとPDF文書の属性に制限をかけるアプリケーションを作成してみました。

画像をパスワード付きでPDF文書に変換する
ダイアログで対象の画像を選びパスワードとファイル名を入力し「PDFの作成」ボタンを押すと画像をパスワード付きでPDF文書に変換する
PDFを開く際にパスワードの入力を求められる
PDFを開く際にパスワードの入力を求められる
印刷や編集メニューが使えない
印刷や編集メニューが使えない
文書のプロパティにも制限内容が表示されている
文書のプロパティにも制限内容が表示されている

対象読者

 Visual Basic、Visual C# 2005/2008/2010を使ってプログラムを作ったことのある人

必要な環境

 Visual Basic、Visual C#、Visual Studioの2005/2008/2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2008を使用して作成し、動作確認を行っています。

※サンプルソース実行時の注意事項

 LEADTOOLS 16.5Jを使って作成したアプリケーションを配布する場合、アセンブリファイルを添付する必要があります。今回作成するアプリケーションを正常に動作させるため、次のファイルを実行プログラムと同じフォルダにインストールしてください。

  • Leadtools.dll
  • Leadtools.Codecs.dll
  • Leadtools.Codecs.Cmp.dll
  • Leadtools.Codecs.Fax.dll
  • Leadtools.Codecs.Pdf.dll
  • Leadtools.WinForms.dll
  • PdfDll32.dll(64ビットの場合はPdfDll64.dll)

 なお、サンプルプログラムでは、JPEG画像のあるフォルダおよびPDF出力フォルダを「c:¥pdf」というフォルダに設定してあるため、プログラムを実行する際は、このフォルダを作成し変換したいJPEG画像を入れておいてください。


 また、この記事はトライアル版にてサンプルソースを使用することを前提とした内容になっています。実際の製品版でPlug-In製品を使用するためには、別途購入する必要があるため、ご注意ください。

 LEADTOOLS 16.5JをVisual Studio 2010(.NET Framework 4)で使用する場合には、プロジェクト内に生成される「App.config」ファイルの<startup>要素にuseLegacyV2RuntimeActivationPolicy属性を追加して「True」に設定する必要があります。

 この設定を行わない場合、ビルド時にエラーが発生します。以下のように、「App.config」ファイル内の<startup>要素に「useLegacyV2RuntimeActivationPolicy」属性を追加してください。

<startup useLegacyV2RuntimeActivationPolicy="true">

 また、作成するプロジェクトによっては、この「App.config」ファイルが生成されない場合があります。その場合は、テキストファイルでこの「App.config」ファイルを作成しプロジェクトに追加してください。作成するファイル名は必ず「App.config」にし、以下の内容を記述します。

App.config コードの内容
<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
       <supportedRuntime version="v4.0"/>
    </startup>
</configuration>
【コラム】 プログラム実行エラーへの対処法

 「App.config」ファイルを修正/追加しても、プログラム実行時に次のような実行エラーが出る場合があります。

表示される実行エラー
表示される実行エラー

 この場合は、次の手順でプロジェクトのプロパティの「対象フレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変更します。

  1. 「プロジェクト」メニューの[xxxのプロパティ]を選ぶ
  2. 「コンパイル」タブをクリックし、[詳細コンパイルオプション...]ボタンをクリックする
  3. 「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変更
  4. プロジェクトのプロパティを閉じ、プロジェクトを実行
  5. 再び同じ手順で「詳細コンパイルオプション」の「対象のフレームワーク」を「.NET Framework 4 Client Profile」に戻す
「詳細コンパイルオプション」の「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変える
「詳細コンパイルオプション」の「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変える

コンポーネントのインストール

 この記事の手順を試すには、Visual Studio、Visual Basic、Visual C#の開発環境にLEADTOOLS 16.5Jをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできます。

 製品ページのトライアル版申込フォーム下部にある[同意する]ボタンをクリックして、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールと参照の追加

 LEADTOOLS 16.5Jをインストールしたら、プロジェクトにコントロールを追加します。ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントは、アセンブリ名が「Leadtools.WinForms(16.5.0.0)」の「RasterImageViewer」コントロールです。

アセンブリ名が「Leadtools.WinForms(16.5.0.0)」の「RasterImageViewer」コントロールを選択する
アセンブリ名が「Leadtools.WinForms(16.5.0.0)」の「RasterImageViewer」コントロールを選択する

 また、プロジェクトに以下のランタイムライブラリへの参照を追加します。LEADTOOLS 16.5Jでは、アプリケーションで使用する画像に対応したフィルタファイルへの参照も必要になります。

ランタイムライブラリ
ファイル 内容
Leadtools.dll LEADTOOLS本体
Leadtools.Codecs.dll LEADTOOLSでサポートされている画像形式の画像データ読み込み/保存を行うクラス
Leadtools.Codecs.Cmp.dll JPEG画像形式の画像データ読み込み/保存を行うクラス
Leadtools.Codecs.Fax.dll FAX形式の画像データ読み込み/保存を行うクラス
Leadtools.Codecs.Pdf.dll PDF形式の画像データ読み込み/保存を行うクラス
Leadtools.WinForms.dll LEADTOOLSを使用してWindowsフォームアプリケーションを作成するためのクラス
 

LEADTOOLS 16.5JのPDF変換機能について

 LEADTOOLS 16.5JのPDF Write Plug-In/PDF Read Plug-Inモジュールを使用すると、PDFのバージョンが1.2/1.3/1.4/1.5/PDF/Aのものの読み込み、および書き込みができます。PDF読み込み機能はマルチページに対応しており、特定のページを指定してロードしたり、ドキュメントに含まれるページ数を取得することもできます。また、書き込み機能もマルチページに対応しており、LEADTOOLSによって作成されたPDFファイルに特定のページを追加、挿入、置換、削除できます。

 PDFプラグインには、PDFを作成する際に次のような圧縮オプションがあります。

PDFプラグインの圧縮オプション
オプション 内容
圧縮なし
CCITT Group3 1次元圧縮。1ビット画像用
CCITT Group3 2次元圧縮。1ビット画像用
CCITT Group4 圧縮。1ビット画像用
JPEG圧縮、YUV 4:4:4 カラースペース、ロスレス。グレースケールの場合は8ビット、カラーの場合は24ビット
JPEG圧縮、YUV 4:2:2 カラースペース。グレースケールの場合は8ビット、カラーの場合は24ビット
JPEG圧縮、YUV 4:1:1 カラースペース。グレースケールの場合は8ビット、カラーの場合は24ビット

 また、圧縮画像データをテキスト形式に変更するためのエンコード方式も次の3種類で制御できます。

  1. テキストエンコードを使用しない
  2. ASCII 85テキストエンコード方式を使用
  3. ASCII HEXテキストエンコード方式を使用

 実際に画像をPDFファイルに変換するには、対象の画像をRasterCodecsクラスのSaveメソッドを使ってPDF形式で保存するだけです。この保存の際に、CodecsPdfSaveOptionsクラスのメンバプロパティを使用すると、PDF形式に設定されている各種セキュリティ設定を組み込んで保存できます。

CodecsPdfSaveOptionsクラスのメンバプロパティ
プロパティ 内容
AssembleDocument 文書アセンブリの許可/禁止
ExtractText テキストコピーの許可/禁止
ExtractTextGraphics グラフィックコピーの許可/禁止
FillForm フォームの入力の許可/禁止
LowMemoryUsage PDFファイルの作成時にJPEGまたはFAX圧縮を使用し、メモリ使用量を抑えるかどうかを示す値を取得/設定
ModifyAnnotation 注釈編集の許可/禁止
ModifyDocument 文書編集の許可/禁止
OwnerPassword 暗号化ファイルの保存時に使用するオーナーパスワードの取得/設定
PrintDocument 印刷の許可/禁止
PrintFaithful 高画質印刷の許可/禁止
SavePdfA PDFファイルをPDF/Aとして保存するかどうかを示す値を取得/設定
SavePdfv14 PDFファイルをPDF 1.4として保存するかどうかを示す値を取得/設定
SavePdfv15 PDFファイルをPDF 1.5として保存するかどうかを示す値を取得/設定
TextEncoding 使用するテキストエンコーディングを取得/設定
Use128BitEncryption 使用する暗号化方式を制御する値をを取得/設定
UseImageResolution PDFファイルの保存時にページの寸法を計算する際、画像の解像度(DPI)を使用するかどうかを示す値をを取得/設定
UserPassword 暗号化ファイルの保存時に使用するユーザーパスワードを取得/設定
【コラム】LEADTOOLS 16.5Jの製品構成とPDFプラグインについて

 LEADTOOLS 16.5Jには複数のエディションと、エディションの機能を拡張する別売りのプラグイン(全8種類)があります。

 

 今回紹介する「画像をPDF化する機能」は、PDF Write Plug-Inの機能を用いて実現します。このプラグインを「LEADTOOLS 16.5J」のいずれかのエディションと組み合わせると、PDFの生成を行うことができるようになります。

 

 トライアル版には利用できるプラグインがすべて含まれているので、記事の内容を試す際には 別途インストールする必要はありません。

 

LEADTOOLS 16.5Jの各エディションと利用可能なプラグイン製品の一覧
LEADTOOLS 16.5Jの各エディションと利用可能なプラグイン製品の一覧

フォームの作成

 では、さっそくプログラムを作成しましょう。

 今回は、LEADTOOLS 16.5JのPDF Write Plug-Inを使用します。作成するのは、「ファイルを開くダイアログ」でJPEG画像を選択し、閲覧用パスワードと保存するPDFファイル名を入力してボタンを押すと、閲覧パスワード機能とコピー/印刷/編集を禁止する制限をかけたPDFファイルに変換する、というプログラムです。

GUIのデザイン

 フォームには、これらの機能を実装するために、RasterImageViewerコントロールを1つと、Button・Label・TextBoxコントロールを2つ配置します。また、OpenFileDialogコントロールを1つ配置します。

 TextBoxコントロールは、パスワード入力用はMaxLengthプロパティを「16」に設定し、PDFファイル名入力用はTextプロパティに「sample-1.pdf」と入力しておきます。

フォームのレイアウト
フォームのレイアウト

PDF変換処理

 では、実際に画像をPDF化する処理を作成していきましょう。この処理は、フォームに配置した2つのButtonコントロールのClickイベントハンドラで行います。

画像ファイルを開く処理

 最初に、画像ファイルを開く処理を作成します。ここでは、ユーザーにファイルを開くダイアログを使って、PDF化したいJPEG画像を選んでもらいます。

 選択された画像は、RasterCodecsクラスのLoadメソッドを使用して、RasterImageViewerコントロールのImageプロパティに設定し表示します。Loadメソッドはオーバーロードメソッドですが、引数にファイル名を指定するだけのメソッドを使用します。

Loadメソッドの書式
Load(String)
  • パラメータ
    • fileName

       ロードする画像ファイルの名前を表すString

Visual Basic
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.WinForms

Public Class Form1
    Private codecs As RasterCodecs
    Private fname As String = ""

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ' 入出力ライブラリの起動に必要なデータを初期化
        RasterCodecs.Startup()
    End Sub

    Private Sub open_image_btn_Click(sender As System.Object, e As System.EventArgs) Handles open_image_btn.Click

        ' RasterCodecsオブジェクトを初期化
        codecs = New RasterCodecs()

        'ファイルを開くダイアログを表示
        OpenFileDialog1.Filter = "画像ファイル(jpeg)| *.jpg "
        OpenFileDialog1.FileName = "*.jpg"
        OpenFileDialog1.InitialDirectory = "c:\pdf"

        '開く画像ファイル名を取得
        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            fname = OpenFileDialog1.FileName

            ' 選択した画像をビューワにロード
            RasterImageViewer1.Image = codecs.Load(fname)
            RasterImageViewer1.SizeMode = RasterPaintSizeMode.Fit
        Else
            MessageBox.Show("PDF作成の画像を選んでください", "画像の選択", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If

    End Sub
C#
using Leadtools;
using Leadtools.Codecs;
using Leadtools.WinForms;

namespace Lead_PDF_cs
{
    public partial class Form1 : Form
    {
        private RasterCodecs codecs;
        private String fname = "";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 入出力ライブラリの起動に必要なデータを初期化
            RasterCodecs.Startup();
        }
        private void open_image_btn_Click(object sender, EventArgs e)
        {
 
            // RasterCodecsオブジェクトを初期化
            codecs = new RasterCodecs();

            //ファイルを開くダイアログを表示
            openFileDialog1.Filter = "画像ファイル(jpeg)| *.jpg ";
            openFileDialog1.FileName = "*.jpg";
            openFileDialog1.InitialDirectory = @"c:\pdf\";

            //開く画像ファイル名を取得
            if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                fname = openFileDialog1.FileName;

            // 画像をビューワにロードします。
                rasterImageViewer1.Image = codecs.Load(fname);
                rasterImageViewer1.SizeMode = RasterPaintSizeMode.Fit;
            }else
            {
                MessageBox.Show("PDF作成の画像を選んでください", "画像の選択", 
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

JPEG画像をパスワード機能付きPDFに変換する処理

 画像をRasterImageViewerコントロールで表示したら、この画像をPDFに変換します。PDFへの変換と保存の処理はRasterCodecsクラスのSaveメソッドで行います。

 その前に、次の3つの操作制限と2つのパスワードを設定しておきます。これらは、PDFに対するコピー/印刷/編集操作を禁止し、パスワードを入力しないと文書の閲覧とこれらの属性の変更ができないようにします。

 この処理はCodecsPdfSaveOptionsクラスの次のメンバプロパティを使用します。

  • ExtractTextGraphics

     グラフィックスのコピーの許可/禁止を設定。Falseでユーザーはコピーができなくなる

  • PrintDocument

     印刷の許可/禁止を設定。Falseでユーザーは印刷ができなくなる

  • ModifyDocument

     文書編集の許可/禁止を設定。Falseでユーザーは文書の編集ができなくなる

  • UserPassword

     PDF文書閲覧に際して使用するパスワード。暗号化ファイルの保存時に設定

  • OwnerPassword

     PDF文書のアクセス設定や保護設定をする際に設定するパスワード。パスワードを入力しないとこれらの機能にアクセスできない。

 Saveメソッドにはオーバーロードメソッドがいくつか用意されています。今回の処理には、次の書式のメソッドを使用します。

Save(RasterImage,String,RasterImageFormat,Int32)
  • RasterImage

     画像データを含むRasterImageオブジェクト

  • fileName

     出力ファイル名を表すString

  • RasterImageFormat

     出力ファイル形式。PDF形式に変換する場合は、RasterImageFormatクラスの次のメンバ(定数)を使用する

    PDF変換時のRasterImageFormatクラスの定数
    定数 説明 ビット数
    RasPdf ラスタPDF、圧縮なし 1、2、4、8、24ビット
    RasPdfCmyk ラスタPDF、CMYKサポート 24ビット
    RasPdfG31Dim ラスタPDF、G3 1次元圧縮 1ビット
    RasPdfG32Dim ラスタPDF、G3 2次元圧縮 1ビット
    RasPdfG4 ラスタPDF、G4圧縮 1ビット
    RasPdfLzw ラスタPDF、LZW圧縮 1、2、4、8、24ビット
    RasPdfLzwCmyk ラスタPDF、CMYKサポート、LZW圧縮 24ビット
    RasPdfJpeg ラスタPDF、JPEG 4:4:4圧縮 8ビット(グレースケール)、24ビット
    RasPdfJpeg422 ラスタPDF、JPEG 4:2:2圧縮 24ビット
    RasPdfJpeg411 ラスタPDF、JPEG 4:1:1圧縮 24ビット
    RasPdfJbig2 ラスタPDF、JBIG2圧縮 1ビット
  • bitsPerPixel

     出力ファイルのビット数

 今回は、JPEG画像をPDFに変換するため、RasterImageFormatクラスの「RasPdfJpeg」を使用します。また、フルカラー画像を扱うので出力ビット数は「24」に設定します。

Visual Basic
codecs.Save(RasterImageViewer1.Image, "C:\pdf\" + TextBox2.Text, RasterImageFormat.RasPdfJpeg, 24)
C#
codecs.Save(rasterImageViewer1.Image, @"c:\pdf\" + textBox2.Text, RasterImageFormat.RasPdfJpeg, 24);

 以上でできあがりです。

Visual Basic
Private Sub create_pdf_btn_Click(sender As System.Object, e As System.EventArgs) Handles create_pdf_btn.Click
    If RasterImageViewer1.Image IsNot Nothing Then
        ' グラフィックスのコピーを禁止する
        codecs.Options.Pdf.Save.ExtractTextGraphics = False

        ' 印刷を禁止する
        codecs.Options.Pdf.Save.PrintDocument = False

        ' 文書の編集を禁止する
        codecs.Options.Pdf.Save.ModifyDocument = False

        ' 暗号化ファイルの保存時に使用するオーナーパスワードを設定
        'オーナーパスワードを入力しないとユーザーがアクセス設定や保護設定を変更できない
        codecs.Options.Pdf.Save.OwnerPassword = "lead2012"

        ' 暗号化ファイルの保存時に使用するユーザーパスワードを設定
        'ユーザーパスワードは文書閲覧に際して使用するパスワード
        codecs.Options.Pdf.Save.UserPassword = TextBox1.Text

        ' 画像をPDFで保存します。
        codecs.Save(RasterImageViewer1.Image, "C:\pdf\" + TextBox2.Text, RasterImageFormat.RasPdfJpeg, 24)
        MessageBox.Show("PDFファイルを保存しました。")
    Else
        MessageBox.Show("PDF化する画像がありません", "PDF作成エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If
End Sub

Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    RasterCodecs.Shutdown()
End Sub

C#
private void create_pdf_btn_Click(object sender, EventArgs e)
{
    if(rasterImageViewer1.Image != null) 
    {
        // グラフィックスのコピーを禁止する
        codecs.Options.Pdf.Save.ExtractTextGraphics = false;
             
        // 印刷を禁止する
        codecs.Options.Pdf.Save.PrintDocument = false;
             
        // 文書の編集を禁止する
        codecs.Options.Pdf.Save.ModifyDocument = false;
             
        // 暗号化ファイルの保存時に使用するオーナーパスワードを設定
        //オーナーパスワードを入力しないとユーザーがアクセス設定や保護設定を変更できない
        codecs.Options.Pdf.Save.OwnerPassword = "lead2012";
             
        // 暗号化ファイルの保存時に使用するユーザーパスワードを設定
        //ユーザーパスワードは文書閲覧に際して使用するパスワード
        codecs.Options.Pdf.Save.UserPassword = textBox1.Text;
             
        // 画像をPDFで保存します。
        codecs.Save(rasterImageViewer1.Image, @"c:\pdf\" + textBox2.Text, 
                    RasterImageFormat.RasPdfJpeg, 24);
             
        MessageBox.Show("PDFファイルを保存しました。");
    }else
    {
        MessageBox.Show("PDF化する画像がありません", "PDF作成エラー",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    RasterCodecs.Shutdown();
}

動作確認

 では、プログラムを実行し、PDF化した画像を開いてみます(※PDF閲覧には、Adobe社のAcrobat Readerが必要)。

 最初に、閲覧用のパスワードの入力が求められるため、パスワードを入力します。メニューを見ると、印刷やコピー、編集メニューがグレー表示で使用できなくなっています。また、文書のプロパティを開くと、機能制限がかかっていることもわかります。

PDFを開く際にパスワードの入力を求められる
PDFを開く際にパスワードの入力を求められる
印刷や編集メニューが使えない
印刷や編集メニューが使えない
文書のプロパティにも制限内容が表示されている
文書のプロパティにも制限内容が表示されている

まとめ

 画像といえども重要なデータに変わりはないので、きちんとセキュリティをかけることも大切です。LEADTOOLS 16.5J Document Imagingは、このように画像をセキュリティ制限付きPDF文書に変換してくれます。今の時代、情報の保護が厳しく問われていますので、データにセキュリティ設定のできるアプリケーションはより求められていると言えるでしょう。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6412 2012/02/29 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング