Java API を使用した DDX ドキュメントの動的な作成

Assembler サービス API(Java)を使用して、DDX ドキュメントを動的に作成し、PDF ドキュメントをディスアセンブリします。

  1. プロジェクトファイルを含めます。

    adobe-livecycle-client.jar などのクライアント JAR ファイルを Java プロジェクトのクラスパスに含めます。

  2. PDF Assembler クライアントを作成します。

    • 接続プロパティを含む ServiceClientFactory オブジェクトを作成します。
    • コンストラクターを使用して ServiceClientFactory オブジェクトを渡すことによって、AssemblerServiceClient オブジェクトを作成します。
  3. DDX ドキュメントを作成します。

    • DocumentBuilderFactory クラスの newInstance メソッドを呼び出して、Java の DocumentBuilderFactory オブジェクトを作成します。

    • DocumentBuilderFactory オブジェクトの newDocumentBuilder メソッドを呼び出して、Java の DocumentBuilder オブジェクトを作成します。

    • DocumentBuilder オブジェクトの newDocument メソッドを呼び出し、org.w3c.dom.Document オブジェクトをインスタンス化します。

    • org.w3c.dom.Document オブジェクトの createElement メソッドを呼び出して、DDX ドキュメントのルート要素を作成します。このメソッドは、 ルート要素を表す Element オブジェクトを作成します。要素の名前を表す文字列値を createElement メソッドに渡します。戻り値を Element にキャストします。次に、setAttribute メソッド呼び出して、子要素の値を設定します。最後に、Header 要素を要素に追加するには、Header 要素の appendChild メソッドを呼び出して、子要素オブジェクトを引数として渡します。次のコード行は、このアプリケーションロジックを示しています。
       Element root = (Element)document.createElement("DDX");  root.setAttribute("xmlns","https://ns.adobe.com/DDX/1.0/");  document.appendChild(root);

    • Document オブジェクトの createElement メソッドを呼び出して、PDFsFromBookmarks 要素を作成します。要素名を表す文字列値を createElement メソッドに渡します。戻り値を Element にキャストします。setAttribute メソッドを呼び出して、PDFsFromBookmarks 要素の値を設定 します。DDX 要素の appendChild メソッドを呼び出して、DDX 要素に PDFsFromBookmarks 要素を追加します。PDFsFromBookmarks 要素オブジェクトを引数として渡します。次のコード行は、このアプリケーションロジックを示しています。

       Element PDFsFromBookmarks = (Element)document.createElement("PDFsFromBookmarks");  PDFsFromBookmarks.setAttribute("prefix","stmt");  root.appendChild(PDFsFromBookmarks);

    • Document オブジェクトの createElement メソッドを呼び出して、PDF 要素を作成します。要素名を表す文字列の値を渡します。戻り値を Element にキャストします。setAttribute メソッドを呼び出して、PDF 要素の値を設定 します。PDFsFromBookmarks 要素の appendChild メソッドを呼び出して、PDF 要素を PDFsFromBookmarks 要素に追加します。PDF 要素オブジェクトを引数として渡します。次のコード行に、このアプリケーションロジックを示します。

       Element PDF = (Element)document.createElement("PDF");  PDF.setAttribute("source","AssemblerResultPDF.pdf");  PDFsFromBookmarks.appendChild(PDF);

  4. DDX ドキュメントを変換します。

    • javax.xml.transform.Transformer オブジェクトの静的 newInstance メソッドを呼び出すことによって、javax.xml.transform.Transformer オブジェクトを作成します。
    • TransformerFactory オブジェクトの newTransformer メソッドを呼び出すことによって、Transformer オブジェクトを作成します。
    • コンストラクタを使用して ByteArrayOutputStream オブジェクトを作成します。
    • コンストラクタを使用して javax.xml.transform.dom.DOMSource オブジェクトを作成します。DDX ドキュメントを表す org.w3c.dom.Document オブジェクトを渡します。
    • javax.xml.transform.dom.DOMSource オブジェクトを作成するには、コンストラクタを使用して、ByteArrayOutputStream オブジェクトを渡します。
    • javax.xml.transform.Transformer オブジェクトの transform メソッドを呼び出して、Java ByteArrayOutputStream オブジェクトを入力します。javax.xml.transform.dom.DOMSource オブジェクトと javax.xml.transform.stream.StreamResult オブジェクトを渡します。
    • バイト配列を作成して、ByteArrayOutputStream オブジェクトのサイズをバイト配列に割り当てます。
    • ByteArrayOutputStream オブジェクトの toByteArray メソッドを呼び出して、バイト配列に入力します。
    • コンストラクターを使用して、バイト配列を渡すことによって、com.adobe.idp.Document オブジェクトを作成します。
  5. 分割する PDF ドキュメントを参照します。

    • HashMap コンストラクターを使って、入力 PDF ドキュメントを保存するために使用する java.util.Map オブジェクトを作成します。

    • java.io.FileInputStream オブジェクトを作成するには、コンストラクターを使用し、ディスアセンブリする PDF ドキュメントの場所を渡します。

    • com.adobe.idp.Document オブジェクトを作成します。ディスアセンブリする PDF ドキュメントを含む java.io.FileInputStream オブジェクトを作成します。

    • エントリを java.util.Map オブジェクトに追加するには、put メソッドを呼び出し、次の引数を渡します。

      • キー名を表す文字列値。この値は、DDX ドキュメントで指定された PDF ソース要素の値と一致する必要があります(動的に作成される DDX ドキュメントでは、値は AssemblerResultPDF.pdf です)。
      • ディスアセンブリする PDF ドキュメントを含む com.adobe.idp.Document オブジェクト。
  6. 実行時オプションを設定します。

    • コンストラクタを使用して、実行時オプションを格納する AssemblerOptionSpec オブジェクトを作成します。
    • AssemblerOptionSpec オブジェクトに属するメソッドを呼び出して、ビジネス要件を満たすよう実行時オプションを設定します。例えば、エラーが発生したときにジョブの処理を続行するように Assembler サービスに指示するには、AssemblerOptionSpec オブジェクトの setFailOnError メソッドを呼び出して false を渡します。
  7. PDF ドキュメントを分割します。

    AssemblerServiceClient オブジェクトの invokeDDX メソッドを呼び出して、以下の値を渡します。

    • 動的に作成された DDX ドキュメントを表す com.adobe.idp.Document オブジェクト
    • ディスアセンブリする PDF ドキュメントを含む java.util.Map オブジェクト
    • デフォルトのフォントやジョブログレベルを含む、実行時のオプションを指定する com.adobe.livecycle.assembler.client.AssemblerOptionSpec オブジェクト

    invokeDDX メソッドは、 ディスアセンブリされた PDF ドキュメントと発生した例外を含む com.adobe.livecycle.assembler.client.AssemblerResult オブジェクトを返します。

  8. 分割した PDF ドキュメントを保存します。

    分割された PDF ドキュメントを取得するには、以下のアクションを実行します。

    • AssemblerResult オブジェクトの getDocuments メソッドを呼び出します。このメソッドは、java.util.Map オブジェクトを返します。
    • 結果の com.adobe.idp.Document オブジェクトが見つかるまで、java.util.Map オブジェクトを反復処理します。
    • com.adobe.idp.Document オブジェクトの copyToFile メソッドを呼び出して、PDF ドキュメントを抽出します。

Web サービス API を使用した DDX ドキュメントの動的な作成

Assembler サービス API(web サービス)を使用して、DDX ドキュメントを動的に作成し、PDF ドキュメントをディスアセンブリします。

  1. プロジェクトファイルを含めます。

    MTOM を使用する Microsoft .NET プロジェクトを作成します。サービスリファレンスを設定する際は、WSDL の定義 http://localhost:8080/soap/services/AssemblerService?WSDL&lc_version=9.0.1 を必ず使用してください。

    NOTE
    localhost を、AEM Forms をホストするサーバーの IP アドレスに置き換えます。
  2. PDF Assembler クライアントを作成します。

    • デフォルトのコンストラクターを使用して、AssemblerServiceClient オブジェクトを作成します。

    • System.ServiceModel.EndpointAddress コンストラクターを使用して、AssemblerServiceClient.Endpoint.Address オブジェクトを作成します。WSDL を指定する文字列値を AEM Forms サービスに渡します(例:http://localhost:8080/soap/services/AssemblerService?blob=mtom)。lc_version 属性を使用する必要はありません。この属性は、サービス参照を作成する際に使用されます。

    • AssemblerServiceClient.Endpoint.Binding フィールドの値を取得して System.ServiceModel.BasicHttpBinding オブジェクトを作成します。戻り値を BasicHttpBinding にキャストします。

    • System.ServiceModel.BasicHttpBinding オブジェクトの MessageEncoding フィールドを WSMessageEncoding.Mtom に設定します。この値により、MTOM が確実に使用されます。

    • 次のタスクを実行して、HTTP 基本認証を有効にします。

      • AssemblerServiceClient.ClientCredentials.UserName.UserName フィールドに AEM Forms ユーザー名を割り当てます。
      • 対応するパスワード値を AssemblerServiceClient.ClientCredentials.UserName.Password フィールドに割り当てます。
      • 定数値 HttpClientCredentialType.BasicBasicHttpBindingSecurity.Transport.ClientCredentialType フィールドに割り当てます。
      • 定数値 BasicHttpSecurityMode.TransportCredentialOnly をフィールド BasicHttpBindingSecurity.Security.Mode に割り当てます。
  3. DDX ドキュメントを作成します。

    • コンストラクターを使用して System.Xml.XmlElement オブジェクトを作成します。

    • XmlElement オブジェクトの CreateElement メソッドを呼び出して、DDX ドキュメントのルート要素を作成します。このメソッドは、 ルート要素を表す Element オブジェクトを作成します。要素の名前を表す文字列値を CreateElement メソッドに渡します。SetAttribute メソッドを呼び出して、DDX 要素の値を設定します。最後に、XmlElement オブジェクトの AppendChild メソッドを呼び出して、DDX ドキュメントに要素を追加します。DDX オブジェクトを引数として渡します。次のコード行は、このアプリケーションロジックを示しています。

       System.Xml.XmlElement root = ddx.CreateElement("DDX");  root.SetAttribute("xmlns", "https://ns.adobe.com/DDX/1.0/");  ddx.AppendChild(root);

    • XmlElement オブジェクトの CreateElement メソッドを呼び出して、DDX ドキュメントの PDFsFromBookmarks 要素を作成します。要素の名前を表す文字列値を CreateElement メソッドに渡します。次に、 SetAttribute メソッドを呼び出して、要素の値を設定します。DDX 要素の AppendChild メソッドを呼び出して、PDFsFromBookmarks 要素をルート要素に追加します。PDFsFromBookmarks 要素オブジェクトを引数として渡します。次のコード行は、このアプリケーションロジックを示しています。

       XmlElement PDFsFromBookmarks = ddx.CreateElement("PDFsFromBookmarks");  PDFsFromBookmarks.SetAttribute("prefix", "stmt");  root.AppendChild(PDFsFromBookmarks);

    • XmlElement オブジェクトの CreateElement メソッドを呼び出して、DDX ドキュメントの PDF 要素を作成します。要素の名前を表す文字列値を CreateElement メソッドに渡します。次に、 SetAttribute メソッドを呼び出して、子要素の値を設定します。PDFsFromBookmarks 要素の AppendChild メソッドを呼び出して、PDF 要素を PDFsFromBookmarks 要素に追加します。PDF 要素オブジェクトを引数として渡します。次のコード行に、このアプリケーションロジックを示します。

       XmlElement PDF = ddx.CreateElement("PDF");  PDF.SetAttribute("source", "AssemblerResultPDF.pdf");  PDFsFromBookmarks.AppendChild(PDF);

  4. DDX ドキュメントを変換します。

    • コンストラクターを使用して System.IO.MemoryStream オブジェクトを作成します。

    • DDX ドキュメントを表す XmlElement オブジェクトを使った DDX ドキュメントで、MemoryStream オブジェクトを入力します。XmlElement オブジェクトの Save メソッドを呼び出し、MemoryStream オブジェクトを渡します。

    • バイト配列を作成し、MemoryStream オブジェクトにあるデータを入力します。次のコードは、このアプリケーションロジックを示しています。

       int bufLen = Convert.ToInt32(stream.Length);  byte[] byteArray = new byte[bufLen];  stream.Position = 0;  int count = stream.Read(byteArray, 0, bufLen);

    • BLOB オブジェクトを作成します。バイト配列を BLOB オブジェクトの MTOM フィールドに割り当てます。

  5. 分割する PDF ドキュメントを参照します。

    • コンストラクターを使用して BLOB オブジェクトを作成します。BLOB オブジェクトは、入力 PDF ドキュメントを格納するために使用します。この BLOB オブジェクトは引数として invokeOneDocument に渡されます。
    • コンストラクターを呼び出して、System.IO.FileStream オブジェクトを作成します。入力 PDF ドキュメントのファイルの場所と、ファイルを開くモードを表す文字列値を渡します。
    • System.IO.FileStream オブジェクトのコンテンツを格納するバイト配列を作成します。バイト配列のサイズは、System.IO.FileStream オブジェクトの Length プロパティを取得することで決定できます。
    • System.IO.FileStream オブジェクトの Read メソッドを呼び出し、バイト配列、開始位置、および読み取るストリーム長を渡して、バイト配列にストリームデータを入力します。
    • MTOM プロパティを割り当てて、BLOB オブジェクトにバイト配列の内容を入力します。
  6. 実行時オプションを設定します。

    • ランタイムオプションを格納する AssemblerOptionSpec オブジェクトをコンストラクタで作成します。
    • AssemblerOptionSpec オブジェクトに属するデータメンバーに値を割り当てることで、ビジネス要件に応じたランタイムオプションを設定します。例えば、エラーが発生した場合にジョブの処理を続行するように Assembler サービスに指示するには、falseAssemblerOptionSpec オブジェクトの failOnError データメンバーに割り当てます。
  7. PDF ドキュメントを分割します。

    AssemblerServiceClient オブジェクトの invokeDDX メソッドを呼び出して、以下の値を渡します。

    • 動的に作成された DDX ドキュメントを表す BLOB オブジェクト
    • 入力 PDF ドキュメントを含む mapItem 配列
    • 実行時オプションを指定する AssemblerOptionSpec オブジェクト

    invokeDDX メソッドは、ジョブの結果と発生した例外を含む AssemblerResult オブジェクトを返します。

  8. 分割した PDF ドキュメントを保存します。

    新しく作成した PDF ドキュメントを取得するには、次の操作を実行します。

    • AssemblerResult オブジェクトの documents フィールドにアクセスします。これは、分割された PDF ドキュメントを含む Map オブジェクトです。
    • Map オブジェクトを反復処理して、結果として得られる各ドキュメントを取得します。次に、その配列メンバーの valueBLOB にキャストします。
    • BLOB オブジェクトの MTOM プロパティにアクセスして、PDF ドキュメントを表すバイナリデータを抽出します。これにより、PDF ファイルに書き出すことができるバイト配列が返されます。
前のページドキュメントが PDF/A に準拠しているかどうかの検証
次のページ送信済みフォームの処理

Experience Manager