レポートを生成し、iText を使用して PDF に保存する Web アプリケーションがあります。ユーザーがこのファイルの内容をコピーできないようにします。これは、pdfコンテンツを画像に変換してからその画像をpdfに追加することで実現できると思いましたが、iTextはpdfを画像に変換できないようです。
iTextを使用してこれを行う方法はありますか?
レポートを生成し、iText を使用して PDF に保存する Web アプリケーションがあります。ユーザーがこのファイルの内容をコピーできないようにします。これは、pdfコンテンツを画像に変換してからその画像をpdfに追加することで実現できると思いましたが、iTextはpdfを画像に変換できないようです。
iTextを使用してこれを行う方法はありますか?
@YuriyGalanter が示したように、PDF の制限付きのアクセス許可は、主に PDF の暗号化のコンテキストで定義されています。PDF 仕様ISO 32000-1:2008のセクション 7.6.3.1 :
パスワードまたはアクセス制限が指定されている場合、ドキュメントは暗号化され、パスワードを検証するために必要な権限と情報が暗号化辞書に格納されます。添付ファイルのみが暗号化されているドキュメントは、ユーザーおよび所有者のパスワードと同じパスワードを使用する必要があります。
正しい所有者パスワードでドキュメントを開くと、ドキュメントへのフル (所有者) アクセスが許可されます。この無制限のアクセスには、ドキュメントのパスワードとアクセス許可を変更する機能が含まれます。
正しいユーザー パスワードでドキュメントを開く (または既定のパスワードでドキュメントを開く) と、ドキュメントの暗号化辞書で指定されたユーザー アクセス許可に従って、追加の操作を実行できるようになります。
したがって、PDF が所有者パスワードを使用して暗号化され、ユーザー パスワードが使用されていない場合、誰でも PDF を開くことができ、暗号化中に選択された権限によって制限されます。所有者パスワードを使用してその PDF を開くことが許可されている人だけが、PDF に無制限にアクセスできます。
明らかに、そのようなスキームは簡単に破られ、保護が解除されます。これは、PDF 処理ソフトウェアの倫理的な動作に依存します。
iText in Action — 2nd Editionの第 12 章のEncryptionPdf.javaの例は、iTextを使用して暗号化を適用する方法を示しています。
この方法createPdf
は、新しい PDF を作成するときに暗号化を適用する方法を示しています。
public void createPdf(String filename) throws IOException, DocumentException {
// step 1
Document document = new Document();
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
writer.setEncryption(USER, OWNER, PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128);
writer.createXmpMetadata();
// step 3
document.open();
// step 4
document.add(new Paragraph("Hello World"));
// step 5
document.close();
}
この方法encryptPdf
は、既存の PDF を暗号化する方法を示しています。
public void encryptPdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.setEncryption(USER, OWNER,
PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA);
stamper.close();
reader.close();
}
USER
とOWNER
は、上記のユーザーと所有者のパスワードです。
このサンプルでは、権限を 1 つだけ設定しPdfWriter.ALLOW_PRINTING
ます。他にも複数あります。単にすべてのALLOW_*
定数を調べてくださいPdfWriter.