AEM Document Services を使用して Maven プロジェクトを構築するために必要なクライアントクラスは、https://repo.adobe.com/nexus/content/groups/public/com/adobe/aemfd/aemfd-client-sdk/6.1.0/ にある SDK jar ファイルから取得することができます。Maven を使用した AEM プロジェクトの構築などに関する情報については、http://docs.adobe.com/docs/jp/aem/6-0/develop/dev-tools/ht-projects-maven.html を参照してください。

注意:

DocAssurance サービスの API を使用する前に、DocAssurance サービスの設定を行ってください。

Doc Assurance サービス

DocAssurance サービスには以下のサービスが含まれています。

  • Signature サービス
  • Encryption サービス
  • Reader Extension サービス

注意:

Document オブジェクトを Javadoc の入力パラメーターとして使用しているこれらすべてのサービスは、次のURL http://helpx.adobe.com/jp/aem-forms/6/javadocs/ で確認することができます。

非表示署名フィールドの追加

署名は、署名の画像表示を含むフォームフィールドである署名フィールドに表示されます。署名フィールドは、表示または非表示に設定することができます。署名者は既存の署名フィールドを使用することができます。また、プログラムによって署名フィールドを追加することもできます。どちらの場合においても、PDF ドキュメントに署名できるようにするには、署名フィールドが存在している必要があります。プログラムによって署名フィールドを追加するには、Signature サービス Java API や 署名 Web サービス API を使用します。1 つの PDF ドキュメントに、複数の PDF フィールドを追加することができます。ただし、それぞれの署名フィールドには一意の名前を設定する必要があります。

構文addInvisibleSignatureField(Document inDoc, String signatureFieldName, FieldMDPOptionSpec fieldMDPOptionsSpec, PDFSeedValueOptionSpec seedValueOptionsSpec, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc PDF を含む document オブジェクトです。
signatureFieldName
署名フィールドの名前です。このパラメーターは必須であり、null を値として持つことはできません。
fieldMDPOptionsSpec 署名フィールドへの署名後にロックされる PDF ドキュメントフィールドを指定する FieldMDPOptionSpec オブジェクトです。このパラメーターはオプションであり、null 値を受け取ることができます。
seedValueOptionsSpec フィールドのさまざまなシード値を指定する SeedValueOptions オブジェクトです。このパラメーターはオプションであり、null 値を受け取ることができます。
unlockOptions 暗号化ファイルのロックを解除するために必要なパラメーターが含まれます。このパラメーターは、暗号化ファイルにのみ必要です。

PDF ドキュメントに非表示の署名フィールドを作成する Java コードのサンプルを以下に示します。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * ___________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.io.IOException;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.PositionRectangle;
import com.adobe.fd.signatures.client.types.exceptions.DuplicateSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesBaseException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 * Digital signatures appear in signature fields, which are form fields that contain a graphic representation of the signature. 
 * Signature fields can be visible or invisible. Signers can use a pre existing signature field, or a signature field can be 
 * programmatically added. In either case, the signature field must exist before a PDF document can be signed.
 * You can programmatically add a signature field by using the Signature service Java API or Signature web service API. 
 * You can add more than one signature field to a PDF document; however, each signature field name must be unique.
 * 
 * The following Java code example adds an invisible signature field named SignatureField1 to a PDF document.
 */

@Component
@Service(value=AddInvisibleSignatureField.class)
public class AddInvisibleSignatureField {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	/**
	 * 
	 * @param inputFile - path to an pdf document stored at disk
	 * @param outputFile - path where the output file has to be saved 
	 * @throws SignaturesBaseException 
	 * @throws DuplicateSignatureFieldException 
	 * @throws PermissionsException 
	 * @throws PDFOperationException 
	 * @throws InvalidArgumentException 
	 * @throws DocAssuranceException 
	 * 
	 */
	public void addInvisibleSignatureField(String inputFile, String outputFile) throws InvalidArgumentException, PDFOperationException, PermissionsException, DuplicateSignatureFieldException, SignaturesBaseException, DocAssuranceException {
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		File outFile = new File(outputFile);
		Document outDoc = null;
		
        //Specify the name of the signature field
        String fieldName = "SignatureField1";

        //Create a  PositionRectangle object that specifies
        //the signature fields location
        PositionRectangle post = new  PositionRectangle(193,47,133,12);

        //Specify the page number that will contain the signature field
        java.lang.Integer pageNum = new java.lang.Integer(1);

        //Add a signature field to the PDF document
        try {
			outDoc = docAssuranceService.addInvisibleSignatureField(
			    inDoc,
			    fieldName,
			    null,
			    null,
			    null);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} // for an encrypted PDF input, pass unlock options
       
        //save the outDoc
        try {
			outDoc.copyToFile(outFile);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * UnlockOptions to be passed to addSignatureField() API to add a signature field in an encrypted pdf document.
	 */
	private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

署名フィールドの追加

プログラムによって署名フィールドを追加するには、Signature サービス Java API や 署名 Web サービス API を使用します。1 つの PDF ドキュメントに、複数の署名フィールドを追加することができます。ただし、それぞれの署名フィールドには一意の名前を設定する必要があります。

構文public Document addSignatureField(Document inDoc,
String signatureFieldName,
Integer pageNo,
PositionRectangle positionRectangle,
FieldMDPOptionSpec fieldMDPOptionsSpec,
PDFSeedValueOptionSpec seedValueOptionsSpec, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc PDF を含む document オブジェクトです
signatureFieldName 署名フィールドの名前です。このパラメーターは必須であり、null 値を受け付けることはできません。
pageNumber 署名フィールドを追加するページ番号です。有効な値は、1 からドキュメントに含まれているページの数までです。このパラメーターは必須であり、null 値を受け付けることはできません。
positionRectangle 署名フィールドの位置を指定するPositionRectangle オブジェクトです。このパラメーターは必須であり、null 値を受け付けることはできません。指定した長方形が指定したページのクロップボックス上に一部でも重なっていない場合は、InvalidArgumentException が発生します。また、指定した長方形の高さと幅のいずれに対しても、0 または負の値を設定することはできません。左下の X 座標または Y 座標は、ページのクロップボックスを基準とする相対位置です。0 またはそれ以上の値を設定することができますが、負の値を設定することはできません。
fieldMDPOptionsSpec 署名フィールドへの署名後にロックされる PDF ドキュメントフィールドを指定する FieldMDPOptionSpec オブジェクトです。これはオプションのパラメーターであるため、null に指定することもできます。
seedValueOptionsSpec フィールドのさまざまなシード値を指定する SeedValueOptions オブジェクトです。これはオプションのパラメーターであるため、null に指定することもできます。
unlockOptions 暗号化されたファイルのロックを解除するために必要なパラメーターなどがあります。このパラメーターは、ファイルが暗号化されている場合にのみ必要となります。

PDF ドキュメントに署名フィールドを作成する Java コードのサンプルを以下に示します。

/*************************************************************************
 *
-------------------------------------------------------------
*ADOBE SYSTEMS INCORPORATED
*Copyright 2014 Adobe Systems Incorporated
*All Rights Reserved.

*NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the 
*terms of the Adobe license agreement accompanying it.  If you have received this file from a 
*source other than Adobe, then your use, modification, or distribution of it requires the prior 
*written permission of Adobe.
-------------------------------------------------------------------------------------------------

 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.io.IOException;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.PositionRectangle;
import com.adobe.fd.signatures.client.types.exceptions.DuplicateSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesBaseException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 * Digital signatures appear in signature fields, which are form fields that contain a graphic representation of the signature. 
 * Signature fields can be visible or invisible. Signers can use a pre existing signature field, or a signature field can be 
 * programmatically added. In either case, the signature field must exist before a PDF document can be signed.
 * You can programmatically add a signature field by using the Signature service Java API or Signature web service API. 
 * You can add more than one signature field to a PDF document; however, each signature field name must be unique.
 * 
 * The following Java code example adds a signature field named SignatureField1 to a PDF document.
 */

@Component
@Service(value=AddSignatureField.class)
public class AddSignatureField {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	/**
	 * 
	 * @param inputFile - path to an pdf document stored at disk
	 * @param outputFile - path where the output file has to be saved 
	 * @throws SignaturesBaseException 
	 * @throws DuplicateSignatureFieldException 
	 * @throws PermissionsException 
	 * @throws PDFOperationException 
	 * @throws InvalidArgumentException 
	 * @throws DocAssuranceException 
	 * 
	 */
	public void addSignatureField(String inputFile, String outputFile) throws InvalidArgumentException, PDFOperationException, PermissionsException, DuplicateSignatureFieldException, SignaturesBaseException, DocAssuranceException {
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		File outFile = new File(outputFile);
		Document outDoc = null;
		
        //Specify the name of the signature field
        String fieldName = "SignatureField1";

        //Create a  PositionRectangle object that specifies
        //the signature fields location
        PositionRectangle post = new  PositionRectangle(193,47,133,12);

        //Specify the page number that will contain the signature field
        java.lang.Integer pageNum = new java.lang.Integer(1);

        //Add a signature field to the PDF document
        try {
			outDoc = docAssuranceService.addSignatureField(
			    inDoc,
			    fieldName,
			    pageNum,
			    post,
			    null,
			    null,
			    null);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} // for an encrypted PDF input, pass unlock options
       
        //save the outDoc
        try {
			outDoc.copyToFile(outFile);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * UnlockOptions to be passed to addSignatureField() API to add a signature field in an encrypted pdf document.
	 */
	private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

署名の取得

署名または認証する PDF ドキュメント内のすべての署名フィールドの名前を取得できます。PDF ドキュメント内の署名フィールド名が分からない場合や、名前を検証したい場合に、プログラムによって名前を取得することができます。Signature サービスは、次のような署名フィールドの完全修飾名を返します。form1[0].grantApplication[0].page1[0].SignatureField1[0]

構文getSignature(Document doc, String signatureFieldName, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
doc
PDF を含む document オブジェクトです。
signatureFieldName 署名が含まれている署名フィールドの名前です。署名フィールドの完全修飾名を指定します。XFA フォームに基づく PDF ドキュメントを使用する場合は、署名フィールドの名前の一部を使用できます。例えば、form1[0].#subform[1].SignatureField3[3]SignatureField3[3] として指定できます。
UnlockOptions 暗号化されたファイルのロックを解除するために必要なパラメーターなどがあります。ファイルが暗号化されている場合にのみ必要となります。

以下の Java コードの例を使用することで、PDF ドキュメント内にある特定の署名フィールドの署名情報を取得することができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * ___________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.PDFSignatureField;
import com.adobe.fd.signatures.client.types.exceptions.DuplicateSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesBaseException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.adobe.fd.signatures.client.types.PDFSignature;

/**
 * You can retrieve the names of all signature fields that are located in a PDF document that you want to sign or certify. 
 * If you are unsure of the signature field names that are located in a PDF document or you want to verify the names, you can
 * programmatically retrieve them. The Signature service returns the fully qualified name of the signature field, such as 
 * form1[0].grantApplication[0].page1[0].SignatureField1[0].
 * 
 * The following Java code example retrieves the Signature Info for the given signature field located in a PDF document.
 */

@Component
@Service(value=GetSignature.class)
public class GetSignature {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at disk
	 * @throws SignaturesBaseException 
	 * @throws DuplicateSignatureFieldException 
	 * @throws PermissionsException 
	 * @throws PDFOperationException 
	 * @throws InvalidArgumentException 
	 * 
	 */
	public void GetSignature(String inputFile) throws Exception {
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
	      
		//Retrieve signature data for a given signature field.
		//for encrypted document pass Unlock Options - see the method getUnlockOptions() below
        PDFSignature pdfSignature = docAssuranceService.getSignature(inDoc,"fieldName",null);
        
   }
       
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

署名フィールドリストの取得

署名または認証する PDF ドキュメント内のすべての署名フィールドの名前を取得できます。PDF ドキュメント内の署名フィールド名が分からない場合に、プログラムによって名前を取得し、検証することができます。Signature サービスは、次のような署名フィールドの完全修飾名を返します。form1[0].grantApplication[0].page1[0].SignatureField1[0]

構文public List <PDFSignatureField> getSignatureFieldList (Document inDoc, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc PDF を含む document オブジェクトです。
unlockOptions 暗号化されたファイルのロックを解除するために必要なパラメーターなどがあります。ファイルが暗号化されている場合にのみ必要となります。

以下の Java コードの例は、PDF ドキュメント内にある署名フィールドの名前を取得します。

/*************************************************************************
 *
 *
-------------------------------------------------------------
*ADOBE SYSTEMS INCORPORATED
*Copyright 2014 Adobe Systems Incorporated
*All Rights Reserved.

*NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the 
*terms of the Adobe license agreement accompanying it.  If you have received this file from a 
*source other than Adobe, then your use, modification, or distribution of it requires the prior 
*written permission of Adobe.
-------------------------------------------------------------------------------------------------
**************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.PDFSignatureField;
import com.adobe.fd.signatures.client.types.exceptions.DuplicateSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesBaseException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 * You can retrieve the names of all signature fields that are located in a PDF document that you want to sign or certify. 
 * If you are unsure of the signature field names that are located in a PDF document or you want to verify the names, you can
 * programmatically retrieve them. The Signature service returns the fully qualified name of the signature field, such as 
 * form1[0].grantApplication[0].page1[0].SignatureField1[0].
 * 
 * The following Java code example retrieves the names of signature fields located in a PDF document.
 */

@Component
@Service(value=GetSignatureFields.class)
public class GetSignatureFields {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at disk
	 * @throws SignaturesBaseException 
	 * @throws DuplicateSignatureFieldException 
	 * @throws PermissionsException 
	 * @throws PDFOperationException 
	 * @throws InvalidArgumentException 
	 * 
	 */
	public void getSignatureFields(String inputFile) throws Exception {
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
	      
		//Retrieve the name of the document's signature fields
		//for encrypted document pass Unlock Options - see the method getUnlockOptions() below
        List fieldNames = docAssuranceService.getSignatureFieldList(inDoc,null);

        //Obtain the name of each signature field by iterating through the 
        //List object
        Iterator iter = fieldNames.iterator(); 
        int i = 0 ; 
        String fieldName="";
        while (iter.hasNext()) { 
            PDFSignatureField signatureField = (PDFSignatureField)iter.next(); 
            fieldName = signatureField.getName();
            System.out.println("The name of the signature field is " +fieldName); 
            i++;
        }
   }
       
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

署名フィールドの変更

PDF ドキュメント内の署名フィールドを変更できます。署名フィールドの署名フィールドロックディクショナリまたはシード値ディクショナリの値を操作することで署名フィールドを変更します。

フィールドロックディクショナリは、署名フィールドへの署名時にロックするフィールドのリストを指定します。フィールドがロックされると、ユーザーはそのフィールドを編集できません。シード値ディクショナリには、署名の適用時に使用される制約情報が含まれます。例えば、署名を無効にすることなく実行できるアクションを制御する権限設定を変更することができます。

既存の署名フィールドを変更することで、PDF を編集し、ビジネス要件の変更を反映させることができます。例えば、新しいビジネス要件ではドキュメントに署名が行われたあと、すべてのドキュメントフィールドをロックしなければいけない場合などです。

構文public Document modifySignatureField(Document inDoc, String signatureFieldName, PDFSignatureFieldProperties pdfSignatureFieldProperties, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc PDF を含む document オブジェクトです。
signatureFieldName 署名フィールドの名前です。このパラメーターは必須であり、null 値を受け付けることはできません。
pdfSignatureFieldProperties 署名フィールドの PDFSeedValueOptionSpecFieldMDPOptionSpec の情報を指定するオブジェクトです。
unlockOptions 暗号化されたファイルのロックを解除するために必要なパラメーターなどがあります。ファイルが暗号化されている場合にのみ必要となります。

以下の Java コードのサンプルを使用することで、署名フィールドに署名が適用された際に、フォーム内のすべてのフィールドをロックして署名フィールドを修正することができます。 

/*************************************************************************
 *

-------------------------------------------------------------
*ADOBE SYSTEMS INCORPORATED
*Copyright 2014 Adobe Systems Incorporated
*All Rights Reserved.

*NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the 
*terms of the Adobe license agreement accompanying it.  If you have received this file from a 
*source other than Adobe, then your use, modification, or distribution of it requires the prior 
*written permission of Adobe.
-------------------------------------------------------------------------------------------------

 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.FieldMDPAction;
import com.adobe.fd.signatures.client.types.FieldMDPOptionSpec;
import com.adobe.fd.signatures.client.types.MDPPermissions;
import com.adobe.fd.signatures.client.types.PDFSeedValueOptionSpec;
import com.adobe.fd.signatures.client.types.PDFSignatureFieldProperties;
import com.adobe.fd.signatures.client.types.PositionRectangle;
import com.adobe.fd.signatures.client.types.exceptions.DuplicateSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.MissingSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignatureFieldSignedException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesBaseException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesOtherException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 * You can modify signature fields that are located in a PDF document by using the Java API and web service API. Modifying a signature field involves
 * manipulating its signature field lock dictionary values or seed value dictionary values.
 * A field lock dictionary specifies a list of fields that are locked when the signature field is signed. A locked field prevents users from making 
 * changes to the field. A seed value dictionary contains constraining information that is used at the time the signature is applied. 
 * For example, you can change permissions that control the actions that can occur without invalidating a signature.
 * By modifying an existing signature field, you can make changes to the PDF document to reflect changing business requirements. For example, 
 * a new business requirement may require locking all document fields after the document is signed.
 * This section explains how to modify a signature field by amending both field lock dictionary and seed value dictionary values. 
 * Changes made to the signature field lock dictionary result in all fields in the PDF document being locked when a signature field is signed. 
 * Changes made to the seed value dictionary prohibit specific types of changes to the document.
 * 
 * The following Java code example modifies a signature field named SignatureField1 by locking all fields in the form when a signature is applied to the signature field and ensuring that no changes are allowed. 
 * After the Signature service returns the PDF document that contains the modified signature field
 */

@Component
@Service(value=ModifySignatureField.class)
public class ModifySignatureField {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at disk
	 * @param outFile - path where the output file has to be saved
	 * 
	 * 
	 */
	public void modifySignatureField(String inputFile, String outFile) throws Exception {
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);

		//Specify the name of the signature field
        String fieldName = "SignatureField1";
        
        //Create a PDFSignatureFieldProperties
        PDFSignatureFieldProperties fieldProperties = new PDFSignatureFieldProperties();
         
         //Create a PDFSeedValueOptionSpec object that stores 
         //seed value dictionary information.
         PDFSeedValueOptionSpec seedOptionsSpec = new PDFSeedValueOptionSpec();
         
         //Disallow changes to the PDF document. Any change to the document invalidates 
         //the signature
         seedOptionsSpec.setMdpValue(MDPPermissions.NoChanges);
         
         //Create a FieldMDPOptionSpec object that stores 
         //signature field lock dictionary information.
         FieldMDPOptionSpec fieldMDPOptionsSpec = new FieldMDPOptionSpec();    
         
         //Lock all fields in the PDF document
         fieldMDPOptionsSpec.setAction(FieldMDPAction.ALL);
         
         //Set dictionary information
         fieldProperties.setSeedValue(seedOptionsSpec);
         fieldProperties.setFieldMDP(fieldMDPOptionsSpec);
                 
         //Modify the signature field
         //for encrypted document pass Unlock Options - see the method getUnlockOptions() below
         Document modSignatureField =  docAssuranceService.modifySignatureField(inDoc,fieldName,fieldProperties,null);
       
        //save the modSignatureField
         modSignatureField.copyToFile(new File(outFile));
	}
	
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

PDF ドキュメントの認証

認証署名と呼ばれる特定のタイプの署名によって PDF ドキュメントを認証することで、PDF ドキュメントを保護することができます。認証署名は、以下の方法で電子署名と区別されます。

  • 認証署名は PDF ドキュメントに適用される最初の署名です。つまり、認証署名が適用されるときは、ドキュメント内の他の署名フィールドは未署名でなければいけません。認証署名は 1 つの PDF ドキュメントにつき 1 つです。PDF ドキュメントを署名および認証するには、署名の前に認証を行ってください。PDF ドキュメントの認証後、他の署名フィールドに電子署名を行うことができます。
  • ドキュメントの作成者または発信者は、認証署名を無効にすることなく、特定の方法でドキュメントの変更が可能になるように指定することができます。例えば、フォームへの入力やコメント入力を許可するドキュメントなどがあります。作成者が特定の変更を許可しない設定を行った場合は、Acrobat によってその方法によるドキュメントの変更が制限されます。そのような変更が行われた場合は、認証署名は無効となります。さらに、Acrobat はユーザーがドキュメントを開いた際に警告を発します。(未認証の署名では、変更を防ぐことはできません。また、通常の編集操作では元の署名は無効になりません。)
  • 署名時に、ドキュメントのコンテンツにあいまいさや誤解をもたらす可能性のある、特定の種類のコンテンツをスキャンします。例えば、注釈により、認証される対象を把握するために重要なページ上のテキストが隠れてしまう場合があります。そのようなコンテンツに関する、説明(法的証明)を提供することができます。
構文secureDocument(Document inDoc, EncryptionOptions encryptionOptions,
SignatureOptions signatureOptions, ReaderExtensionOptions readerExtensionOptions, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc
PDF ドキュメントを入力するドキュメント
encryptionOptions
PDF ドキュメントの暗号化に必要な引数が含まれます
signatureOptions PDF ドキュメントへの署名や認証に必要なオプションが含まれます
readerExtensionOptions PDF ドキュメントの Reader 用の拡張に必要なオプションが含まれます
unlockOptions 暗号化されたファイルのロックを解除するために必要なパラメーターが含まれます。ファイルが暗号化されている場合にのみ必要となります。

以下のコードのサンプルを使用することで、PDF ファイルに基づいた PDF ドキュメントを認証することができます。 

/*************************************************************************

-------------------------------------------------------------
*ADOBE SYSTEMS INCORPORATED
*Copyright 2014 Adobe Systems Incorporated
*All Rights Reserved.

*NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the 
*terms of the Adobe license agreement accompanying it.  If you have received this file from a 
*source other than Adobe, then your use, modification, or distribution of it requires the prior 
*written permission of Adobe.
-------------------------------------------------------------------------------------------------

 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.io.IOException;

import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.docassurance.client.api.DocAssuranceServiceOperationTypes;
import com.adobe.fd.docassurance.client.api.SignatureOptions;
import com.adobe.fd.signatures.client.types.MDPPermissions;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.pdf.inputs.CredentialContext;
import com.adobe.fd.signatures.pdf.inputs.DSSPreferences;
import com.adobe.fd.signatures.pdf.inputs.DSSPreferencesImpl;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions.PDFSignatureAppearanceType;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions.TextDirection;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.adobe.fd.signatures.pki.client.types.common.HashAlgorithm;
import com.adobe.fd.signatures.pki.client.types.common.RevocationCheckStyle;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.GeneralPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferencesImpl;

/**
 * You can secure a PDF document by certifying it with a particular type of signature called a certified signature. 
 * A certified signature is distinguished from a digital signature in these ways:
 * 
 * It must be the first signature applied to the PDF document; that is, at the time the certified signature is applied, any other signature fields in the document must be unsigned.
 * Only one certified signature is permitted in a PDF document. If you want to sign and certify a PDF document, you must certify it before signing it. 
 * After you certify a PDF document, you can digitally sign additional signature fields.
 * 
 * The author or originator of the document can specify that the document can be modified in certain ways without invalidating the certified signature. For example, 
 * the document may permit filling in forms or commenting. If the author specifies that a certain modification is not permitted, Acrobat restricts users from modifying the document 
 * in that way. If such modifications are made, such as by using another application, the certified signature is invalid and Acrobat issues a warning when a user opens the document. 
 * (With non-certified signatures, modifications are not prevented, and normal editing operations do not invalidate the original signature.)
 * 
 * At the time of signing, the document is scanned for specific types of content that could make the contents of a document ambiguous or misleading. For example, an annotation could 
 * obscure some text on a page that is important for understanding what is being certified. An explanation (legal attestation) can be provided about such content.
 * You can programmatically certify PDF documents by using the Signature service Java API or the Signature web service API. When certifying a PDF document, you must reference a security 
 * credential that exists in the Credential service.
 * 
 * Note: When certifying and signing the same PDF document, if the certify signature is not trusted, a yellow triangle appears next to the first sign signature when you open the PDF document in Acrobat or Adobe Reader. 
 * The certifying signature must be trusted to avoid this situation.
 * 
 * The following Java code example certifies a PDF document that is based on a PDF file. 
 * 
 * PreRequisites - Digital certificate for certifying the document has to be uploaded on AEM Key Store.
 *
 */

@Component
@Service(value=Certify.class)
public class Certify {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	@Reference
    private SlingRepository slingRepository;
	
	@Reference
    private JcrResourceResolverFactory jcrResourceResolverFactory ;
	
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at JCR node 
	 * @param outputFile - path to the pdf document where the output needs to be stored
	 * @throws IOException
	 * @throws RepositoryException
	 * @throws InvalidArgumentException
	 * @throws DocAssuranceException
	 */
	public void certify(String inputFile, String outputFile) throws IOException, RepositoryException, InvalidArgumentException, DocAssuranceException{
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		File outFile = new File(outputFile);
		Document outDoc = null;
		
		Session adminSession = null;
        ResourceResolver resourceResolver = null;
        try {
        	 
        	 /** resourceResolver to be passed to SignatureServiceAPI and Reader Extensions
        	 the resource resolver for signature options has to be corresponding to the user who has the signing certificate in his granite key store
        	 the resource resolver for signature options has to be corresponding to the user who has the credential for reader extension in his granite key store
        	 here we are using the same resource resolver
        	 */
        	 adminSession = slingRepository.loginAdministrative(null);
             resourceResolver = jcrResourceResolverFactory.getResourceResolver(adminSession);
             
             //retrieve specifications for each of the services, you may pass null if you don't want to use that service
             //we are not extending the reader in this case, so passing null
             //for encrypted document pass Unlock Options - see the method getUnlockOptions() below
			 try {
				outDoc = docAssuranceService.secureDocument(inDoc, null, getCertificationOptions(resourceResolver), null,null);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			 
        }
        finally{
            /**
             * always close the PDFDocument object after your processing is done.
             */
            if(inDoc != null){
                inDoc.close();
            }
            if(adminSession != null && adminSession.isLive()){
                if(resourceResolver != null){
                    resourceResolver.close();
                }
                adminSession.logout();
            }
        }
        
        outDoc.copyToFile(outFile);
		
		
	}
	
	/**
	 * 
	 * @param rr resource resolver corresponding to the user with the access to signing credential for the 
	 * given alias "allcertificatesanypolicytest11ee_new" in this case
	 * @return SignatureOptions
	 */
	private SignatureOptions getCertificationOptions(ResourceResolver rr){
		
		//create an instance of SignatureOptions
		SignatureOptions signatureOptions = SignatureOptions.getInstance();
		
		//set the operation you want to perform - SIGN/CERTIFY
		signatureOptions.setOperationType(DocAssuranceServiceOperationTypes.CERTIFY);
		
		//signature field to certify, pass null if invisible signature field
		String fieldName = "Signature1" ;
		
		//alias of the private credential uploaded on the Key Store
        String alias = "allcertificatesanypolicytest11ee_new";
        
        //Hash Algo to be used to compute digest the PDF document
        HashAlgorithm algo = HashAlgorithm.SHA256;
        
        //Reason for signing/certifying
        String reason = "Reason";
        
        //location of the signer
        String location = "Location";
        
        //contact info of the signer
        String contactInfo = "Contact Info";
        
        //DocMDP Permissions associated with certification
        MDPPermissions mdpPermissions = MDPPermissions.valueOf("FormChanges");
        
        //Create a PDFSignatureAppearanceOptions object 
        //and show date information
        PDFSignatureAppearenceOptions appOptions = new PDFSignatureAppearenceOptions(
                PDFSignatureAppearanceType.NAME, null, 1.0d, null, true, true,
                true, true, false, true, true, TextDirection.AUTO);
        signatureOptions.setLockCertifyingField(true);
        signatureOptions.setSignatureFieldName(fieldName);
        signatureOptions.setAlgo(algo);
        signatureOptions.setContactInfo(contactInfo);
        signatureOptions.setLocation(location);
        signatureOptions.setSigAppearence(appOptions);
        signatureOptions.setReason(reason);
        signatureOptions.setDssPref(getDSSPreferences(rr));
        signatureOptions.setCredential(new CredentialContext(alias, rr));
        signatureOptions.setMdpPermissions(mdpPermissions);
		return signatureOptions;
	}
	
	private DSSPreferences getDSSPreferences(ResourceResolver rr){
		//sets the DSS Preferences
        DSSPreferencesImpl prefs = DSSPreferencesImpl.getInstance();
        prefs.setPKIPreferences(getPKIPreferences());
        GeneralPreferencesImpl gp = (GeneralPreferencesImpl) prefs.getPKIPreferences().getGeneralPreferences();
        gp.setDisableCache(true);
        return prefs;
    }
    
    private PKIPreferences getPKIPreferences(){
    	//sets the PKI Preferences
        PKIPreferences pkiPref = new PKIPreferencesImpl();
        pkiPref.setCRLPreferences(getCRLPreferences());
        pkiPref.setPathPreferences(getPathValidationPreferences());
        return pkiPref;
    }
    
    private CRLPreferences getCRLPreferences(){
        //specifies the CRL Preferences
        CRLPreferencesImpl crlPrefs = new CRLPreferencesImpl();
        crlPrefs.setRevocationCheck(RevocationCheckStyle.CheckIfAvailable);
        crlPrefs.setGoOnline(true);
        return crlPrefs;
    }
    
    private PathValidationPreferences getPathValidationPreferences(){
    	//sets the path validation preferences
        PathValidationPreferencesImpl pathPref = new PathValidationPreferencesImpl();
        pathPref.setDoValidation(false);
        return pathPref;
        
    }
    
    /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
    
    
}

ドキュメントの保護

secureDocument を使用することで、PDF ドキュメントの暗号化、署名および認証、Reader 用の拡張を個別に、もしくは任意の順序で組み合わせて行うことができます。これらの機能にアクセスするには、対応する引数を渡してください。Null 値の場合、特別な処理の必要がないとみなされます。

PDF ドキュメントのパスワードによる暗号化

PDF ドキュメントをパスワードで暗号化する場合、ユーザーは Adobe Reader または Acrobat で PDF ドキュメントを開くためのパスワードを指定する必要があります。また、ほかの AEM Forms Document Services の操作によってドキュメントが使用される場合は、パスワードで暗号化された PDF ドキュメントのロックが解除されている必要があります。

証明書による PDF ドキュメントの暗号化

証明書ベースの暗号化では、公開鍵による暗号化を使用して、特定の受信者用にドキュメントを暗号化できます。

それぞれの受信者に、異なる権限を与えることができます。公開鍵によって、さまざまな暗号化を行うことができます。

アルゴリズムによって、大きい数字が 2 つ生成されます。この数字は以下のようなプロパティを持つ鍵として知られています。

  • 鍵のうち 1 つは、一連のデータを暗号化するために使用されます。その後、もう片方の鍵のみがデータの復号に使用できます。
  • 1 つの鍵を、もう片方の鍵と区別することは不可能です。
  • 鍵のうち 1 つは、ユーザーの秘密鍵として機能します。そのユーザーのみがこの鍵にアクセスできることが重要です。
  • もう 1 つのキーはユーザーの公開鍵です。これは、他のユーザーと共有できます。

公開鍵証明書には、ユーザーの公開鍵と識別情報が含まれます。証明書の保存には、X.509 形式が使用されます。通常、証明書は認証局(CA)で発行および電子署名されます。CA は、証明書の有効性における信頼度を提供する、承認されたエンティティです。証明書には有効期限があり、この期限を過ぎると無効になります。

また、証明書の失効リスト(CRL)には、有効期限よりも前に失効した証明書に関する情報が示されます。CRL は認証局によって定期的に発行されます。証明書の失効ステータスは、ネットワークを通じてオンライン証明書ステータスプロトコル(OCSP)から取得することもできます。

注意PDF ドキュメントを証明書で暗号化できるようにするには、まず AEM Trust Store に証明書が追加されていることを確認する必要があります。

PDF ドキュメントへの使用権限の適用

Reader Extensions Java クライアント API および Web サービスを使用すると、PDF ドキュメントに使用権限を適用することができます。使用権限は、Acrobat ではデフォルトで利用できるが Adobe Reader では利用できない機能(フォームにコメントを追加する機能や、フォームフィールドにデータを入力してフォームを保存する機能など)に関連しています。使用権限が与えられた PDF ドキュメントは、使用権限を付与されたドキュメントと呼ばれます。使用権限を付与されたドキュメントを Adobe Reader で開いたユーザーは、そのドキュメントで有効になっている操作を実行できます。

証明書を使用して PDF ドキュメントの Reader 用拡張を行う場合は、まず AEM キーストアに証明書が追加されていることを確認する必要があります。

PDF 文書へのデジタル署名

セキュリティレベルの提供のため、PDF に電子署名を適用することができます。手書き署名のような電子署名は、署名者を識別したり、ドキュメントに関するステートメントを作成する手段として使用できます。

ドキュメントの電子署名に使用されている技術は、署名者と受信者の両方が、何に署名されているのかを明確にし、その署名によりドキュメントに変更がないことを確認するのに役立ちます。

PDF ドキュメントは、公開鍵を用いて署名されます。署名者は公開鍵と秘密鍵の 2 つの鍵を持っています。秘密鍵はユーザーの資格情報に保存されます。資格情報は署名するときに利用可能になっている必要があります。

公開鍵はユーザーの証明書に保存されています。署名を検証するには、受信者はその証明書を使用可能である必要があります。失効した証明書に関する情報は、認証機関から配布される証明書失効リスト(CRL)およびオンライン証明書ステータスプロトコル(OCSP)応答内にあります。署名が行われた時間は、タイムスタンプ局として知られる信頼できるソースから取得されます。

注意証明書を使用して PDF ドキュメントに電子署名を行う場合は、まず AEM キーストアに証明書が追加されていることを確認する必要があります。証明書は署名に使用する秘密鍵となります

PDF ドキュメントの認証

認証署名と呼ばれる特定のタイプの署名によって PDF ドキュメントを認証することで、PDF ドキュメントを保護することができます。認証署名は、以下の方法で電子署名と区別されます。

認証署名は PDF ドキュメントに適用される最初の署名です。つまり、認証署名が適用されるときは、ドキュメント内の他の署名フィールドは未署名でなければいけません。

認証署名は 1 つの PDF ドキュメントにつき 1 つです。PDF ドキュメントを署名および認証するには、署名の前に認証を行う必要があります。

PDF ドキュメントの認証後、他の署名フィールドに電子署名を行うことができます。

ドキュメントの作成者または発信者は、認証署名を無効にすることなく、特定の方法でドキュメントの変更を行うことができるよう指定することができます。

例えば、フォームへの入力やコメント入力を許可するドキュメントなどがあります。作成者が特定の変更を許可しないように設定を行った場合は、

Acrobat はユーザーのその方法によるドキュメントの変更を制限します。別のアプリケーションを使用するなどしてそのような変更が行われた場合は、認証署名は無効となり、Acrobat はユーザーがドキュメントを開いた際に警告を発します。(未認証の署名では、変更を防ぐことはできません。また、通常の編集操作では元の署名は無効になりません。)

署名時に、ドキュメントのコンテンツにあいまいさや誤解をもたらす可能性のある、特定の種類のコンテンツをスキャンします。

例えば、注釈により、認証される対象を把握するために重要なページ上のテキストが隠れてしまう場合があります。そのようなコンテンツに関する、説明(法的証明)を提供することができます。

注意:証明書を使用して PDF ドキュメントに電子署名を行う場合は、まず AEM キーストアに証明書が追加されていることを確認する必要があります。証明書は署名に使用する秘密鍵となります

構文secureDocument(Document inDoc,
EncryptionOptions encryptionOptions,
SignatureOptions signatureOptions,
ReaderExtensionOptions readerExtensionOptions,
UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc
PDF ドキュメントを入力するドキュメント
encryptionOptions
PDF ドキュメントの暗号化に必要な引数が含まれます
signatureOptions PDF ドキュメントへの署名や認証に必要なオプションが含まれます
readerExtensionOptions PDF ドキュメントの Reader 用の拡張に必要なオプションが含まれます
unlockOptions 暗号化されたファイルのロックを解除するために必要なパラメーターが含まれます。ファイルが暗号化されている場合にのみ必要となります。

サンプル 1 :このサンプルは、パスワードの暗号化、署名フィールドの認証、および PDF ドキュメントの Reader 用の拡張の実行に使用することができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * ___________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.docassurance.client.api.DocAssuranceServiceOperationTypes;
import com.adobe.fd.docassurance.client.api.EncryptionOptions;
import com.adobe.fd.docassurance.client.api.ReaderExtensionOptions;
import com.adobe.fd.docassurance.client.api.SignatureOptions;
import com.adobe.fd.encryption.client.PasswordEncryptionCompatability;
import com.adobe.fd.encryption.client.PasswordEncryptionOption;
import com.adobe.fd.encryption.client.PasswordEncryptionOptionSpec;
import com.adobe.fd.encryption.client.PasswordEncryptionPermission;
import com.adobe.fd.readerextensions.client.ReaderExtensionsOptionSpec;
import com.adobe.fd.readerextensions.client.UsageRights;
import com.adobe.fd.signatures.client.types.MDPPermissions;
import com.adobe.fd.signatures.pdf.inputs.CredentialContext;
import com.adobe.fd.signatures.pdf.inputs.DSSPreferences;
import com.adobe.fd.signatures.pdf.inputs.DSSPreferencesImpl;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions.PDFSignatureAppearanceType;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions.TextDirection;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.adobe.fd.signatures.pki.client.types.common.HashAlgorithm;
import com.adobe.fd.signatures.pki.client.types.common.RevocationCheckStyle;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.GeneralPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferencesImpl;

/**
 * 
 * This class provides a sample code to use {@code DocAssuranceService} to carry out
 * password encryption, certifying a signature field and reader extending the pdf document.
 * 
 * PreRequisites - Digital certificate for signing the document has to be uploaded on Granite Key Store
 * 				   Digital certificate for reader extending the document has to be uploaded on Granite Key Store
 */

@Component
@Service(value=PassEncryptCertifyExtend.class)
public class PassEncryptCertifyExtend {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	@Reference
    private SlingRepository slingRepository;
	
	@Reference
    private JcrResourceResolverFactory jcrResourceResolverFactory ;
	
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at disk 
	 * @param outputFile - path to the pdf document where the output needs to be stored
	 * @throws Exception 
	 */
	public void SecureDocument(String inputFile, String outputFile) throws Exception{
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		File outFile = new File(outputFile);
		Document outDoc = null;
		
		Session adminSession = null;
        ResourceResolver resourceResolver = null;
        try {
        	 
        	 /** resourceResolver with admin privileges to be passed to SignatureServiceAPI and Reader Extensions
        	 the resource resolver for signature options has to be corresponding to the user who has the signing certificate in his granite key store
        	 the resource resolver for signature options has to be corresponding to the user who has the credential for reader extension in his granite key store
        	 here we are using the same resource resolver
        	 */
        	 adminSession = slingRepository.loginAdministrative(null);
             resourceResolver = jcrResourceResolverFactory.getResourceResolver(adminSession);
             
             //retrieve specifications for each of the services, you may pass null if you don't want to use that service
             //for encrypted document pass Unlock Options - see the method getUnlockOptions() below
			 outDoc = docAssuranceService.secureDocument(inDoc, getPassEncryptionOptions(), getCertificationOptions(resourceResolver), getReaderExtensionOptions(resourceResolver),null);
        }
        finally{
            /**
             * always close the PDFDocument object after your processing is done.
             */
            if(inDoc != null){
                inDoc.close();
            }
            if(adminSession != null && adminSession.isLive()){
                if(resourceResolver != null){
                    resourceResolver.close();
                }
                adminSession.logout();
            }
        }
        
        outDoc.copyToFile(outFile);
		
		
	}
	
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
	
	/**
	 * @return EncryptionOptions for password encrypting the document.
	 * 
	 */
	private EncryptionOptions getPassEncryptionOptions(){
		
		//Create an instance of EncryptionOptions
		EncryptionOptions encryptionOptions = EncryptionOptions.getInstance();
		
		//Create a PasswordEncryptionOptionSpec object that stores encryption run-time values
        PasswordEncryptionOptionSpec passSpec = new PasswordEncryptionOptionSpec();
        
        //Specify the PDF document resource to encrypt
        passSpec.setEncryptOption(PasswordEncryptionOption.ALL);
        
        //Specify the permission associated with the password
        //These permissions enable data to be extracted from a password
        //protected PDF form
        List<PasswordEncryptionPermission> encrypPermissions = new ArrayList<PasswordEncryptionPermission>(); 
        encrypPermissions.add(PasswordEncryptionPermission.PASSWORD_EDIT_ADD);
        encrypPermissions.add(PasswordEncryptionPermission.PASSWORD_EDIT_MODIFY);
        passSpec.setPermissionsRequested(encrypPermissions);
        
        //Specify the Acrobat version
        passSpec.setCompatability(PasswordEncryptionCompatability.ACRO_7);
        
        //Specify the password values
        passSpec.setDocumentOpenPassword("OpenPassword");
        passSpec.setPermissionPassword("PermissionPassword");
        
        //Set the encryption type to Password Encryption
		encryptionOptions.setEncryptionType(DocAssuranceServiceOperationTypes.ENCRYPT_WITH_PASSWORD);
        encryptionOptions.setPasswordEncryptionOptionSpec(passSpec);

    	return encryptionOptions;
	}
	
	/**
	 * 
	 * @param resourceResolver corresponding to the user with the access to Reader Extension credential 
	 * for the given alias -"production" in this case
	 * @return
	 */
	private ReaderExtensionOptions getReaderExtensionOptions(ResourceResolver resourceResolver){
		
		//Create an instance of ReaderExtensionOptions
		ReaderExtensionOptions reOptions = ReaderExtensionOptions.getInstance();
		
		//Create instance for UsageRights to be enabled in the reader
		UsageRights uRights = new UsageRights();
		//enabling comments in the PDF Reader
		uRights.setEnabledComments(true);
		//setting ReaderExtensionsOptionSpec in the reOptions
		reOptions.setReOptions(new ReaderExtensionsOptionSpec(uRights, "Enable commenting in PDF"));
		//alias of the credential to be used for extending the PDF Reader
		reOptions.setCredentialAlias("production");  
		//corresponding to the user with the access to Reader Extension credential
		reOptions.setResourceResolver(resourceResolver); 
		
		return reOptions;
	}
	
	/**
	 * 
	 * @param rr resource resolver corresponding to the user with the access to signing credential for the 
	 * given alias "allcertificatesanypolicytest11ee_new" in this case
	 * @return SignatureOptions
	 */
	private SignatureOptions getCertificationOptions(ResourceResolver rr){
		
		//create an instance of SignatureOptions
		SignatureOptions signatureOptions = SignatureOptions.getInstance();
		
		//set the operation you want to perform - SIGN/CERTIFY
		signatureOptions.setOperationType(DocAssuranceServiceOperationTypes.CERTIFY);
		
		//signature field to certify, pass null if invisible signature field
		String fieldName = "Signature1" ;
		
		//alias of the private credential uploaded on the Key Store
        String alias = "allcertificatesanypolicytest11ee_new";
        
        //Hash Algo to be used to compute digest the PDF document
        HashAlgorithm algo = HashAlgorithm.SHA384;
        
        //Reason for signing/certifying
        String reason = "Test Reason";
        
        //location of the signer
        String location = "Test Location";
        
        //contact info of the signer
        String contactInfo = "Test Contact";
        
        //DocMDP Permissions associated with certification
        MDPPermissions mdpPermissions = MDPPermissions.valueOf("FormChanges");
        
        //Create a PDFSignatureAppearanceOptions object 
        //and show date information
        PDFSignatureAppearenceOptions appOptions = new PDFSignatureAppearenceOptions(
                PDFSignatureAppearanceType.NAME, null, 1.0d, null, true, true,
                true, true, true, true, true, TextDirection.AUTO);
        
        signatureOptions.setSignatureFieldName(fieldName);
        signatureOptions.setAlgo(algo);
        signatureOptions.setContactInfo(contactInfo);
        signatureOptions.setLocation(location);
        signatureOptions.setSigAppearence(appOptions);
        signatureOptions.setReason(reason);
        signatureOptions.setDssPref(getDSSPreferences(rr));
        signatureOptions.setCredential(new CredentialContext(alias, rr));
        signatureOptions.setMdpPermissions(mdpPermissions);
		return signatureOptions;
	}
	
	private DSSPreferences getDSSPreferences(ResourceResolver rr){
		//sets the DSS Preferences
        DSSPreferencesImpl prefs = DSSPreferencesImpl.getInstance();
        prefs.setPKIPreferences(getPKIPreferences());
        GeneralPreferencesImpl gp = (GeneralPreferencesImpl) prefs.getPKIPreferences().getGeneralPreferences();
        gp.setDisableCache(true);
        return prefs;
    }
    
    private PKIPreferences getPKIPreferences(){
    	//sets the PKI Preferences
        PKIPreferences pkiPref = new PKIPreferencesImpl();
        pkiPref.setCRLPreferences(getCRLPreferences());
        pkiPref.setPathPreferences(getPathValidationPreferences());
        return pkiPref;
    }
    
    private CRLPreferences getCRLPreferences(){
        //specifies the CRL Preferences
        CRLPreferencesImpl crlPrefs = new CRLPreferencesImpl();
        crlPrefs.setRevocationCheck(RevocationCheckStyle.CheckIfAvailable);
        crlPrefs.setGoOnline(true);
        return crlPrefs;
    }
    
    private PathValidationPreferences getPathValidationPreferences(){
    	//sets the path validation preferences
        PathValidationPreferencesImpl pathPref = new PathValidationPreferencesImpl();
        pathPref.setDoValidation(false);
        return pathPref;
        
    }
    
}

サンプル 2 :このサンプルは、PKI 暗号化、署名フィールドへの署名、および PDF ドキュメントの Reader 用の拡張の実行に使用することができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * ___________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.docassurance.client.api.DocAssuranceServiceOperationTypes;
import com.adobe.fd.docassurance.client.api.EncryptionOptions;
import com.adobe.fd.docassurance.client.api.ReaderExtensionOptions;
import com.adobe.fd.docassurance.client.api.SignatureOptions;
import com.adobe.fd.encryption.client.CertificateEncryptionCompatibility;
import com.adobe.fd.encryption.client.CertificateEncryptionIdentity;
import com.adobe.fd.encryption.client.CertificateEncryptionOption;
import com.adobe.fd.encryption.client.CertificateEncryptionOptionSpec;
import com.adobe.fd.encryption.client.CertificateEncryptionPermissions;
import com.adobe.fd.encryption.client.Recipient;
import com.adobe.fd.readerextensions.client.ReaderExtensionsOptionSpec;
import com.adobe.fd.readerextensions.client.UsageRights;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.pdf.inputs.CredentialContext;
import com.adobe.fd.signatures.pdf.inputs.DSSPreferences;
import com.adobe.fd.signatures.pdf.inputs.DSSPreferencesImpl;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions.PDFSignatureAppearanceType;
import com.adobe.fd.signatures.pdf.inputs.PDFSignatureAppearenceOptions.TextDirection;
import com.adobe.fd.signatures.pki.client.types.common.HashAlgorithm;
import com.adobe.fd.signatures.pki.client.types.common.RevocationCheckStyle;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.GeneralPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferencesImpl;

/**
 * 
 * This class provides a sample code to use {@code DocAssuranceService} to carry out
 * certificate encryption, signing a signature field and reader extending the pdf document.
 * 
 * PreRequisites - Digital certificate for encrypting the document has to be uploaded on Granite Trust Store
				   Digital certificate for signing the document has to be uploaded on Granite Key Store
 * 				   Digital certificate for reader extending the document has to be uploaded on Granite Key Store
 */

@Component
@Service(value=PassEncryptSignExtend.class)
public class PassEncryptSignExtend {
	
	@Reference
	private DocAssuranceService docAssuranceService;
	
	@Reference
    private SlingRepository slingRepository;
	
	@Reference
    private JcrResourceResolverFactory jcrResourceResolverFactory ;
	
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at disk 
	 * @param outputFile - path to the pdf document where the output needs to be stored
	 * @throws Exception 
	 */
	public void CertEncryptSignReaderExtend(String inputFile, String outputFile) throws Exception{
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		File outFile = new File(outputFile);
		Document outDoc = null;
		
		Session adminSession = null;
        ResourceResolver resourceResolver = null;
        try {
        	 
        	 /** resourceResolver with admin privileges to be passed to SignatureServiceAPI and Reader Extensions
        	 the resource resolver for signature options has to be corresponding to the user who has the signing certificate in his granite key store
        	 the resource resolver for signature options has to be corresponding to the user who has the credential for reader extension in his granite key store
        	 here we are using the same resource resolver
        	 */
        	 adminSession = slingRepository.loginAdministrative(null);
             resourceResolver = jcrResourceResolverFactory.getResourceResolver(adminSession);
             
             //retrieve specifications for each of the services, you may pass null if you don't want to use that service
             //for encrypted document pass Unlock Options - see the method getUnlockOptions() below
			 outDoc = docAssuranceService.secureDocument(inDoc, getCertEncryptionOptions(), getSignatureOptions(resourceResolver), getReaderExtensionOptions(resourceResolver),null);
        }
        finally{
            /**
             * always close the PDFDocument object after your processing is done.
             */
            if(inDoc != null){
                inDoc.close();
            }
            if(adminSession != null && adminSession.isLive()){
                if(resourceResolver != null){
                    resourceResolver.close();
                }
                adminSession.logout();
            }
        }
        
        outDoc.copyToFile(outFile);
		
		
	}
	
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
    
	/**
	 * @return EncryptionOptions for password encrypting the document.
	 * 
	 */
	private EncryptionOptions getCertEncryptionOptions(){
		
		//Create an instance of EncryptionOptions
		EncryptionOptions encryptionOptions = EncryptionOptions.getInstance();
		
        //Set the encryption type to Certificate Encryption
		encryptionOptions.setEncryptionType(DocAssuranceServiceOperationTypes.ENCRYPT_WITH_CERTIFCATE);
		
		//Set the List that stores PKI information
		List<CertificateEncryptionIdentity> pkiIdentities = new ArrayList<CertificateEncryptionIdentity>(); 
			
		//Set the Permission List
		List<CertificateEncryptionPermissions> permList = new ArrayList<CertificateEncryptionPermissions>();
		permList.add(CertificateEncryptionPermissions.PKI_ALL_PERM) ;
			
		//Create a Recipient object to store certificate information
		Recipient recipient = new Recipient();
			
		//Specify the alias of the public certificate present in the trust store that is used to encrypt the document
		recipient.setX509Cert("alias");
		/*
		 * An alternative to add a certificate is by providing the alias
		 * of the certificate stored in AEM trust store.
		 * recipient.setAlias(alias);                             
		 */
		
		//Create an EncryptionIdentity object
		CertificateEncryptionIdentity encryptionId = new CertificateEncryptionIdentity(); 
		encryptionId.setPerms(permList);
		encryptionId.setRecipient(recipient);
			
		//Add the EncryptionIdentity to the list
		pkiIdentities.add(encryptionId);
		
		
		//Set encryption run-time options
		CertificateEncryptionOptionSpec certOptionsSpec = new CertificateEncryptionOptionSpec(); 
		certOptionsSpec.setOption(CertificateEncryptionOption.ALL);
		certOptionsSpec.setCompat(CertificateEncryptionCompatibility.ACRO_9);
		
		
		
		//Set the certificate encryption option
		encryptionOptions.setCertOptionSpec(certOptionsSpec)
		
		//Set the PKI Identities in encryption Options
        encryptionOptions.setPkiIdentities(pkiIdentities);

    	return encryptionOptions;
	}
	
	/**
	 * 
	 * @param resourceResolver corresponding to the user with the access to Reader Extension credential 
	 * for the given alias -"production" in this case
	 * @return
	 */
	private ReaderExtensionOptions getReaderExtensionOptions(ResourceResolver resourceResolver){
		
		//Create an instance of ReaderExtensionOptions
		ReaderExtensionOptions reOptions = ReaderExtensionOptions.getInstance();
		
		//Create instance for UsageRights to be enabled in the reader
		UsageRights uRights = new UsageRights();
		//enabling comments in the PDF Reader
		uRights.setEnabledComments(true);
		//setting ReaderExtensionsOptionSpec in the reOptions
		reOptions.setReOptions(new ReaderExtensionsOptionSpec(uRights, "Enable commenting in PDF"));
		//alias of the credential to be used for extending the PDF Reader
		reOptions.setCredentialAlias("production");  
		//corresponding to the user with the access to Reader Extension credential
		reOptions.setResourceResolver(resourceResolver); 
		
		return reOptions;
	}
	
	/**
	 * 
	 * @param rr resource resolver corresponding to the user with the access to signing credential for the 
	 * given alias "allcertificatesanypolicytest11ee_new" in this case
	 * @return SignatureOptions
	 */
	private SignatureOptions getSignatureOptions(ResourceResolver rr){
		
		//create an instance of SignatureOptions
		SignatureOptions signatureOptions = SignatureOptions.getInstance();
		
		//set the operation you want to perform - SIGN/CERTIFY
		signatureOptions.setOperationType(DocAssuranceServiceOperationTypes.SIGN);
		
		//field to sign
		String fieldName = "Signature1" ;
		
		//alias of the private credential uploaded on the Key Store
        String alias = "allcertificatesanypolicytest11ee_new";
        
        //Hash Algo to be used to compute digest the PDF document
        HashAlgorithm algo = HashAlgorithm.SHA384;
        
        //Reason for signing/certifying
        String reason = "Test Reason";
        
        //location of the signer
        String location = "Test Location";
        
        //contact info of the signer
        String contactInfo = "Test Contact";
        
        //Create a PDFSignatureAppearanceOptions object 
        //and show date information
        PDFSignatureAppearenceOptions appOptions = new PDFSignatureAppearenceOptions(
                PDFSignatureAppearanceType.NAME, null, 1.0d, null, true, true,
                true, true, true, true, true, TextDirection.AUTO);
        
        signatureOptions.setSignatureFieldName(fieldName);
        signatureOptions.setAlgo(algo);
        signatureOptions.setContactInfo(contactInfo);
        signatureOptions.setLocation(location);
        signatureOptions.setSigAppearence(appOptions);
        signatureOptions.setReason(reason);
        signatureOptions.setDssPref(getDSSPreferences(rr));
        signatureOptions.setCredential(new CredentialContext(alias, rr));
		return signatureOptions;
	}
	
	private DSSPreferences getDSSPreferences(ResourceResolver rr){
		//sets the DSS Preferences
        DSSPreferencesImpl prefs = DSSPreferencesImpl.getInstance();
        prefs.setPKIPreferences(getPKIPreferences());
        GeneralPreferencesImpl gp = (GeneralPreferencesImpl) prefs.getPKIPreferences().getGeneralPreferences();
        gp.setDisableCache(true);
        return prefs;
    }
    
    private PKIPreferences getPKIPreferences(){
    	//sets the PKI Preferences
        PKIPreferences pkiPref = new PKIPreferencesImpl();
        pkiPref.setCRLPreferences(getCRLPreferences());
        pkiPref.setPathPreferences(getPathValidationPreferences());
        return pkiPref;
    }
    
    private CRLPreferences getCRLPreferences(){
        //specifies the CRL Preferences
        CRLPreferencesImpl crlPrefs = new CRLPreferencesImpl();
        crlPrefs.setRevocationCheck(RevocationCheckStyle.CheckIfAvailable);
        crlPrefs.setGoOnline(true);
        return crlPrefs;
    }
    
    private PathValidationPreferences getPathValidationPreferences(){
    	//sets the path validation preferences
        PathValidationPreferencesImpl pathPref = new PathValidationPreferencesImpl();
        pathPref.setDoValidation(false);
        return pathPref;
        
    }
    
}

証明書の使用権限の取得

特定の credentialAlias によって指定された証明書の使用権限情報を取得するには、この API を SecureDocument API 内から呼び出してください。

構文getCredentialUsageRights(String credentialAlias, ResourceResolver resourceResolver)

入力パラメーター

パラメータ 説明
credentialAlias
証明書を指定する credentialAlias です。
credentialPassword
証明書が暗号化されている場合は証明書のパスワード、証明書が暗号化されていない場合は null を使用する必要があります。

以下のサンプルを使用することで、秘密鍵証明書の使用権限情報を取得することができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and may be covered by U.S. and Foreign Patents,
 * patents in process, and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.fd.readerextensions.samples;

import java.io.File;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.docassurance.client.api.ReaderExtensionOptions;
import com.adobe.fd.readerextensions.client.GetUsageRightsResult;
import com.adobe.fd.readerextensions.client.ReaderExtensionsOptionSpec;
import com.adobe.fd.readerextensions.client.UsageRights;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 *
 */
@Component(metatype = true, immediate = true, label = "ReaderExtensionsSampleService")
@Service(value = ReaderExtensionsSampleService.class)
public class ReaderExtensionsSampleService {

	@Reference(referenceInterface=DocAssuranceService.class)
	private DocAssuranceService docAssuranceService;

	@Reference(referenceInterface=ResourceResolverFactory.class)
	private ResourceResolverFactory resourceResolverFactory;
public void getCredentialUsageRights() {
		try {

			GetUsageRightsResult usageRightsResult = docAssuranceService.getCredentialUsageRights("production", 
					resourceResolverFactory.getAdministrativeResourceResolver(null));

			System.out.println("Credential usage Rights are as follows");
			System.out.println(usageRightsResult.toString());

		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

ドキュメントの使用権限の取得

特定のドキュメントに対する証明書の使用権限情報を取得するには、この API をSecureDocument API から呼び出します。

構文getDocumentUsageRights(Document inDocument, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDocument
使用権限情報の取得元ドキュメント

以下のサンプルコードを使用することで、ドキュメントの使用権限情報を返すことができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and may be covered by U.S. and Foreign Patents,
 * patents in process, and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.fd.readerextensions.samples;

import java.io.File;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.docassurance.client.api.ReaderExtensionOptions;
import com.adobe.fd.readerextensions.client.GetUsageRightsResult;
import com.adobe.fd.readerextensions.client.ReaderExtensionsOptionSpec;
import com.adobe.fd.readerextensions.client.UsageRights;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 *
 */
@Component(metatype = true, immediate = true, label = "ReaderExtensionsSampleService")
@Service(value = ReaderExtensionsSampleService.class)
public class ReaderExtensionsSampleService {

	@Reference(referenceInterface=DocAssuranceService.class)
	private DocAssuranceService docAssuranceService;

	@Reference(referenceInterface=ResourceResolverFactory.class)
	private ResourceResolverFactory resourceResolverFactory;

      public void getDocumentUsageRights() {
		Document inputDocument = null;
		try {
			//Name of the input file on which usage rights is to be applied.
			String inputFileName = "C:/RETest/input/GetUsageRightsInfo/02_fromAcrobat7.0.8_Acro700_UB8_BS_signed_commenting.pdf";

			//Document to be input to Doc Assurance Service
			inputDocument = new Document(new File(inputFileName));

			//Unlock options to unlock the document if some kind of security is set on it.
			//Currently set to null because input document has no security.
			UnlockOptions unlockOptions = null;

			GetUsageRightsResult usageRightsResult = docAssuranceService.getDocumentUsageRights(inputDocument, unlockOptions);

			System.out.println("Document usage Rights are as follows");
			System.out.println(usageRightsResult.toString());

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
//			if (inputDocument != null) {
//				inputDocument.dispose(); //dispose off the document.
//			}
		}
	}

使用権限の削除

SecureDocument API からremoveUsageRights API を呼び出すことによって、ドキュメントの使用権限を削除することができます。

入力パラメーター

パラメータ 説明
inDocument
使用権限を削除するドキュメントです。
unlockOptions
暗号化されたファイルのロックを解除するために必要なパラメーターが含まれます。ファイルが暗号化されている場合にのみ必要となります。

以下のサンプルを使用することで、特定文書の使用権限を削除することができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and may be covered by U.S. and Foreign Patents,
 * patents in process, and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.fd.readerextensions.samples;

import java.io.File;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.docassurance.client.api.ReaderExtensionOptions;
import com.adobe.fd.readerextensions.client.GetUsageRightsResult;
import com.adobe.fd.readerextensions.client.ReaderExtensionsOptionSpec;
import com.adobe.fd.readerextensions.client.UsageRights;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 
 *
 */
@Component(metatype = true, immediate = true, label = "ReaderExtensionsSampleService")
@Service(value = ReaderExtensionsSampleService.class)
public class ReaderExtensionsSampleService {

	@Reference(referenceInterface=DocAssuranceService.class)
	private DocAssuranceService docAssuranceService;

	@Reference(referenceInterface=ResourceResolverFactory.class)
	private ResourceResolverFactory resourceResolverFactory;

public void removeDocumentUsageRights() {
		Document inputDocument = null;
		Document outDocument = null;
		try {
			//Name of the input file on which usage rights is to be applied.
			String inputFileName = "C:/RETest/input/RemoveUsageRights/01_Ubiquitized_50-267_PDF1.5_UB2_Rights.pdf";

			//Name of the output file where result will be saved.
			String outputFileName = "C:/RETest/output/samples/removeUsageRightsOutput.pdf";

			//Document to be input to Doc Assurance Service
			inputDocument = new Document(new File(inputFileName));

			//Unlock options to unlock the document if some kind of security is set on it.
			//Currently set to null because input document has no security.
			UnlockOptions unlockOptions = null;

			//Specify null encryption options and signatures options. 
			//If requirement is also to encrypt and sign the document then, corresponding options can also be specified.
			outDocument = docAssuranceService.removeUsageRights(inputDocument, unlockOptions);

			File outputdir = new File("C:/RETest/output/samples");
			outputdir.mkdirs();

			outDocument.copyToFile(new File(outputFileName));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
//			if (inputDocument != null) {
//				inputDocument.dispose(); //dispose off the document.
//			}
//			if (outDocument != null) {
//				outDocument.dispose();	//dispose off the document.
//			}
		}
	}

電子署名の検証

電子署名を検証することで、署名された PDF ドキュメントに変更がなく、電子署名が有効であることを確認することができます。電子署名の検証では、署名のステータスや、署名者の ID などのプロパティを確認することができます。電子署名を信用する前に、検証することをおすすめします。電子署名を検証する際、電子署名を含む PDF ドキュメントを参照します。

構文verify( inDoc, signatureFieldName, revocationCheckStyle, verificationTime, dssPrefs, ResourceResolver resourceResolver)

入力パラメーター

パラメータ 説明
inDoc
PDF を含む document オブジェクトです。
signatureField
Name

検証する署名フィールドの名前です。完全修飾名もしくは名前の一部を指定できます。
revocationCheckStyle 検証中に発生した証明書の失効確認を管理するオプションです。
VerificationTime 署名が検証される時間です。
dssPrefs さまざまな設定を管理する環境設定です。暗号化されたドキュメントに対しては、setUnlockOptions() を使用してロック解除オプションを設定します。
resourceResolver Granite trust store に対するリソースリゾルバーです。

以下のサンプルコードでは、すでに暗号化されている PDF ドキュメント内の署名フィールドを検証するため、 DocAssuranceService が使用されています。

/*************************************************************************
 *
-------------------------------------------------------------
*ADOBE SYSTEMS INCORPORATED
*Copyright 2014 Adobe Systems Incorporated
*All Rights Reserved.

*NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the 
*terms of the Adobe license agreement accompanying it.  If you have received this file from a 
*source other than Adobe, then your use, modification, or distribution of it requires the prior 
*written permission of Adobe.
-------------------------------------------------------------------------------------------------

 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.io.IOException;

import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.IdentityInformation;
import com.adobe.fd.signatures.client.types.IdentityStatus;
import com.adobe.fd.signatures.client.types.PDFSignatureType;
import com.adobe.fd.signatures.client.types.PDFSignatureVerificationInfo;
import com.adobe.fd.signatures.client.types.SignatureProperties;
import com.adobe.fd.signatures.client.types.SignatureStatus;
import com.adobe.fd.signatures.client.types.SignatureType;
import com.adobe.fd.signatures.client.types.VerificationTime;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.adobe.fd.signatures.pdf.inputs.ValidationPreferences;
import com.adobe.fd.signatures.pdf.inputs.ValidationPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.common.RevocationCheckStyle;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.OCSPPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.TSPPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.TSPPreferencesImpl;

/**
 * 
 * This class provides a sample code to use {@code DocAssuranceService} to carry out
 * verification of a signature field in an already Encrypted PDF Document
 * 
 * Digital signatures can be verified to ensure that a signed PDF document was not modified and that the digital signature is valid. 
 * When verifying a digital signature, you can check the signature's status and the signature's properties, such as the signer's identity. 
 * Before trusting a digital signature, it is recommended that you verify it. When verifying a digital signature, reference a PDF document 
 * that contains a digital signature.
 * 
 * For unprotected document, you are not required to set UnlockOptions in ValidationPreferences
 * PreRequisites - The certificate chain upto the Root Certificate should be uploaded on CQ trust Store
 */

@Component
@Service(value=VerifyFieldEncryptedPDF.class)
public class VerifyFieldEncryptedPDF {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	@Reference
    private SlingRepository slingRepository;
	
	@Reference
    private JcrResourceResolverFactory jcrResourceResolverFactory ;
	
	
	/**
	 * 
	 * @param inputFile - path to an encrypted pdf document stored at JCR node 
	 * @throws IOException
	 * @throws RepositoryException
	 * @throws InvalidArgumentException
	 * @throws DocAssuranceException
	 */
	public void verifyFieldEncryptedPDF(String inputFile,String fieldName) throws IOException, RepositoryException, InvalidArgumentException, DocAssuranceException{
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		Session adminSession = null;
        ResourceResolver resourceResolver = null;
        try {
        	 
        	//the resource resolver has to be corresponding to the user who has access to CQ Trust Store
        	 adminSession = slingRepository.loginAdministrative(null);
             resourceResolver = jcrResourceResolverFactory.getResourceResolver(adminSession);
             
           //Specify the name of the signature field
             
             RevocationCheckStyle revocationCheckStyle = RevocationCheckStyle.AlwaysCheck;
             VerificationTime verificationTime = VerificationTime.CURRENT_TIME;
             ValidationPreferences dssPrefs = getValidationPreferences();
            
             //Verify the digital signature
             PDFSignatureVerificationInfo  signInfo = docAssuranceService.verify(
                 inDoc,
                 fieldName,
                 revocationCheckStyle,
                 verificationTime,
                 dssPrefs,
                 resourceResolver);

             //Get the Signature Status
             SignatureStatus sigStatus = signInfo.getStatus();
             String myStatus=""; 
             
             //Determine the status of the signature
             if (sigStatus == SignatureStatus.DynamicFormSignatureUnknown)
                 myStatus = "The signatures located in the dynamic PDF form are unknown";
             else if (sigStatus == SignatureStatus.DocumentSignatureUnknown)
                 myStatus = "The signatures located in the PDF document are unknown";
             else if (sigStatus == SignatureStatus.CertifiedDynamicFormSignatureTamper)
                 myStatus = "The signatures located in a certified PDF form are valid";
             else if (sigStatus == SignatureStatus.SignedDynamicFormSignatureTamper)
                 myStatus = "The signatures located in a signed dynamic PDF form are valid";
             else if (sigStatus == SignatureStatus.CertifiedDocumentSignatureTamper)
                 myStatus = "The signatures located in a certified PDF document are valid";
             else if (sigStatus == SignatureStatus.SignedDocumentSignatureTamper)
                 myStatus = "The signatures located in a signed PDF document are valid";
             else if (sigStatus == SignatureStatus.SignatureFormatError)
                 myStatus = "The format of a signature in a signed document is invalid";
             else if (sigStatus == SignatureStatus.DynamicFormSigNoChanges)
                 myStatus = "No changes were made to the signed dynamic PDF form";
             else if (sigStatus == SignatureStatus.DocumentSigNoChanges)
                 myStatus = "No changes were made to the signed PDF document";
             else if (sigStatus == SignatureStatus.DynamicFormCertificationSigNoChanges)
                 myStatus = "No changes were made to the certified dynamic PDF form";
             else if (sigStatus == SignatureStatus.DocumentCertificationSigNoChanges)
                 myStatus = "No changes were made to the certified PDF document";
             else if (sigStatus == SignatureStatus.DocSigWithChanges)
                 myStatus = "There were changes to a signed PDF document";
            else if (sigStatus == SignatureStatus.CertificationSigWithChanges)
                 myStatus = "There were changes made to the PDF document.";
                        
             //Get the signature type
             SignatureType sigType = signInfo.getSignatureType();
             String myType = "";
                
             if (sigType.getType() == PDFSignatureType.AUTHORSIG)
                    myType="Certification";
             else if(sigType.getType() == PDFSignatureType.RECIPIENTSIG)
                    myType="Recipient";
            
             //Get the identity of the signer
             IdentityInformation signerId = signInfo.getSigner();
             String signerMsg = "";
            
            if (signerId.getStatus() == IdentityStatus.UNKNOWN)
                signerMsg = "Identity Unknown";
            else if (signerId.getStatus() == IdentityStatus.TRUSTED)
                signerMsg = "Identity Trusted";
            else if (signerId.getStatus() == IdentityStatus.NOTTRUSTED)
                signerMsg = "Identity Not Trusted";
                     
            //Get the Signature properties returned by the Signature service
            SignatureProperties sigProps = signInfo.getSignatureProps();
            String signerName =  sigProps.getSignerName();
             
           System.out.println("The status of the signature is: "+myStatus +". The signer identity is "+signerMsg +". The signature type is "+myType +". The name of the signer is "+signerName+".");
           }
           catch (Exception ee)
           {
               ee.printStackTrace();
           }
	        finally{
	            /**
	             * always close the PDFDocument object after your processing is done.
	             */
	            if(inDoc != null){
	                inDoc.close();
	            }
	            if(adminSession != null && adminSession.isLive()){
	                if(resourceResolver != null){
	                    resourceResolver.close();
	                }
	                adminSession.logout();
	            }
	        }
        
		
	}
	
	/**
 	 * sets ValidationPreferences
 	 */
 	private static ValidationPreferences getValidationPreferences(){
        
        ValidationPreferencesImpl prefs = new ValidationPreferencesImpl();
        prefs.setPKIPreferences(getPKIPreferences());
       
        //set the unlock options for processing an encrypted pdf document, do not set if the input doc is unprotected
        prefs.setUnlockOptions(getUnlockOptions());
        return prefs;
        
    }
    
 	/**
 	 * sets PKIPreferences
 	 */
    private static PKIPreferences getPKIPreferences(){
        PKIPreferences pkiPref = new PKIPreferencesImpl();
        pkiPref.setCRLPreferences(getCRLPreferences());
        pkiPref.setPathPreferences(getPathValidationPreferences());
        pkiPref.setOCSPPreferences(getOCSPPref());
        pkiPref.setTSPPreferences(getTspPref());
        return pkiPref;
    }
    
    private static TSPPreferences getTspPref(){
    	TSPPreferencesImpl tsp = new TSPPreferencesImpl();
    	tsp.setRevocationCheck(RevocationCheckStyle.BestEffort);
    	return tsp;
    }
    private static OCSPPreferencesImpl getOCSPPref(){
    	OCSPPreferencesImpl ocsp = new OCSPPreferencesImpl();
    	ocsp.setRevocationCheck(RevocationCheckStyle.BestEffort);
    	return ocsp;
    }
    /**
     * sets CRL Preferences
     */
    private static CRLPreferences getCRLPreferences(){
    
        CRLPreferencesImpl crlPrefs = new CRLPreferencesImpl();
        crlPrefs.setRevocationCheck(RevocationCheckStyle.BestEffort);
        crlPrefs.setGoOnline(true);
        return crlPrefs;
    }
    
    

    /**
     * 
     * sets PathValidationPreferences
     */
    private static PathValidationPreferences getPathValidationPreferences(){
        PathValidationPreferencesImpl pathPref = new PathValidationPreferencesImpl();
        pathPref.setDoValidation(true);
        return pathPref;
        
    }
    
    /**
     * sets Unlock Options for encrypted PDF
     */
    private static UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
    
    
}

複数のデジタル署名の検証

AEM では、PDF ドキュメントの電子署名を検証することができます。複数の署名者による署名が必要なビジネスプロセスで使用される場合、1 つの PDF ドキュメントに複数の電子署名を使用することができます。例えば、金融取引の場合は、ローン担当者と管理者両方の署名が必要です。Signature サービス API を使用することで、PDF ドキュメント内のすべての署名を検証することができます。複数の署名を検証する際は、それぞれの署名のステータスやプロパティを確認できます。アドビでは、電子署名を信頼する前に検証を行うことをおすすめしています。

構文verifyDocument(Document doc, RevocationCheckStyle revocationCheckStyle, VerificationTime verificationTime, ValidationPreferences prefStore, ResourceResolver resourceResolver)

入力パラメーター

パラメータ 説明
inDoc
PDF を含む document オブジェクトです。
revocationCheckStyle 検証中に発生した証明書の失効確認を管理するオプションです。
VerificationTime 署名が検証される時間です。
dssPrefs さまざまな設定を管理する環境設定です。暗号化されたドキュメントに対しては、setUnlockOptions() を使用してロック解除オプションを設定します。
resourceResolver Granite trust store に対するリソースリゾルバーです。

以下のサンプルコードでは、すでに暗号化されている PDF ドキュメント内の署名フィールドを検証するため、DocAssuranceService が使用されています。

/*************************************************************************
 *
  *
-------------------------------------------------------------
*ADOBE SYSTEMS INCORPORATED
*Copyright 2014 Adobe Systems Incorporated
*All Rights Reserved.

*NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the 
*terms of the Adobe license agreement accompanying it.  If you have received this file from a 
*source other than Adobe, then your use, modification, or distribution of it requires the prior 
*written permission of Adobe.
-------------------------------------------------------------------------------------------------

 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.PDFDocumentVerificationInfo;
import com.adobe.fd.signatures.client.types.PDFSignatureType;
import com.adobe.fd.signatures.client.types.PDFSignatureVerificationInfo;
import com.adobe.fd.signatures.client.types.SignatureProperties;
import com.adobe.fd.signatures.client.types.SignatureStatus;
import com.adobe.fd.signatures.client.types.SignatureType;
import com.adobe.fd.signatures.client.types.VerificationTime;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.adobe.fd.signatures.pdf.inputs.ValidationPreferences;
import com.adobe.fd.signatures.pdf.inputs.ValidationPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.common.RevocationCheckStyle;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.CRLPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PKIPreferencesImpl;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferences;
import com.adobe.fd.signatures.pki.client.types.prefs.PathValidationPreferencesImpl;

/**
 * 
 * This class provides a sample code to use {@code DocAssuranceService} to carry out
 * verification of all the signature fields in an already Encrypted PDF Document
 * 
 * Assume that a PDF document contains multiple digital signatures as a result of a business process that requires signatures from multiple 
 * signers. For example, consider a financial transaction that requires both a loan officer's and a manager's signature. You can use the 
 * Signature service Java API or web service API to verify all signatures within the PDF document. When verifying multiple digital signatures,
 * you can check the status and properties of each signature. Before you trust a digital signature, it is recommended that you verify it. It 
 * is recommended that you are familiar with verifying a single digital signature.
 * 
 * For unprotected document, you are not required to set UnlockOptions in ValidationPreferences
 * PreRequisites - The certificate chain upto the Root Certificate should be uploaded on CQ trust Store
 */

@Component
@Service(value=VerifyEncryptedPDFDoc.class)
public class VerifyEncryptedPDFDoc {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	@Reference
    private SlingRepository slingRepository;
	
	@Reference
    private JcrResourceResolverFactory jcrResourceResolverFactory ;
	
	
	/**
	 * 
	 * @param inputFile - path to an encrypted pdf document stored at JCR node 
	 * @throws IOException
	 * @throws RepositoryException
	 * @throws InvalidArgumentException
	 * @throws DocAssuranceException
	 */
	public void verifyEncryptedPDFDoc(String inputFile) throws IOException, RepositoryException, InvalidArgumentException, DocAssuranceException{
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		Session adminSession = null;
        ResourceResolver resourceResolver = null;
        try {
        	 
        	 //the resource resolver has to be corresponding to the user who has access to CQ Trust Store
        	 adminSession = slingRepository.loginAdministrative(null);
             resourceResolver = jcrResourceResolverFactory.getResourceResolver(adminSession);
             
             RevocationCheckStyle revocationCheckStyle = RevocationCheckStyle.CheckIfAvailable;
             VerificationTime verificationTime = VerificationTime.CURRENT_TIME;
             ValidationPreferences dssPrefs = getValidationPreferences();
            
             //Verify the digital signature
             PDFDocumentVerificationInfo  docInfo = docAssuranceService.verifyDocument(
                 inDoc,
                 revocationCheckStyle,
                 verificationTime,
                 dssPrefs,
                 resourceResolver);

             //Get a list of all signatures that are located in the PDF document
             List allSignatures = docInfo.getVerificationInfos();
             
           //Create an Iterator object and iterate through 
           //the List object
           Iterator<PDFSignatureVerificationInfo> iter = allSignatures.iterator(); 
           
           while (iter.hasNext()) { 
                  PDFSignatureVerificationInfo signInfo = (PDFSignatureVerificationInfo)iter.next(); 
                   
                  //Get the Signature Status
                     SignatureStatus sigStatus = signInfo.getStatus();
                     String myStatus=""; 
                     
                   //Determine the status of the signature
                     if (sigStatus == SignatureStatus.DynamicFormSignatureUnknown)
                         myStatus = "The signatures located in the dynamic PDF form are unknown";
                     else if (sigStatus == SignatureStatus.DocumentSignatureUnknown)
                         myStatus = "The signatures located in the PDF document are unknown";
                     else if (sigStatus == SignatureStatus.CertifiedDynamicFormSignatureTamper)
                         myStatus = "The signatures located in a certified PDF form are valid";
                     else if (sigStatus == SignatureStatus.SignedDynamicFormSignatureTamper)
                         myStatus = "The signatures located in a signed dynamic PDF form are valid";
                     else if (sigStatus == SignatureStatus.CertifiedDocumentSignatureTamper)
                         myStatus = "The signatures located in a certified PDF document are valid";
                     else if (sigStatus == SignatureStatus.SignedDocumentSignatureTamper)
                         myStatus = "The signatures located in a signed PDF document are valid";
                     else if (sigStatus == SignatureStatus.SignatureFormatError)
                         myStatus = "The format of a signature in a signed document is invalid";
                     else if (sigStatus == SignatureStatus.DynamicFormSigNoChanges)
                         myStatus = "No changes were made to the signed dynamic PDF form";
                     else if (sigStatus == SignatureStatus.DocumentSigNoChanges)
                         myStatus = "No changes were made to the signed PDF document";
                     else if (sigStatus == SignatureStatus.DynamicFormCertificationSigNoChanges)
                         myStatus = "No changes were made to the certified dynamic PDF form";
                     else if (sigStatus == SignatureStatus.DocumentCertificationSigNoChanges)
                         myStatus = "No changes were made to the certified PDF document";
                     else if (sigStatus == SignatureStatus.DocSigWithChanges)
                         myStatus = "There were changes to a signed PDF document";
                    else if (sigStatus == SignatureStatus.CertificationSigWithChanges)
                         myStatus = "There were changes made to the PDF document.";
                           
                     //Get the signature type
                    SignatureType sigType = signInfo.getSignatureType();
                    String myType = "";
                    
                    if (sigType.getType() == PDFSignatureType.AUTHORSIG)
                        myType="Certification";
                    else if(sigType.getType() == PDFSignatureType.RECIPIENTSIG)
                        myType="Recipient";
                                 
                    //Get the Signature properties returned by the Signature service
                    SignatureProperties sigProps = signInfo.getSignatureProps();
                    String signerName =  sigProps.getSignerName();
                     
                   System.out.println("The status of the signature is: "+myStatus +". The signature type is "+myType +". The name of the signer is "+signerName+".");
               }
           }
           catch (Exception ee)
           {
               ee.printStackTrace();
           }
	        finally{
	            /**
	             * always close the PDFDocument object after your processing is done.
	             */
	            if(inDoc != null){
	                inDoc.close();
	            }
	            if(adminSession != null && adminSession.isLive()){
	                if(resourceResolver != null){
	                    resourceResolver.close();
	                }
	                adminSession.logout();
	            }
	        }
        
		
	}
	
	/**
 	 * sets ValidationPreferences
 	 */
 	private static ValidationPreferences getValidationPreferences(){
        
        ValidationPreferencesImpl prefs = new ValidationPreferencesImpl();
        prefs.setPKIPreferences(getPKIPreferences());
       
        //set the unlock options for processing an encrypted pdf document, do not set if the document is unprotected
        prefs.setUnlockOptions(getUnlockOptions());
        return prefs;
        
    }
    
 	/**
 	 * sets PKIPreferences
 	 */
    private static PKIPreferences getPKIPreferences(){
        PKIPreferences pkiPref = new PKIPreferencesImpl();
        pkiPref.setCRLPreferences(getCRLPreferences());
        pkiPref.setPathPreferences(getPathValidationPreferences());
        return pkiPref;
    }
    
    /**
     * sets CRL Preferences
     */
    private static CRLPreferences getCRLPreferences(){
    
        CRLPreferencesImpl crlPrefs = new CRLPreferencesImpl();
        crlPrefs.setRevocationCheck(RevocationCheckStyle.CheckIfAvailable);
        crlPrefs.setGoOnline(true);
        return crlPrefs;
    }

    /**
     * 
     * sets PathValidationPreferences
     */
    private static PathValidationPreferences getPathValidationPreferences(){
        PathValidationPreferencesImpl pathPref = new PathValidationPreferencesImpl();
        pathPref.setDoValidation(false);
        return pathPref;
        
    }
    
    /**
     * sets Unlock Options for encrypted PDF
     */
    private static UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
    
    
}

電子署名の削除

古い電子署名を削除した場合にのみ、署名フィールドに新しい電子署名を適用することができます。電子署名を上書きすることはできません。すでに電子署名が含まれている署名フィールドへ電子署名を適用しようとすると、例外が発生します。

構文clearSignatureField(Document inDoc, String signatureFieldName, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc
PDF を含む document オブジェクトです。
signatureFieldName 署名フィールドの名前です
unlockOptions
暗号化されたファイルのロックを解除するために必要なパラメーターなどがあります。ファイルが暗号化されている場合にのみ必要となります。

以下の Java コードのサンプルを使用することで、署名フィールドから電子署名を削除することができます。

/*************************************************************************
 *
  *
-------------------------------------------------------------
*ADOBE SYSTEMS INCORPORATED
*Copyright 2014 Adobe Systems Incorporated
*All Rights Reserved.

*NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the 
*terms of the Adobe license agreement accompanying it.  If you have received this file 
*from a source other than Adobe, then your use, modification, or distribution of it requires 
*the prior written permission of Adobe.
-------------------------------------------------------------------------------------------------

 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.io.IOException;

import javax.jcr.RepositoryException;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceException;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesOtherException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 * Digital signatures must be removed from a signature field before a newer digital signature can be applied. 
 * A digital signature cannot be overwritten. 
 * If you attempt to apply a digital signature to a signature field that contains a signature, an exception occurs
 * 
 *The following Java code example removes a digital signature from a signature field named SignatureField1. 
 *The name of the PDF file that contain the signature field is LoanSigned.pdf
 */

@Component
@Service(value=ClearSignatureField.class)
public class ClearSignatureField {

	@Reference
	private DocAssuranceService docAssuranceService;
	/**
	 * 
	 * @param inputFile - path to an encrypted pdf document stored at disk
	 * @param outFile - path where the output file has to be saved 
	 * @throws Exception 
	 */
	public void clearSignatureField(String inputFile, String outFile) throws Exception{
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
        //Specify the name of the signature field
        String fieldName = "SignatureField1";

        //Clear the signature field
        //for encrypted document pass Unlock Options - see the method getUnlockOptions() below
        Document outPDF = docAssuranceService.clearSignatureField(inDoc,fieldName,null);
        
        //save the outPDF
        outPDF.copyToFile(new File(outFile));
	}
	
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

認証署名フィールドの取得

署名または認証する PDF ドキュメント内のすべての署名フィールドの名前を取得できます。PDF ドキュメント内の署名フィールド名が分からない場合や、名前を検証したい場合に、プログラムによって名前を取得することができます。Signature サービスは、次のような署名フィールドの完全修飾名を返します。form1[0].grantApplication[0].page1[0].SignatureField1[0]

構文getCertifyingSignatureField(Document inDoc, UnlockOptions unlockOptions)

入力パラメーター

パラメータ 説明
inDoc
PDF を含む document オブジェクトです。
UnlockOptions UnlockOptions には、暗号化されたファイルのロックを解除するために必要なパラメーターなどがあります。ファイルが暗号化されている場合にのみ必要となります。

以下の Java コードの例を使用して、ドキュメントの認証に使用された署名フィールドを取得することができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * ___________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.PDFSignatureField;
import com.adobe.fd.signatures.client.types.exceptions.DuplicateSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesBaseException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;

/**
 * You can retrieve the names of all signature fields that are located in a PDF document that you want to sign or certify. 
 * If you are unsure of the signature field names that are located in a PDF document or you want to verify the names, you can
 * programmatically retrieve them. The Signature service returns the fully qualified name of the signature field, such as 
 * form1[0].grantApplication[0].page1[0].SignatureField1[0].
 * 
 * The following Java code example retrieves the ignature field that was used to certify the document.
 */

@Component
@Service(value=GetCertifyingSignatureField.class)
public class GetCertifyingSignatureField {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at disk
	 * @throws SignaturesBaseException 
	 * @throws DuplicateSignatureFieldException 
	 * @throws PermissionsException 
	 * @throws PDFOperationException 
	 * @throws InvalidArgumentException 
	 * 
	 */
	public void getCertifyingSignatureField(String inputFile) throws Exception {
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
	      
		//Retrieve signature data for a given signature field.
		//for encrypted document pass Unlock Options - see the method getUnlockOptions() below
        PDFSignatureField pdfSignature = docAssuranceService.getCertifyingSignatureField(inDoc,null);
        
   }
       
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

PDF の暗号化タイプの取得

署名または認証する PDF ドキュメント内のすべての署名フィールドの名前を取得できます。PDF ドキュメント内の署名フィールド名が分からない場合や、名前を検証したい場合に、プログラムによって名前を取得することができます。Signature サービスは、次のような署名フィールドの完全修飾名を返します。asform1[0].grantApplication[0].page1[0].SignatureField1[0]

構文void getPDFEncryption(Document inDoc)

入力パラメーター

パラメータ 説明
inDoc
入力ファイルとして指定されたドキュメントです。暗号化されたファイルと、されていないファイルの両方が指定できます。

以下の Java コードの例を使用することで、PDF ドキュメント内にある特定の署名フィールドの署名情報を取得することができます。

/*************************************************************************
 *
 * ADOBE CONFIDENTIAL
 * ___________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 **************************************************************************/
package com.adobe.docassurance.samples;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.signatures.client.types.PDFSignatureField;
import com.adobe.fd.signatures.client.types.exceptions.DuplicateSignatureFieldException;
import com.adobe.fd.signatures.client.types.exceptions.InvalidArgumentException;
import com.adobe.fd.signatures.client.types.exceptions.PDFOperationException;
import com.adobe.fd.signatures.client.types.exceptions.PermissionsException;
import com.adobe.fd.signatures.client.types.exceptions.SignaturesBaseException;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.adobe.fd.encryption.client.EncryptionTypeResult;

/**
 * You can retrieve the names of all signature fields that are located in a PDF document that you want to sign or certify. 
 * If you are unsure of the signature field names that are located in a PDF document or you want to verify the names, you can
 * programmatically retrieve them. The Signature service returns the fully qualified name of the signature field, such as 
 * form1[0].grantApplication[0].page1[0].SignatureField1[0].
 * 
 * The following Java code example retrieves the Signature Info for the given signature field located in a PDF document.
 */

@Component
@Service(value=GetPDFEncryption.class)
public class GetPDFEncryption {

	@Reference
	private DocAssuranceService docAssuranceService;
	
	/**
	 * 
	 * @param inputFile - path to the pdf document stored at disk
	 * @throws SignaturesBaseException 
	 * @throws DuplicateSignatureFieldException 
	 * @throws PermissionsException 
	 * @throws PDFOperationException 
	 * @throws InvalidArgumentException 
	 * 
	 */
	public void getPDFEncryption(String inputFile) throws Exception {
		
		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
	      
		//Retrieve signature data for a given signature field.
		//for encrypted document pass Unlock Options - see the method getUnlockOptions() below
        EncryptionTypeResult encryptionTypeResult = docAssuranceService.getPDFEncryption(inDoc);
        
   }
       
	 /**
     * sets Unlock Options for encrypted PDF
     */
    private UnlockOptions getUnlockOptions(){
        UnlockOptions unlockOptions = new UnlockOptions();
        //sets the Open Password for password encrypted PDF
        unlockOptions.setPassword("OpenPassword");
        
        //for Certificate Encrypted Document, set the alias of the credential uploaded in the user's key store
        //and corresponding resource resolver
        
        return unlockOptions;
        
    }
}

PDF のパスワード暗号化の削除

PDF ドキュメントからパスワードベースの暗号化を削除すると、ユーザーはパスワードを指定することなく、Adobe Reader または Acrobat で PDF ドキュメントを開くことができるようになります。パスワードベースの暗号化を PDF ドキュメントから削除すると、そのドキュメントは保護されなくなります。

構文Document removePDFPasswordSecurity (Document inDoc,String password)

入力パラメーター

パラメータ 説明
inDoc
入力ファイルとして指定されたドキュメントです。パスワードで保護されている必要があります。
パスワード
ドキュメントからセキュリティを削除するため、ドキュメントを開くパスワード、または権限パスワードを使用することができます。

以下のコードのサンプルを使用することで、パスワードベースの暗号化を PDF ドキュメントから削除することができます。

package com.adobe.docassurance.samples;

import java.io.File;
import java.io.FileNotFoundException;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.jcr.api.SlingRepository;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;

/**
 * The following Java code example removes password-based encryption from a PDF document.
 * The master password value used to remove password-based encryption is PermissionPassword
 *
 */
@Component(enabled=true,immediate=true)
@Service(value=RemovePasswordEncryption.class)
public class RemovePasswordEncryption {

	// Create reference for DocAssuranceService
	@Reference
	private DocAssuranceService docAssuranceService;
    
	@Reference
    private SlingRepository slingRepository;
    
	
	/**
	 * The below sample code demonstrates removing password encryption from a PDF using AEM EncryptionService.
	 * 
	 * @param inFilePath  path of the input PDF File
	 * 		  Path Example for Files stored at hardDisk = "C:/temp/test.pdf"	 
	 * 	
	 * @param outFilePath path where the output PDF File needs to be saved
	 * 		  Path Example for Files stored at hardDisk = "C:/temp/test_out.pdf"	 
	 * @throws Exception
	 */
	public void removePasswordEncryption(String inputFile, String outputFile) throws Exception {

		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		File outFile = new File(outputFile);
		Document outDoc = null;
    	
    	try{
	
    		String password = "PermissionPassword"; //master password with which the pdf was encrypted
    												//in case if the pdf is encrypted only with user password, specify the
    												//user password
    		//Remove password-based encryption from the PDF document
    		outDoc = docAssuranceService.removePDFPasswordSecurity(inDoc,password);
	        
    	}finally{
                /**
                 * always close the PDFDocument object after your processing is done.
                 */
                if(inDoc != null){
                    inDoc.close();
                }
                
        }
            
        outDoc.copyToFile(outFile);

		
	}
	
}

証明書の暗号化の削除

証明書ベースの暗号化を PDF ドキュメントから削除できます。これにより、Adobe Reader または Acrobat で PDF ドキュメントを開くことができます。証明書で暗号化されている PDF ドキュメントから暗号化を削除するには、秘密鍵を参照します。暗号化を PDF ドキュメントから削除すると、そのドキュメントは保護されなくなります。

構文removePDFCertificateSecurity(Document inDoc, String alias, ResourceResolver resourceResolver)

入力パラメーター

パラメータ 説明
inDoc
証明書で暗号化された PDF ドキュメントの内容を表す document オブジェクトです。
alias
PDF ドキュメントから証明書ベースの暗号化を削除するために使用される、Granite Trust Store 内の鍵に対応するエイリアスです。
ResourceResolver 秘密鍵証明書を取得するため、特定のユーザーのキーストアへのアクセスに使用するリソースリゾルバーです。

以下の Java コードのサンプルを使用することで、証明書ベースの暗号化を PDF ドキュメントから削除することができます。

package com.adobe.docassurance.samples;

import java.io.File;

import javax.jcr.Session;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;

import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;

/**
 * The following Java code example removes certificate-based encryption from a PDF document
 *
 */
@Component(enabled=true,immediate=true)
@Service(value=RemovePKIEncryption.class)
public class RemovePKIEncryption {

	// Create reference for docAssuranceServiceInterface
	@Reference
	private DocAssuranceService docAssuranceService;
    
	@Reference
    private SlingRepository slingRepository;
    
	@Reference
    private JcrResourceResolverFactory jcrResourceResolverFactory ;
	
	/**
	 * The below sample code demonstrates encrypting PDF with Password using AEM docAssuranceService.
	 * 
	 * @param inFilePath  path of the input PDF File
	 * 		  Path Example for Files stored at hardDisk = "C:/temp/test.pdf"	 
	 * 	
	 * @param outFilePath path where the output PDF File needs to be saved
	 * 		  Path Example for Files stored at hardDisk = "C:/temp/test_Encrypted.pdf"	 
	 * 	 
	 * @throws Exception
	 */
	public void removePKIEncryption(String inputFile, String outputFile) throws Exception {

		File inFile = new File(inputFile);
		Document inDoc = new Document(inFile);
		
		File outFile = new File(outputFile);
		Document outDoc = null;
    	
        Session adminSession = null;
        ResourceResolver resourceResolver = null;
        try{
				adminSession = slingRepository.loginAdministrative(null);
				resourceResolver = jcrResourceResolverFactory.getResourceResolver(adminSession);
     
				//Remove certificate-based encryption from the PDF document 
				/**
				 * Here the alias("encryption") of the private credential stored in the keystore of the
				 * user has been provided with the user's resource resolver
				 */
				outDoc = docAssuranceService.removePDFCertificateSecurity(inDoc, "encryption",resourceResolver);
				
        }catch(Exception e){
        
        	// TODO Auto-generated catch block
        }finally{
            /**
             * always close the PDFDocument object after your processing is done.
             */
            if(inDoc != null){
                inDoc.close();
            }
            if(adminSession != null && adminSession.isLive()){
                if(resourceResolver != null){
                    resourceResolver.close();
                }
                adminSession.logout();
            }
        }
        
        outDoc.copyToFile(outFile);
	}


 }

Output サービス

Output サービスは、XDP ファイルをレンダリングするための API を .pdf、.pcl、.zpl、.ps 形式で提供します。このサービスは、以下の API をサポートしています。

  • generatePDFOutputフォームデザインとネットワーク、ローカルファイルシステム、または HTTP 上の場所にリテラル値で保存されたデータをマージして PDF ドキュメントを生成します。
  • generatePDFOutputフォームデザインとアプリケーションに保存されたデータをマージして PDF ドキュメントを生成します。
  • generatePDFOutputBatchフォームデザインをデータとマージして PDF ドキュメントを生成します。オプションで、レコードごとのメタデータファイルを生成したり、出力を PDF ファイルに保存したりできます。
  • generatePrintedOutputフォームデザインとネットワーク、ローカルファイルシステム、または HTTP 上の場所にリテラル値で保存されたデータをマージして、PCL、PostScript、および ZPL 出力を生成します。
  • generatePrintedOutputフォームデザインと、アプリケーションに保存されたデータをマージして PCL、PostScript、および ZPL 出力を生成します。

generatePDFOutput

generatePDFOutput API は、フォームデザインとデータをマージして PDF ドキュメントを生成します。オプションで、レコードごとのメタデータファイルを生成したり、出力を PDF ファイルに保存したりできます。generatePDFOutput API は、フォームデザイン、またはネットワーク、ローカルファイルシステム、または HTTP 上の場所にリテラル値で保存されているデータに使用します。フォームデザインと XML データがアプリケーションに保存されている場合は、「generatePDFOutput」API を使用します。

構文: Document generatePDFOutput(String uriOrFileName, Document data, PDFOutputOptions options);

入力パラメーター

パラメータ 説明
uriOrFileName 入力ファイルのパスと名前を指定します。PDF または XDP のファイル形式に対応しています。ファイル名のみが指定されていた場合、このファイルは options で指定された contentRoot に基づいて読み込まれます。
data PDF ドキュメントと統合されたデータを含む XML ファイルです。
options contentRoot、locale、AcrobatVersion、linearizedPDF、およびtaggedPDFの変数の値を指定します。この options パラメーターは、 PDFOutputOptions タイプのオブジェクトを受け付けます。

以下の Java コードのサンプルを使用することで、フォームデザインと XML ファイルに保存されたデータをマージして PDF または PDF ドキュメントを生成することができます。

@Reference private OutputService outputService;

private File generatePDFOutput(String contentRoot,File inputXML,String templateStr,String acrobatVersion,String tagged,String linearized, String locale) {

String outputFolder="C:/Output";

Document doc=null;

try {

        PDFOutputOptions option = new PDFOutputOptions();         option.setContentRoot(contentRoot);         if(acrobatVersion.equalsIgnoreCase("Acrobat_10"))

        { 

            option.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_10);

        } else if(acrobatVersion.equalsIgnoreCase("Acrobat_10_1")) {

            option.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_10_1);

        } else if(acrobatVersion.equalsIgnoreCase("Acrobat_11")) {             option.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_11);

        }

        if (tagged.equalsIgnoreCase("true") ) {

            option.setTaggedPDF(true );

        }

        if (linearized.equalsIgnoreCase("true") ) {

            option.setTaggedPDF(true );

        }

        if(locale!=null)

        {

            option.setLocale(locale);

        }

        InputStream in = new FileInputStream(inputXML);

        doc = outputService.generatePDFOutput(templateStr,new Document(in),option);         File toSave = new File(outputFolder+"Output.pdf");

        doc.copyToFile(toSave);

        return toSave;

    } catch (OutputServiceException e) {

         e.printStackTrace();

    }catch (FileNotFoundException e) {

         e.printStackTrace();

    } catch (IOException e) {

         e.printStackTrace();

    }finally{

                doc.dispose();

    }

    return null;

}

generatePDFOutput

generatePDFOutput API は、フォームデザインとデータをマージして PDF ドキュメントを生成します。オプションで、レコードごとのメタデータファイルを生成したり、出力を PDF ファイルに保存したりできます。generatePrintedOutput API は、フォームデザイン、またはアプリケーションに保存されているデータに使用します。フォームデザインと XML データがネットワーク、ローカルファイルシステム、または HTTP 上の場所にリテラル値で保存されている場合は、「generatePDFOutput」API を使用します。

構文Document generatePDFOutput(Document inputdocument, Document data, PDFOutputOptions options)

入力パラメーター

パラメータ 説明
Inputdocument
入力ファイルのパスと名前を指定します。PDF または XDP のファイル形式に対応しています。ファイル名のみが指定されていた場合、このファイルは options で指定された contentRoot に基づいて読み込まれます。
data PDF ドキュメントと統合されたデータを含む XML ファイルです。
options contentRoot、locale、AcrobatVersion、linearizedPDF、およびtaggedPDFの変数の値を指定します。この options パラメーターは、 PDFOutputOptions タイプのオブジェクトを受け付けます。

以下の Java コードのサンプルを使用することで、フォームデザインと XML ファイルに保存されたデータをマージして PDF または PDF ドキュメントを生成することができます。

@Reference private OutputService outputService;

private File generatePDFOutput2(String contentRoot, File inputXML, File templateStr, String acrobatVersion, String tagged, String linearized, String locale) {

String outputFolder="C:/Output";

Document doc=null;

     try {

            PDFOutputOptions option = new PDFOutputOptions();             option.setContentRoot(contentRoot);
            if(locale!=null)

            {

                option.setLocale(locale);

            }

            if(acrobatVersion.equalsIgnoreCase("Acrobat_10"))

            {

                option.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_10);

            } else if(acrobatVersion.equalsIgnoreCase("Acrobat_10_1")) {                 option.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_10_1);

            } else if(acrobatVersion.equalsIgnoreCase("Acrobat_11")) {                 option.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_11);

            }

            if (tagged.equalsIgnoreCase("true") ) {

                option.setTaggedPDF(true );

            }

            if (linearized.equalsIgnoreCase("true") ) {

                option.setTaggedPDF(true );

            }

            InputStream inputXMLStream = new FileInputStream(inputXML); 

            InputStream templateStream = new FileInputStream(templateStr);;

            doc = outputService.generatePDFOutput(new Document(templateStream),new             Document(inputXMLStream),option);

                     File toSave = new File(outputFolder,"Output.pdf");

                     doc.copyToFile(toSave);

                    return toSave;

                } catch (OutputServiceException e) {

                         e.printStackTrace();

               }catch (FileNotFoundException e) {

                          e.printStackTrace();

               } catch (IOException e) {

                          e.printStackTrace();

               }finally{

                            doc.dispose();

              }

                return null;

}

generatePDFOutputBatch

フォームデザインをデータとマージして PDF ドキュメントを作成します。オプションで、レコードごとのメタデータファイルを生成したり、出力を PDF ファイルに保存したりできます。generatePDFOutputBatch API は、フォームデザイン、またはネットワーク、ローカルファイルシステム、または HTTP 上の場所にリテラル値で保存されているデータに使用します。

構文BatchResult generatePDFOutputBatch(Map templates, Map data, PDFOutputOptions options, BatchOptions batchOptions);

入力パラメーター

パラメーター 説明
templates
キーのマップと、テンプレートのファイル名を指定します。
data キーのマップと、データドキュメントを指定します。キーの値が null 値でなかった場合、データドキュメントはtemplates のマップで指定されたキーに対応するテンプレートでレンダリングされます。 
options contentRoot、locale、AcrobatVersion、linearizedPDF、およびtaggedPDFの変数の値を指定します。この options パラメーターは、 PDFOutputOptions タイプのオブジェクトを受け付けます。
batchOptions 変数 generateManyFiles の値を指定します。複数のファイルを生成するには、generateManyFiles フラグを設定します。この options パラメーターは、BatchOptions タイプのオブジェクトを受け付けます。

以下の Java コードのサンプルを使用することで、フォームデザインと XML ファイルに保存されたデータをマージして PDF ドキュメントを生成することができます。

private ArrayList generatePDFBatch(String contentRoot,String multipleFiles) {

String outputFolder="C:/Output";

    try {

        PDFOutputOptions option = new PDFOutputOptions();         option.setContentRoot(contentRoot);

        Map templates = new LinkedHashMap();

        Map data = new LinkedHashMap();

        String template1 = "PurchaseOrder.xdp"; String template2 = "CardApp.xdp";         templates.put(template1.substring(0, template1.indexOf(".xdp")),template1);         templates.put(template1.substring(0, template2.indexOf(".xdp")),template2);

        File inputXML1 = new File("c:/InputFolder/PurchaseOrder.xml");

        File inputXML2 = new File("c:/InputFolder/CardApp.xml");

        InputStream in1 = new FileInputStream(inputXML1);

        InputStream in2 = new FileInputStream(inputXML2);

        data.put(template1.substring(0, template1.indexOf(".xdp")),new         Document((in1))); data.put(template1.substring(0,         template1.indexOf(".xdp")),new Document((in2))); BatchOptions bo = new         BatchOptions(); BatchResult ret=null;         if(multipleFiles.equalsIgnoreCase("true"))

        {

            bo.setGenerateManyFiles(true);

            ret = outputService.generatePDFOutputBatch(templates, data, option, bo);

        } else {

            ret = outputService.generatePDFOutputBatch(templates, data, option, new             BatchOptions());

        }

        ArrayList outputs = new ArrayList();

        int counter=0;

        if(ret.getMetaDataDoc() !=null ){

        File toSave = new File(outputFolder+"Output.xml");

        ret.getMetaDataDoc().copyToFile(toSave);

        outputs.add(toSave);

        List<Document> list = ret.getGeneratedDocs();

        for(Document doc:list){

        File toSave = new File(outputFolder,"Output"+"_"+counter+".pdf");         doc.copyToFile(toSave);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;         outputs.add(toSave);

        counter++;

        doc.dispose();

        }

        return outputs;

       } catch (OutputServiceException e) {

            e.printStackTrace();

       }catch (FileNotFoundException e) {

            e.printStackTrace();

       }catch (IOException e) {

            e.printStackTrace();

       }

       return null;

}

generatePrintedOutput

フォームデザインとデータから、PCL、PostScript、および ZPL 出力を生成します。データファイルはフォームデザインとマージされ、印刷用にフォーマットされます。出力はプリンターに直接送信したり、ファイルとして保存したりできます。generatePrintedOutput API は、フォームデザイン、またはアプリケーションに保存されているデータに使用します。

構文Document generatePrintedOutput(String uriOrFileName, Document data, PrintedOutputOptions);

入力パラメーター

パラメーター 説明
uriOrFileName
入力ファイルのパスと名前を指定します。ファイル名のみが指定されていた場合、このファイルは options で指定された contentRoot に基づいて読み込まれます。PDF または XDP のファイル形式に対応しています。
data PDF ドキュメントと統合されたデータを含む XML ファイルです。
options contentRoot、locale、AcrobatVersion、linearizedPDF、およびtaggedPDFの変数の値を指定します。この options パラメーターは、 PDFOutputOptions タイプのオブジェクトを受け付けます。

以下の Java コードのサンプルを使用することで、フォームデザインとデータから、PCL、PostScript、および ZPL 出力を生成することができます。出力タイプは、printConfig パラメーターに渡された値によって異なります。

@Reference private OutputService outputService;

private File generatePrintedOutput(String contentRoot,File inputXML,String templateStr,String printConfig) {

String outputFolder="C:/Output";

Document doc=null;

    try {

            PrintedOutputOptions options = new PrintedOutputOptions();                           options.setContentRoot(contentRoot);

            if(printConfig.equalsIgnoreCase("ps"))

            {

                options.setPrintConfig(PrintConfig.PS_PLAIN);

            }else if(printConfig.equalsIgnoreCase("pcl")) {

                            options.setPrintConfig(PrintConfig.HP_PCL_5e);

                     }else if(printConfig.equalsIgnoreCase("zpl")) {                                                                       options.setPrintConfig(PrintConfig.ZPL300);

            }  

            InputStream in = new FileInputStream(inputXML);

            doc = outputService.generatePrintedOutput(templateStr,new             Document(in),options);

            in.close();

            File toSave = new File(outputFolder,"Output"+"."+printConfig);             doc.copyToFile(toSave);

            return &nbsp;toSave;

        } catch (OutputServiceException e) {

             e.printStackTrace();

        }catch (FileNotFoundException e) {

             e.printStackTrace();

        }catch (IOException e) {

             e.printStackTrace();

        }finally{

             doc.dispose();

        }

        return null;

}

generatePrintedOutput

指定したフォームデザインとデータファイルに対して、PCL、PostScript、および ZPL 出力を生成します。データファイルはフォームデザインとマージされ、印刷用にフォーマットされます。出力はプリンターに直接送信したり、ファイルとして保存したりできます。generatePrintedOutput API は、フォームデザイン、またはアプリケーションに保存されているデータに使用します。

構文Document generatePrintedOutput(Document inputdocument, Document data, PrintedOutputOptions);

入力パラメーター

パラメーター 説明
Inputdocument
入力ファイルのパスと名前を指定します。ファイル名のみが指定されていた場合、このファイルは options で指定された contentRoot に基づいて読み込まれます。XDP のファイル形式に対応しています。 
data PDF ドキュメントと統合されたデータを含む XML ファイルです。
options contentRoot、locale、printConfig、copies、および paginationOverride の値の設定に使用されるオブジェクトです。この options パラメーターは、 PDFOutputOptions タイプのオブジェクトを受け付けます。

以下の Java コードのサンプルを使用することで、フォームデザインとデータから、PCL、PostScript、および ZPL 出力を生成することができます。出力タイプは、printConfig パラメーターに渡された値によって異なります。

@Reference private OutputService outputService;

private File generatePrintedOutput2(File &nbsp;inputXML,File templateStr,String printConfig) {

String outputFolder="C:/Output";

Document doc=null;

       try {

            PrintedOutputOptions options = new PrintedOutputOptions();             if(printConfig.equalsIgnoreCase("ps"))

            {

                options.setPrintConfig(PrintConfig.PS_PLAIN);

            }else if(printConfig.equalsIgnoreCase("pcl")) {                                   options.setPrintConfig(PrintConfig.HP_PCL_5e);

            }else if(printConfig.equalsIgnoreCase("zpl")) {                                                                       options.setPrintConfig(PrintConfig.ZPL300);

                             }

            InputStream inputXMlStream = new FileInputStream(inputXML);

            InputStream templateStream = new FileInputStream(templateStr); doc =             outputService.generatePrintedOutput(new Document(templateStream),new             Document(inputXMlStream),options);

            File toSave = new File(outputFolder,"Output"+"."+printConfig);             doc.copyToFile(toSave);

            return toSave;

            } catch (OutputServiceException e) {

                e.printStackTrace();

            }catch (FileNotFoundException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }finally{

                doc.dispose();

            }

            return null;

}

generatePrintedOutputBatch

フォームデザインとデータをマージしてPS、PCL、および ZPL 形式のドキュメントを生成します。オプションで、レコードごとのメタデータファイルを生成したり、出力を PDF ファイルに保存したりできます。generatePrintedOutputBatch API は、フォームデザイン、またはネットワーク、ローカルファイルシステム、または HTTP 上の場所にリテラル値で保存されているデータに使用します。

構文 BatchResult generatePrintedOutputBatch(Map templates, Map data, PrintedOutputOptions options, BatchOptions batchOptions);

入力パラメーター

パラメーター 説明
templates
キーのマップと、テンプレートのファイル名を指定します。
data キーのマップと、データドキュメントを指定します。キーの値が null 値でなかった場合、データドキュメントはtemplates のマップのキーに対応するテンプレートでレンダリングされます。
options PrintedOutputOptions タイプのオブジェクトを指定します。contentRoot、locale、printConfig、copies、および paginationOverride の値の設定に使用されるオブジェクトです。
batchOptions 変数 generateManyFiles の値を指定します。複数のファイルを生成するには、generateManyFiles フラグを設定します。この options パラメーターは、BatchOptions タイプのオブジェクトを受け付けます。

以下の Java コードのサンプルを使用することで、複数のフォームデザインテンプレートとデータファイルから、一括で PCL、PostScript、および ZPL 出力を生成することができます。出力タイプは、printConfig パラメーターに渡された値によって異なります。

@Reference private OutputService outputService;

private ArrayList generatePrintedOutputBatch(String contentRoot,String multipleFiles,String printConfig) {

String outputFolder="C:/Output";

        try {

                PrintedOutputOptions option = new PrintedOutputOptions();                 option.setContentRoot(contentRoot);

                Map templates = new LinkedHashMap();

                Map data = new LinkedHashMap();

                String template1 = "PurchaseOrder.xdp";

                String template2 = "CardApp.xdp";

                templates.put(template1.substring(0,                 template1.indexOf(".xdp")),template1);                 templates.put(template1.substring(0,                 template2.indexOf(".xdp")),template2);

                File inputXML1 = new                                   File("c:/InputFolder/PurchaseOrder.xml");

                File inputXML2 = new File("c:/InputFolder/CardApp.xml");

                InputStream in1 = new FileInputStream(inputXML1);

                InputStream in2 = new FileInputStream(inputXML2);                  data.put(template1.substring(0,                     template1.indexOf(".xdp")),new Document((in1)));

                 data.put(template2.substring(0,                     template2.indexOf(".xdp")),new Document((in2)));

                 if(printConfig.equalsIgnoreCase("ps"))

                 {

                    option.setPrintConfig(PrintConfig.PS_PLAIN);

                 } else if(printConfig.equalsIgnoreCase("pcl"))

                 {

                    option.setPrintConfig(PrintConfig.HP_PCL_5e);

                 } else if(printConfig.equalsIgnoreCase("zpl")){

                                         option.setPrintConfig(PrintConfig.ZPL300);

                 }

                 option.setContentRoot(contentRoot);

                 BatchOptions bo = new BatchOptions();

                 BatchResult ret =                             outputService.generatePrintedOutputBatch(temp                                    lates, data, option, new                                                     BatchOptions());

                 ArrayList outputs = new ArrayList();

                 int counter=0;

                 if(ret.getMetaDataDoc() !=null ){

                 File toSave = new File(outputFolder,"Output"+".xml");                    ret.getMetaDataDoc().copyToFile(toSave);

                 outputs.add(toSave);

                 List<Document> list = ret.getGeneratedDocs();

                 for(Document doc:list){

                 File toSave = new                                                               File(outputFolder,"Output"+"_"+counter+".                                        "+printConfig);                                    doc.copyToFile(toSave);

                 outputs.add(toSave);

                 counter++;

                 doc.dispose();

                 }

                 return outputs;  

          }

            catch (OutputServiceException e) {

                e.printStackTrace();

          }catch (FileNotFoundException e) {

                e.printStackTrace();

          } catch (IOException e) {

                e.printStackTrace();

          }

            return null;

  }

Forms サービス

この Forms サービスは、インタラクティブ PDF フォームからデータを読み込む、または書き出すための API を提供します。インタラクティブ PDF フォームとは、ユーザーからの情報を表示、収集するための 1 つ、または複数のフィールドを含む PDF ドキュメントです。このサービスは、以下の API をサポートしています。

  • exportDataPDF フォームからデータを書き出します。
  • importDataインタラクティブ PDF フォームにデータを読み込みます。

exportData

XML および XDP 形式のインタラクティブ PDF フォームからフォームデータを書き出します。

構文Document exportData(Document xdpOrPdf, DataFormat dataFormat)

入力パラメーター

パラメーター 説明
xdpOrPdf
XDP または PDF ファイルを含むドキュメントオブジェクトを指定します。 
dataFormat
データが書き出される形式を指定します。列挙型(XDP、XmlData、Auto)の変数を受け付けます。

以下の Java コードのサンプルを使用することで、XML および XDP 形式のインタラクティブ PDF フォームからフォームデータを書き出すことができます。

サンプル

@Reference private FormsService formsService;
private File exportData(String &nbsp;dataFormat, File &nbsp;inDoc) {

String outputFolder="C:/Output";

InputStream in; Document doc=null;

try {

        in = new FileInputStream(inDoc);

        if(dataFormat.equalsIgnoreCase("xml")) 

        {

          doc=formsService.exportData(new Document(in),                                       DataFormat.XmlData);

        }

        else if(dataFormat.equalsIgnoreCase("xdp")) {

        doc =formsService.exportData(new Document(in),                       DataFormat.XDP);

        }

        File toSave = new File(outputFolder,"Output"+"."+dataFormat);

        doc.copyToFile(toSave);

        return toSave;

    } catch (FormsServiceException e) {

       e.printStackTrace();

    }catch (FileNotFoundException e) {

       e.printStackTrace();

    } catch (IOException e) {

       e.printStackTrace();

    }finally{

        doc.dispose();

    }

    return null;

 }

importData

インタラクティブ PDF フォームにフォームデータを読み込みます。

構文:Document importData(Document PDF, Document data)

入力パラメーター

パラメーター 説明
PDF
PDF などの document オブジェクトです。 
データ
XML 形式のデータを含む XML ファイルです。

以下の Java コードのサンプルを使用することで、インタラクティブ PDF フォームにフォームデータを読み込むことができます。

サンプル

@Reference private FormsService formsService

private File importData(File inDoc, File inXML)

{

 String outputFolder="C:/Output";

 Document doc=null;

 try {

        InputStream in = new FileInputStream(inDoc);

        InputStream in2 = new FileInputStream(inXML);

        doc=formsService.importData(new Document(in), new Document(in2));

        File toSave = new File(outputFolder,"Output.pdf");

        doc.copyToFile(toSave);

    } catch (FormsServiceException e) {

         e.printStackTrace();

    }catch (FileNotFoundException e) {

         e.printStackTrace();

    } catch (IOException e) {

         e.printStackTrace();

    }finally{

        doc.dispose();

    }

    return null;

}

PDF Generator サービス

PDF Generator サービスは、ネイティブファイル形式を PDF に変換する API を提供します。また、PDF を他のファイル形式に変換することや、PDF ドキュメントのサイズを最適化することもできます。

GeneratePDFService

GeneratePDFService は、さまざまなファイル形式(.doc、.docx、.ppt、.pptx、.xls、.xlsx、.odp、.odt、.ods、.swf(廃止)、.jpg、.bmp、.tif、.png、.html やその他のファイル形式)を PDF に変換する API を提供します。また、PDF をさまざまなファイル形式で書き出したり、PDF を最適化する API も提供しています。このサービスは、以下の API をサポートしています。

  • createPDF:対応ファイル形式を PDF ドキュメントに変換します。Microsoft Word、Microsoft PowerPoint、Microsoft Excel、Microsoft Project などのファイル形式に対応しています。また、これらのアプリケーションに加えて、サードパーティ製の汎用 PDF 生成アプリケーションタイプも API にプラグインすることができます。
  • exportPDF:PDF ドキュメントを対応ファイル形式に変換します。このメソッドは、内容を特定のファイル形式で読み込む、または書き出す PDF を受け付けます。
  • optimizePDF:PDF ドキュメントを最適化し、PDF ドキュメントを別の形式に変換します。このメソッドは PDF ドキュメントを入力ファイルとして受け付けます。
  • htmlToPdf2:HTML ページを PDF ドキュメントに変換します。HTML ページの URL を入力値として受け付けます。

注意:

AIX オペレーティングシステムで稼動している AEM Forms サーバーに対する HTMLtoPDF API の使用は非推奨です。

createPDF

createPDF API は対応ファイル形式を PDF ドキュメントに変換します。Microsoft Word、Microsoft PowerPoint、Microsoft Excel、Microsoft Project などのさまざまなファイル形式に対応しています。また、これらのアプリケーションに加えて、サードパーティ製の汎用 PDF 生成アプリケーションタイプも API にプラグインすることができます。

変換の際は、一部のパラメーターのみが必須となります。入力ドキュメントは必須のパラメーターです。後から、出力 PDF ドキュメントにセキュリティ権限、PDF 出力設定およびメタデータ情報を適用することもできます。

createPDF サービスは結果を java.util.Map で返します。マップのキーを以下に示します。

  • ConvertedDoc:新しく作成した PDF ドキュメントを含みます。
  • LogDoc:ログファイルを含みます。

createPDF サービスは以下の例外をスローします。

  • ConversionException
  • InvalidParameterException
  • FileFormatNotSupportedException

構文:  Map createPDF(Document inputDoc, String inputFilename, String fileTypeSettings, String pdfSettings, String securitySettings, Document settingsDoc, Document xmpDoc) throws InvalidParameterException, ConversionException, FileFormatNotSupportedException;

入力パラメーター

パラメーター 説明
inputDoc
document オブジェクトを指定します。Document オブジェクトには、入力ファイルが含まれます。com.adobe.aemfd.docmanager.Document オブジェクトを入力ドキュメントに作成します。これは必須パラメーターです。
inputFileName
拡張子を含む入力ファイルの名前です。これは必須パラメーターです。
fileTypeSettings これはオプションのパラメーターです。
pdfSettings

変換されるドキュメントの PDF 出力です。以下の設定を適用することができます。

  • 高品質印刷
  • PDFA1b_2005_RGB
  • PDFA1b_2005_CMYK
  • PDFX1a_2001
  • PDFX3_2002
  • Press_Quality
  • Smallest_File_Size

これはオプションのパラメーターです。

securitySettings

変換されるドキュメントのセキュリティ設定を表示します。以下の設定を適用することができます。

  • セキュリティなし
  • パスワードによるセキュリティ
  • 証明書によるセキュリティ
  • Adobe Policy Server

これはオプションのパラメーターです。

settingsDoc PDF ドキュメントの生成中に適用される設定(例えば、Web 表示のための PDF ドキュメントの最適化)および PDF ドキュメントの作成後に適用される設定(例えば、初期表示やセキュリティ)を含むファイルです。これはオプションのパラメーターです。
xmpDoc   生成された PDF ドキュメントに適用されたメタ情報を含むファイルです。このパラメーターはオプションです。

以下の Java コードを使用することで、対応ファイル形式を PDF ドキュメントに変換することができます。

@Reference GeneratePDFService generatePdfService;
File createPDF(File inputFile, String inputFilename, String fileTypeSettings, String pdfSettings, String securitySettings, File settingsFile, File xmpFile) throws Exception
{
	Transaction tx = OSGiUtils.getTransactionManager().getTransaction();
	// Begin transaction
	if (tx == null)
	OSGiUtils.getTransactionManager().begin();
	String outputFolder="C:/Output"
	Document convertedDoc = null;
	Document inDoc = null;
	Document settingsDoc = null;
	Document xmpDoc = null;
	try
	{
		inDoc = new Document(inputFile);
		if(inputFilename == null || inputFilename.trim().equals("")) {
			throw new Exception("Input file name cannot be null");
		}
		if(inputFileExtension.lastIndexOf('.') == -1) {
			throw new Exception("Input file should have an extension");
		}
		if(settingsFile != null && settingsFile.exists() && settingsFile.isFile())
		settingsDoc = new Document(settingsFile);
		if(xmpFile != null && xmpFile.exists() && xmpFile.isFile())
		xmpDoc = new Document(xmpFile);
		Map result = generatePdfService.createPDF(inDoc, inputFilename, fileTypeSettings, pdfSettings, securitySettings, settingsDoc, xmpDoc);
		convertedDoc = (Document)result.get("ConvertedDoc");
		OSGiUtils.getTransactionManager().commit();
		File outputFile = new File(outputFolder,"Output.pdf");
		doc.copyToFile(outputFile);
		return outputFile;
	}
	catch (Exception e)
	{
		if (OSGiUtils.getTransactionManager().getTransaction() != null)
		OSGiUtils.getTransactionManager().rollback();
		throw e;
	}
	finally {
		if (convertedDoc != null) {
			convertedDoc.dispose();
			convertedDoc = null;
		}
		if (inDoc != null) {
			inDoc.dispose();
			inDoc = null;
		}
		if (settingsDoc != null) {
			settingsDoc.dispose();
			settingsDoc = null;
		}
		if (xmpDoc != null) {
			xmpDoc.dispose();
			xmpDoc = null;
		}
	}
}

exportPDF

PDF ドキュメントを対応ファイル形式に変換します。このメソッドは、内容を特定のファイル形式で読み込む、または書き出す PDF を受け付けます。

createPDF サービスは結果を java.util.Map で返します。マップのキーを以下に示します。

  • ConvertedDoc:出力ドキュメントを含みます。

createPDF サービスは以下の例外をスローします。

  • ConversionException
  • InvalidParameterException
  • FileFormatNotSupportedException

構文:  Map exportPDF(Document inputDoc, String inputFileName, String formatType, Document settingsDoc) throws ConversionException, InvalidParameterException, FileFormatNotSupportedException;

入力パラメーター

パラメーター 説明
inputDoc
変換するドキュメントを指定します。 
inputFileName
拡張子を含むファイルの名前です。
formatType exportPDF API 用の出力ファイル形式です。
settingsDoc  出力ドキュメントの生成時に適用する設定を含むファイルです。通常、XML ファイルになります。

以下の Java コードのサンプルを使用することで、PDF ドキュメントを特定のファイル形式に変換することができます。

(tx == null)
OSGiUtils.getTransactionManager().begin();
String outputFolder="C:/Output"
Document convertedDoc = null;
Document inDoc = null;
Document settingsDoc = null;
try
{
	inDoc = new Document(inputFile);
	if(inputFileName == null || inputFileName.trim().equals("")) {
		throw new Exception("Input file name cannot be null");
	}
	if(inputFileExtension.lastIndexOf('.') == -1) {
		throw new Exception("Input file should have an extension");
	}
	if(settingsFile != null && settingsFile.exists() && settingsFile.isFile())
	settingsDoc = new Document(settingsFile);
	Map result = generatePdfService.exportPDF(inDoc, inputFileName, formatType, settingsDoc);
	convertedDoc = (Document)result.get("ConvertedDoc");
	OSGiUtils.getTransactionManager().commit();
	File outputFile = new File(outputFolder,"OutputFile");
	doc.copyToFile(outputFile);
	return outputFile;
}
catch (Exception e)
{
	if (OSGiUtils.getTransactionManager().getTransaction() != null)
	OSGiUtils.getTransactionManager().rollback();
	throw e;
}
finally {
	if (convertedDoc != null) {
		convertedDoc.dispose();
		convertedDoc = null;
	}
	if (inDoc != null) {
		inDoc.dispose();
		inDoc = null;
	}
	if (settingsDoc != null) {
		settingsDoc.dispose();
		settingsDoc = null;
	}
}
}

optimizePDF

OptimizePDF API は、PDF ファイルのサイズを縮小することによって PDF ファイルを最適化します。この変換を実行すると、生成された PDF ファイルが、元のファイルサイズよりも小さくなる場合があります。また、この操作では、PDF ドキュメントを、最適化パラメーターで指定されたバージョンの PDF に変換します。これは、最適化された PDF を含む OptimizePDFResult オブジェクトを返します。

createPDF サービスは以下の例外をスローします。

  • ConversionException
  • InvalidParameterException
  • FileFormatNotSupportedException

構文:  OptimizePDFResult optimizePDF(Document inputDoc, String fileTypeSettings, Document settingsDoc) throws ConversionException, InvalidParameterException, FileFormatNotSupportedException;

入力パラメーター

パラメーター 説明
inputDoc
入力ドキュメントを指定します。これは必須パラメーターです。
fileTypeSettings
これはオプションのパラメーターです。
settingsDoc  PDF ドキュメントの生成中に適用される設定(例えば、Web 表示のための PDF ドキュメントの最適化)および PDF ドキュメントの作成後に適用される設定(例えば、初期表示やセキュリティ)を含むファイルです。これはオプションのパラメーターです。

以下の Java コードのサンプルを使用することで、入力 PDF ファイルのサイズを小さくし、最適化することができます。

@Reference GeneratePDFService generatePdfService;
File optimizePDF(File inputFile, String fileTypeSettings, File settingsFile) throws Exception
{
	Transaction tx = OSGiUtils.getTransactionManager().getTransaction();
	// Begin transaction
	if (tx == null)
	OSGiUtils.getTransactionManager().begin();
	String outputFolder="C:/Output"
	Document convertedDoc = null;
	Document inDoc = null;
	Document settingsDoc = null;
	try
	{
		inDoc = new Document(inputFile);
		if(settingsFile != null && settingsFile.exists() && settingsFile.isFile())
		settingsDoc = new Document(settingsFile);
		OptimizePDFResult result = generatePdfService.optimizePDF(inDoc, fileTypeSettings, settingsDoc);
		convertedDoc = result.getConvertedDocument();
		OSGiUtils.getTransactionManager().commit();
		File outputFile = new File(outputFolder,"Output.pdf");
		doc.copyToFile(outputFile);
		return outputFile;
	}
	catch (Exception e)
	{
		if (OSGiUtils.getTransactionManager().getTransaction() != null)
		OSGiUtils.getTransactionManager().rollback();
		throw e;
	}
	finally {
		if (convertedDoc != null) {
			convertedDoc.dispose();
			convertedDoc = null;
		}
		if (inDoc != null) {
			inDoc.dispose();
			inDoc = null;
		}
		if (settingsDoc != null) {
			settingsDoc.dispose();
			settingsDoc = null;
		}
	}
}

htmlToPdf2

HTML ページを PDF ドキュメントに変換します。HTML ページの URL を入力値として受け付けます。

htmlToPdf2 サービスは HtmlToPdfResult オブジェクトを返します。result.getConvertedDocument() を通して変換済み PDF を取得することができます。

htmlToPdf2 サービスは以下の例外をスローします。

  • ConversionException
  • InvalidParameterException
  • FileFormatNotSupportedException

構文:  HtmlToPdfResult htmlToPdf2(String inputUrl, String fileTypeSettingsName, String securitySettingsName, Document settingsDoc, Document xmpDoc) throws ConversionException, InvalidParameterException, FileFormatNotSupportedException;

入力パラメーター

パラメーター 説明
inputDoc
入力ドキュメントを指定します。これは必須パラメーターです。
fileTypeSettings
これはオプションのパラメーターです。
settingsDoc  PDF ドキュメントの生成中に適用される設定(例えば、Web 表示のための PDF ドキュメントの最適化)および PDF ドキュメントの作成後に適用される設定(例えば、初期表示やセキュリティ)を含むファイルです。これはオプションのパラメーターです。

以下の Java コードのサンプルを使用することで、HTML ページを PDF ドキュメントに変換することができます。

Reference GeneratePDFService generatePdfService;
File htmlToPdf(String inputUrl, String fileTypeSettingsName, String securitySettingsName, File settingsFile, File xmpFile) throws Exception
{
	Transaction tx = OSGiUtils.getTransactionManager().getTransaction();
	// Begin transaction
	if (tx == null)
	OSGiUtils.getTransactionManager().begin();
	String outputFolder="C:/Output"
	Document convertedDoc = null;
	Document settingsDoc = null;
	Document xmpDoc = null;
	try
	{
		if(settingsFile != null && settingsFile.exists() && settingsFile.isFile())
		settingsDoc = new Document(settingsFile);
		if(xmpFile != null && xmpFile.exists() && xmpFile.isFile())
		xmpDoc = new Document(xmpFile);
		HtmlToPdfResult result = generatePdfService.htmlToPdf2(inputURL, fileTypeSettingsName, securitySettingsName, settingsDoc, xmpDoc);;
		convertedDoc = result.getConvertedDocument();
		OSGiUtils.getTransactionManager().commit();
		File outputFile = new File(outputFolder,"Output.pdf");
		doc.copyToFile(outputFile);
		return outputFile;
	}
	catch (Exception e)
	{
		if (OSGiUtils.getTransactionManager().getTransaction() != null)
		OSGiUtils.getTransactionManager().rollback();
		throw e;
	}
	finally {
		if (convertedDoc != null) {
			convertedDoc.dispose();
			convertedDoc = null;
		}
		if (xmpDoc != null) {
			xmpDoc.dispose();
			xmpDoc = null;
		}
		if (settingsDoc != null) {
			settingsDoc.dispose();
			settingsDoc = null;
		}
	}
}

DistillerService

Distiller サービスでは、PostScript、Encapsulated PostScript(EPS)および プリンターテキストファイル(PRN)を PDF ファイルに変換できます。Distiller サービスは、請求書や明細書など、容量の大きい印刷ドキュメントを電子ドキュメントに変換する際によく使用されます。ドキュメントを PDF に変換して、顧客にドキュメントの印刷バージョンと電子バージョンを送付できます。.ps、.eps、および .prn のファイル形式に対応しています。このサービスは、以下の API をサポートしています。

createPDF サービスは結果を java.util.Map で返します。マップのキーを以下に示します。

  • ConvertedDoc:新しく作成した PDF ドキュメントを含みます。
  • LogDoc:ログファイルを含みます。

createPDF サービスは以下の例外をスローします。

  • ConversionException
  • InvalidParameterException
  • FileFormatNotSupportedException

createPDF

対応の形式を PDF ドキュメントに変換します。このメソッドは .ps、.eps、および .prn の形式を持つファイルを入力ファイルとして受け付けます。出力 PDF ドキュメントには特定のセキュリティ権限、PDF 出力設定およびメタデータ情報を適用することができます。

構文:  Map createPDF(Document inputDoc, String inputFileName, String pdfSettings, String securitySettings, Document settingsDoc, Document xmpDoc) throws ConversionException, InvalidParameterException, FileFormatNotSupportedException;

入力パラメーター

パラメーター 説明
inputDoc
入力ドキュメントを指定します。これは必須パラメーターです。
inputFileName 入力ファイルの拡張子と、完全な名前を指定します。これは必須パラメーターです。
pdfSettings

変換されるドキュメントの PDF 出力設定です。以下の設定を適用することができます。

  • 高品質印刷
  • PDFA1b_2005_RGB
  • PDFA1b_2005_CMYK
  • PDFX1a_2001
  • PDFX3_2002
  • プレス品質
  • Smallest_File_Size

これはオプションのパラメーターです。

securitySettings

変換されるドキュメントのセキュリティ設定を表示します。以下の設定を適用することができます。

  • セキュリティなし
  • パスワードによるセキュリティ
  • 証明書によるセキュリティ
  • Adobe Policy Server

これはオプションのパラメーターです。

settingsDoc  PDF ドキュメントの生成中に適用される設定(例えば、Web 表示のための PDF ドキュメントの最適化)および PDF ドキュメントの作成後に適用される設定(例えば、初期表示やセキュリティ)を含むファイルです。これはオプションのパラメーターです。
xmpDoc  生成された PDF ドキュメントのメタ情報を含むファイルです。これはオプションのパラメーターです。

以下の Java コードのサンプルを使用することで、PostScript(PS)、Encapsulated PostScript(EPS)およびプリンタテキストファイル(PRN)の入力ファイルを PDF ファイルに変換することができます。

@Reference DistillerService distillerService;
File createPDF(File inputFile, String inputFilename, String pdfSettings, String securitySettings, File settingsFile, File xmpFile) throws Exception
{
	Transaction tx = OSGiUtils.getTransactionManager().getTransaction();
	// Begin transaction
	if (tx == null)
	OSGiUtils.getTransactionManager().begin();
	String outputFolder="C:/Output"
	Document convertedDoc = null;
	Document inDoc = null;
	Document settingsDoc = null;
	Document xmpDoc = null;
	try
	{
		inDoc = new Document(inputFile);
		if(inputFilename == null || inputFilename.trim().equals("")) {
			throw new Exception("Input file name cannot be null");
		}
		if(inputFileExtension.lastIndexOf('.') == -1) {
			throw new Exception("Input file should have an extension");
		}
		if(settingsFile != null && settingsFile.exists() && settingsFile.isFile())
		settingsDoc = new Document(settingsFile);
		if(xmpFile != null && xmpFile.exists() && xmpFile.isFile())
		xmpDoc = new Document(xmpFile);
		Map result = distillerService.createPDF(inDoc, inputFilename, pdfSettings, securitySettings, settingsDoc, xmpDoc);
		convertedDoc = (Document)result.get("ConvertedDoc");
		OSGiUtils.getTransactionManager().commit();
		File outputFile = new File(outputFolder,"Output.pdf");
		doc.copyToFile(outputFile);
		return outputFile;
	}
	catch (Exception e)
	{
		if (OSGiUtils.getTransactionManager().getTransaction() != null)
		OSGiUtils.getTransactionManager().rollback();
		throw e;
	}
	finally {
		if (convertedDoc != null) {
			convertedDoc.dispose();
			convertedDoc = null;
		}
		if (inDoc != null) {
			inDoc.dispose();
			inDoc = null;
		}
		if (settingsDoc != null) {
			settingsDoc.dispose();
			settingsDoc = null;
		}
		if (xmpDoc != null) {
			xmpDoc.dispose();
			xmpDoc = null;
		}
	}
}

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー