[]
機密情報または極秘情報が含まれている PDF ドキュメントには、セキュリティを設定して、承認されていないユーザーによるアクセスまたは変更を制限する必要があります。PDF のセキュリティの詳細については、PDF 仕様 1.7(セクション 7.6.3)を参照してください。
DioDocs for PDF を使用すると、暗号化、パスワード保護、権限の設定などのさまざまな機能により、PDF ドキュメントを不要なアクセスから保護できます。
機密情報または極秘情報が含まれている PDF ドキュメントには、セキュリティを設定して、承認されていないユーザーによるアクセスを制限する必要があります。GcPDFのSecurity クラスを使用して、ドキュメントを暗号化し、承認されていないユーザーへのアクセスを拒否できます。
標準セキュリティハンドラリビジョン4を使用して、PDF ファイルを暗号化するには
StandardSecurityHandlerRev4 クラスのオブジェクトを作成します。
パスワード、暗号化アルゴリズムなど、StandardSecurityHandlerRev4 オブジェクトの必須プロパティを設定します。
オブジェクトを Security クラスの EncryptHandler プロパティに渡して、PDF ドキュメントを暗号化します。
public void CreatePDF(Stream stream)
{
GcPdfDocument doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
const float In = 150;
//暗号化を追加します
var std = new StandardSecurityHandlerRev4();
std.OwnerPassword = "abc";
std.UserPassword = "qwe";
// EncyptionAlgorithmを設定します
std.EncryptionAlgorithm = EncryptionAlgorithm.RC4;
std.EncryptionKeyLength = 128;
// EncryptHandlerプロパティを設定します
doc.Security.EncryptHandler = std;
// DrawStringメソッドを使用してテキストをレンダリングします
g.DrawString("Welcome to MESCIUS, Inc", new TextFormat()
{ Font = StandardFonts.TimesBold, FontSize = 12 }, new PointF(In, In));
// ドキュメントを保存します
doc.Save(stream);
}GcPDFは、256-bit AES暗号化を使用する標準セキュリティハンドラリビジョン6(PDF 2.0仕様で定義)もサポートしています。
標準セキュリティハンドラリビジョン6を使用して、PDF ファイルを暗号化するには
StandardSecurityHandlerRev6クラスのオブジェクトを作成します。
StandardSecurityHandlerRev6 オブジェクトのパスワード、印刷許可などの必須プロパティを設定します。
オブジェクトをSecurityクラスのEncryptHandlerプロパティに渡して、PDFドキュメントを暗号化します。
public void CreatePDF(Stream stream)
{
GcPdfDocument doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
const float In = 150;
// 暗号化を追加します
var ssh = new StandardSecurityHandlerRev6();
ssh.OwnerPassword = "password";
ssh.PrintingPermissions = PrintingPermissions.Enabled;
// EncryptHandlerプロパティを設定します
doc.Security.EncryptHandler = ssh;
// DrawStringメソッドを使用してテキストをレンダリングします
g.DrawString("Welcome to MESCIUS, Inc", new TextFormat()
{ Font = StandardFonts.TimesBold, FontSize = 12 }, new PointF(In, In));
// ドキュメントを保存します
doc.Save(stream);
}PDF ドキュメントに対する権限を設定することで、他のユーザーによるドキュメントのコピー・印刷・編集を防ぐことはできます。DioDocs for PDF ライブラリの Security クラスを使用すると、ユーザーは PDF ドキュメントに権限を設定できます。
PDF ドキュメントで権限を設定するには
StandardSecurityHandlerRev3 クラスのオブジェクトを作成します。
StandardSecurityHandlerRev3 オブジェクトの必須プロパティを使用して、編集、印刷などの権限を設定します。
オブジェクトを Security クラスの EncryptHandler プロパティに渡します。
public void CreatePDF(Stream stream)
{
GcPdfDocument doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
int In = 72;
// セキュリティハンドラを作成します
var std = new StandardSecurityHandlerRev3();
std.EditingPermissions = EditingPermissions.Enabled;
std.OwnerPassword = "abc";
std.UserPassword = "qwe";
// 権限を設定します
std.EditingPermissions = EditingPermissions.Enabled;
std.CopyContentPermissions = CopyContentPermissions.Enabled;
std.PrintingPermissions = PrintingPermissions.Disabled;
doc.Security.EncryptHandler = std;
// DrawStringメソッドを使用してテキストをレンダリングします
g.DrawString("Welcome to MESCIUS, Inc.", new TextFormat()
{ Font = StandardFonts.TimesBold, FontSize = 12 }, new PointF(In, In));
// ドキュメントを保存します
doc.Save(stream);
}パスワードを指定せずに暗号化された PDF ファイルのロードが必要となる場合もあります。DioDocs for PDF では、パスワードを指定せずにパスワードで保護された PDF ファイルを開くには、DecryptionOptions クラスの ThrowExceptionIfInvalidPassword プロパティ (フラグ) を false に設定してから、 (デフォルトでは true です)、GcPdfDocument クラスの Load(Stream stream, DecryptionOptions decryptionOptions) オーバーロードを使用します。この方法で開いた PDF でできることには多くの制限がありますが、次のことができます。
PDF 文字列またはストリームに基づいていない読み取りおよび書き込みプロパティ。
PDF 文字列またはストリームを使用せずに新しいオブジェクトを定義できる場合は、新しいオブジェクトを追加します。
PDF形式には「オブジェクトストリーム」機能があります。 オブジェクトストリームとは、最外側のファイルレベルではなく、一連の間接オブジェクトが格納されるストリーム オブジェクトです。PDF が暗号化されている場合、オブジェクトストリームも暗号化されるため、PDF オブジェクトにはアクセスできません。したがって、DioDocs for PDF では、パスワードを指定せずにオブジェクト ストリーム関数で PDF ファイルを開くことができず、例外が発生します。パスワードを指定せずにパスワードで保護された PDF を操作する場合、次のことはできません。
PDF 文字列の読み取りまたは書き込み。
セキュリティハンドラを変更する。
PDF 文字列オブジェクトに基づいてプロパティを読み取りまたは書き込みます。 通常、DocumentInfo.Creator などの文字列プロパティです。
ストリーム オブジェクトの読み取りまたは書き込み。つまり、次のことができません。
PDF を描画します。
コンテンツを含むページを追加します。
既存のページのコンテンツを変更します。
フォントを埋め込みます。
注釈の外観ストリームを作成または編集します。
次のセクションでは、パスワードを指定せずに暗号化された PDF ファイルを操作する場合に役立つシナリオをいくつか示します。
using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// GcPdfDocument を初期化します。
GcPdfDocument doc = new GcPdfDocument();
// PDF ファイルをロードし、復号化オプションを false に設定します。
doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });
// PDF ファイルの最初のページをアクティブ ページとして設定します。
var page = doc.Pages[0];
// ページサイズを取得します。
var pageSize = page.Size;
// 正方形注釈を追加します。
SquareAnnotation sa = new SquareAnnotation();
sa.Page = page;
/* UserName を削除します。これはデフォルトで初期化されており、
文字列を暗号化できないため、ドキュメントの保存時に例外が発生します。 */
sa.UserName = null;
// ページに正方形を追加します。
sa.Rect = new RectangleF(10, 10, pageSize.Width - 20, pageSize.Height - 20);
// 正方形の色を設定します。
sa.Color = Color.Red;
// PDF ファイルを保存します。
doc.Save("Annotation.pdf");
}using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// GcPdfDocument を初期化します。
GcPdfDocument doc = new GcPdfDocument();
// PDF ファイルをロードし、復号化オプションを false に設定します。
doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });
// メタデータが暗号化されているかどうかを確認し、暗号化されていない場合はメタデータを変更します。
bool encryptMetadata = true;
if (doc.Security.EncryptHandler is StandardSecurityHandlerRev4 ssh)
encryptMetadata = ssh.EncryptMetadata;
if (!encryptMetadata)
{
// メタデータが暗号化されません。
Metadata m = doc.Metadata;
Console.WriteLine("The document has not encrypted metadata:");
Console.WriteLine($"CreatorTool: {m.CreatorTool}");
Console.WriteLine($"CreateDate: {m.CreateDate}");
}
else
{
Console.WriteLine("The document metadata is ENCRYPTED");
}
}using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// GcPdfDocument を初期化します。
GcPdfDocument doc = new GcPdfDocument();
// PDF ファイルをロードし、復号化オプションを false に設定します。
doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });
// メタデータが暗号化されているかどうかを確認し、暗号化されていない場合はメタデータを変更します。
bool encryptMetadata = true;
if (doc.Security.EncryptHandler is StandardSecurityHandlerRev4 ssh)
encryptMetadata = ssh.EncryptMetadata;
if (!encryptMetadata)
{
// メタデータが暗号化されません。
Metadata m = doc.Metadata;
Console.WriteLine("The document has not encrypted metadata:");
Console.WriteLine($"CreatorTool: {m.CreatorTool}");
Console.WriteLine($"CreateDate: {m.CreateDate}");
// CreatorToolの値を変更します。
m.CreatorTool = "New value of CreatorTool";
doc.Save(@"MetaData.pdf");
}
else
{
Console.WriteLine("The document metadata is ENCRYPTED");
}
}using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// GcPdfDocument を初期化します。
GcPdfDocument doc = new GcPdfDocument();
// PDF ファイルをロードし、復号化オプションを false に設定します。
doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });
// 最初のページと 2 番目のページを入れ替えます。
doc.Pages.Swap(0, 1);
// PDF ファイルを保存します。
doc.Save("PageOrder.pdf");
}using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// GcPdfDocument を初期化します。
GcPdfDocument doc = new GcPdfDocument();
// PDF ファイルをロードし、復号化オプションを false に設定します。
doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });
// CheckBoxField の値を変更します。
var cbf = (CheckBoxField)doc.AcroForm.Fields[0];
cbf.Checked = true;
// RadioButtonField の値を変更します。
var rbf = (RadioButtonField)doc.AcroForm.Fields[1];
var values = rbf.GetCheckedAppearanceStreamNames();
rbf.Value = values[0];
// PDF ファイルを保存します。
doc.Save("FieldValue.pdf");
}using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// GcPdfDocument を初期化します。
GcPdfDocument doc = new GcPdfDocument();
// PDF ファイルをロードし、復号化オプションを false に設定します。
doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });
// CheckBoxField の値を変更します。
var tf = (TextField)doc.AcroForm.Fields[2];
tf.PdfValue = new PdfName("New Value");
// CombTextField の値を変更します。
var ctf = (CombTextField)doc.AcroForm.Fields[3];
ctf.PdfValue = new PdfName("NEW");
// AcroFormのNeedAppearancesエントリを設定します。
doc.AcroForm.Set(PdfName.Std.NeedAppearances, PdfBool.True);
// PDF ファイルを保存します。
doc.Save("TextField.pdf");
}using (FileStream fs = new FileStream("Sample.pdf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// GcPdfDocument を初期化します。
GcPdfDocument doc = new GcPdfDocument();
// PDF ファイルをロードし、復号化オプションを false に設定します。
doc.Load(fs, new DecryptionOptions() { ThrowExceptionIfInvalidPassword = false, ThrowExceptionIfUnsupportedSecurityOptions = false });
// ページ数とページのサイズを取得します。
Console.WriteLine($"Page count: {doc.Pages.Count}");
Console.WriteLine();
foreach (Page page in doc.Pages)
{
var sz = page.GetRenderSize();
Console.WriteLine($"Size of {page.Index} page: {sz.Width}x{sz.Height}");
}
}!type=note
メモ:ライセンス キーなしで DioDocs for PDF を使用する場合、パスワードを指定せずにパスワードで保護された PDF を操作すると、多くの制限があります (たとえば、PDF を変更して保存しようとすると、ライセンスナグテキストが追加されるため失敗します)。30 日間のトライアルライセンスを取得するには、sales@mescius.com にお問い合わせください。
DioDocs for PDF を使用してセキュリティを適用する方法については、DioDocs for PDF サンプルブラウザを参照してください。