はじめに
最近では、業務連絡や申請書などをPDF文書で配布する機会が多くなってきています。印刷による配布はもちろんのこと、E-Mailに添付して関係者だけに配ることも多くなっています。重要な書類や機密性の高い文書を間違って違う相手にメールして見られたら大変なので、PDF作成アプリケーションのほとんどにパスワードを設定する機能が用意されています。
しかし、画像の機密保護に対してはどうでしょうか。被写体によっては機密性の高いものや勝手に配布されては困るものがあります。画像に対しても閲覧や編集/印刷などの制限をかけるセキュリティ設定ができるといいですね。
LEADTOOLS 16.5J Document ImagingのPDF Write Plug-Inには、画像をPDFに変換する機能とともに、PDF作成時に読み取りパスワードや文書の属性変更に制限をかける機能が用意されています。今回は、JPEGフォーマットの画像を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」にし、以下の内容を記述します。
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
「App.config」ファイルを修正/追加しても、プログラム実行時に次のような実行エラーが出る場合があります。
この場合は、次の手順でプロジェクトのプロパティの「対象フレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変更します。
- 「プロジェクト」メニューの[xxxのプロパティ]を選ぶ
- 「コンパイル」タブをクリックし、[詳細コンパイルオプション...]ボタンをクリックする
- 「対象のフレームワーク」を「.NET Framework 4 Client Profile」から「.NET Framework 4」に変更
- プロジェクトのプロパティを閉じ、プロジェクトを実行
- 再び同じ手順で「詳細コンパイルオプション」の「対象のフレームワーク」を「.NET Framework 4 Client Profile」に戻す
コンポーネントのインストール
この記事の手順を試すには、Visual Studio、Visual Basic、Visual C#の開発環境にLEADTOOLS 16.5Jをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできます。
製品ページのトライアル版申込フォーム下部にある[同意する]ボタンをクリックして、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールと参照の追加
LEADTOOLS 16.5Jをインストールしたら、プロジェクトにコントロールを追加します。ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントは、アセンブリ名が「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を作成する際に次のような圧縮オプションがあります。
| オプション | 内容 |
| 圧縮なし | |
| 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種類で制御できます。
- テキストエンコードを使用しない
- ASCII 85テキストエンコード方式を使用
- ASCII HEXテキストエンコード方式を使用
実際に画像をPDFファイルに変換するには、対象の画像をRasterCodecsクラスのSaveメソッドを使ってPDF形式で保存するだけです。この保存の際に、CodecsPdfSaveOptionsクラスのメンバプロパティを使用すると、PDF形式に設定されている各種セキュリティ設定を組み込んで保存できます。
| プロパティ | 内容 |
| 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には複数のエディションと、エディションの機能を拡張する別売りのプラグイン(全8種類)があります。
今回紹介する「画像をPDF化する機能」は、PDF Write Plug-Inの機能を用いて実現します。このプラグインを「LEADTOOLS 16.5J」のいずれかのエディションと組み合わせると、PDFの生成を行うことができるようになります。
トライアル版には利用できるプラグインがすべて含まれているので、記事の内容を試す際には 別途インストールする必要はありません。
フォームの作成
では、さっそくプログラムを作成しましょう。
今回は、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(String)
-
パラメータ
-
fileName
ロードする画像ファイルの名前を表すString
-
fileName
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
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」に設定します。
codecs.Save(RasterImageViewer1.Image, "C:\pdf\" + TextBox2.Text, RasterImageFormat.RasPdfJpeg, 24)
codecs.Save(rasterImageViewer1.Image, @"c:\pdf\" + textBox2.Text, RasterImageFormat.RasPdfJpeg, 24);
以上でできあがりです。
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
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が必要)。
最初に、閲覧用のパスワードの入力が求められるため、パスワードを入力します。メニューを見ると、印刷やコピー、編集メニューがグレー表示で使用できなくなっています。また、文書のプロパティを開くと、機能制限がかかっていることもわかります。
まとめ
画像といえども重要なデータに変わりはないので、きちんとセキュリティをかけることも大切です。LEADTOOLS 16.5J Document Imagingは、このように画像をセキュリティ制限付きPDF文書に変換してくれます。今の時代、情報の保護が厳しく問われていますので、データにセキュリティ設定のできるアプリケーションはより求められていると言えるでしょう。











