動態建立DDX檔案 dynamically-creating-ddx-documents

本檔案中的範例和範例僅適用於JEE環境上的AEM Forms。

您可以動態建立可用來執行Assembler作業的DDX檔案。 動態建立DDX檔案可讓您使用在執行階段取得的DDX檔案中的值。 若要動態建立DDX檔案,請使用屬於您使用之程式語言的類別。 例如,如果您使用Java開發使用者端應用程式,請使用屬於org.w3c.dom.*封裝的類別。 同樣地,如果您使用Microsoft .NET,請使用屬於System.Xml名稱空間的類別。

在您將DDX檔案傳遞至組合器服務之前,請先將XML從org.w3c.dom.Document執行個體轉換為com.adobe.idp.Document執行個體。 如果您使用Web服務,請將XML從用來建立XML的資料型別(例如XmlDocument)轉換為BLOB執行個體。

對於此討論,假設已動態建立下列DDX檔案。

 <?xml version="1.0" encoding="UTF-8"?>
 <DDX xmlns="https://ns.adobe.com/DDX/1.0/">
      <PDFsFromBookmarks prefix="stmt">
     <PDF source="AssemblerResultPDF.pdf"/>
 </PDFsFromBookmarks>
 </DDX>

此DDX檔案會拆解PDF檔案。 建議您熟悉PDF檔案的解譯作業。

NOTE
如需有關組合器服務的詳細資訊,請參閱AEM Forms的服務參考
NOTE
如需有關DDX檔案的詳細資訊,請參閱組合器服務與DDX參考

步驟摘要 summary-of-steps

若要使用動態建立的DDX檔案來分解PDF檔案,請執行下列工作:

  1. 包含專案檔案。
  2. 建立PDF組合器使用者端。
  3. 建立DDX檔案。
  4. 轉換DDX檔案。
  5. 設定執行階段選項。
  6. 拆解PDF檔案。
  7. 儲存已拆解的PDF檔案。

包含專案檔

在您的開發專案中包含必要的檔案。 如果您使用Java建立使用者端應用程式,請包含必要的JAR檔案。 如果您使用Web服務,請確定您包含Proxy檔案。

必須將下列JAR檔案新增至專案的類別路徑:

  • adobe-livecycle-client.jar
  • adobe-usermanager-client.jar
  • adobe-assembler-client.jar
  • adobe-utilities.jar (如果AEM Forms部署在JBoss上,則為必要)
  • jbossall-client.jar (如果AEM Forms部署在JBoss上,則為必要)

建立PDF組合器使用者端

在您以程式設計方式執行組合器作業之前,請先建立組合器服務使用者端。

建立DDX檔案

使用您使用的程式語言建立DDX檔案。 若要建立可解散PDF檔案的DDX檔案,請確定它包含PDFsFromBookmarks元素。 如果您使用Java API,請將用來建立DDX檔案的資料型別轉換為com.adobe.idp.Document執行個體。 如果您使用網站服務,請將資料型別轉換為BLOB執行個體。

轉換DDX檔案

使用org.w3c.dom類別建立的DDX檔案必須轉換成com.adobe.idp.Document物件。 若要在使用Java API時執行此工作,請使用Java XML轉換類別。 如果您使用網站服務,請將DDX檔案轉換為BLOB物件。

參考PDF檔案以拆解

若要拆解PDF檔案,請參照代表要拆解PDF檔案的PDF檔案。 當傳遞至Assembler服務時,會針對檔案中的每個1級書籤傳回個別的PDF檔案。

設定執行階段選項

您可以設定執行階段選項,控制Assembler服務執行工作時的行為。 例如,您可以設定一個選項,在遇到錯誤時指示Assembler服務繼續處理工作。 若要設定執行階段選項,請使用AssemblerOptionSpec物件。

拆解PDF檔案

透過叫用invokeDDX作業來分解PDF檔案。 傳遞動態建立的DDX檔案。 Assembler服務會傳回集合物件中已拆解的PDF檔案。

儲存已解譯的PDF檔案

所有已拆解的PDF檔案都會在集合物件中傳回。 逐一檢視集合物件,並將每個PDF檔案儲存為PDF檔案。

另請參閱

使用Java API動態建立DDX檔案

使用網站服務API動態建立DDX檔案

包含AEM Forms Java程式庫檔案

設定連線屬性

以程式分解的PDF檔案

使用Java API動態建立DDX檔案 dynamically-create-a-ddx-document-using-the-java-api

使用組合器服務API (Java)動態建立DDX檔案並分解PDF檔案:

  1. 包含專案檔案。

    在您的Java專案的類別路徑中包含使用者端JAR檔案,例如adobe-assembler-client.jar。

  2. 建立PDF組合器使用者端。

    • 建立包含連線屬性的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方法,以設定其值。 最後,呼叫標頭專案的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方法,將PDFsFromBookmarks專案附加至DDX專案。 將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物件。
    • 使用它的建構函式並傳遞ByteArrayOutputStream物件來建立javax.xml.transform.dom.DOMSource物件。
    • 叫用javax.xml.transform.Transformer物件的transform方法填入Java ByteArrayOutputStream物件。 傳遞javax.xml.transform.dom.DOMSourcejavax.xml.transform.stream.StreamResult物件。
    • 建立位元組陣列,並將ByteArrayOutputStream物件的大小配置給位元組陣列。
    • 叫用ByteArrayOutputStream物件的toByteArray方法來填入位元組陣列。
    • 使用它的建構函式並傳遞位元組陣列,來建立com.adobe.idp.Document物件。
  5. 參照要拆解的PDF檔案。

    • 使用HashMap建構函式建立用來儲存輸入PDF檔案的java.util.Map物件。

    • 使用物件的建構函式並傳遞PDF檔案的位置來建立java.io.FileInputStream物件以進行拆解。

    • 建立com.adobe.idp.Document物件。 傳遞包含PDF檔案的java.io.FileInputStream物件以進行拆解。

    • 透過叫用物件的put方法並傳遞下列引數,將專案新增至java.util.Map物件:

      • 代表索引鍵名稱的字串值。 此值必須符合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方法傳回com.adobe.livecycle.assembler.client.AssemblerResult物件,其中包含已解譯的PDF檔案以及發生的任何例外狀況。

  8. 儲存已拆解的PDF檔案。

    若要取得已拆解的PDF檔案,請執行下列動作:

    • 叫用AssemblerResult物件的getDocuments方法。 此方法會傳回java.util.Map物件。
    • 逐一檢視java.util.Map物件,直到找到結果com.adobe.idp.Document物件為止。
    • 叫用com.adobe.idp.Document物件的copyToFile方法來擷取PDF檔案。

另請參閱

快速入門(SOAP模式):使用Java API動態建立DDX檔案

包含AEM Forms Java程式庫檔案

設定連線屬性

使用網站服務API動態建立DDX檔案 dynamically-create-a-ddx-document-using-the-web-service-api

使用Assembler Service API (Web服務)動態建立DDX檔案並分解PDF檔案:

  1. 包含專案檔案。

    建立使用MTOM的Microsoft .NET專案。 確定您在設定服務參考時使用下列WSDL定義: http://localhost:8080/soap/services/AssemblerService?WSDL&lc_version=9.0.1

    note note
    NOTE
    localhost取代為主控AEM Forms之伺服器的IP位址。
  2. 建立PDF組合器使用者端。

    • 使用預設建構函式建立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驗證:

      • 將AEM表單使用者名稱指派給欄位AssemblerServiceClient.ClientCredentials.UserName.UserName
      • 將對應的密碼值指派給欄位AssemblerServiceClient.ClientCredentials.UserName.Password
      • 將常數值HttpClientCredentialType.Basic指派給欄位BasicHttpBindingSecurity.Transport.ClientCredentialType
      • 將常數值BasicHttpSecurityMode.TransportCredentialOnly指派給欄位BasicHttpBindingSecurity.Security.Mode
  3. 建立DDX檔案。

    • 使用物件的建構函式建立System.Xml.XmlElement物件。

    • 呼叫XmlElement物件的CreateElement方法,以建立DDX檔案的根專案。 此方法會建立代表根專案的Element物件。 將代表元素名稱的字串值傳遞至CreateElement方法。 呼叫DDX專案的SetAttribute方法,以設定該專案的值。 最後,呼叫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服務在發生錯誤時繼續處理工作,請將false指派給AssemblerOptionSpec物件的failOnError資料成員。
  7. 拆解PDF檔案。

    叫用AssemblerServiceClient物件的invokeDDX方法,並傳遞下列值:

    • 代表動態建立之DDX檔案的BLOB物件
    • 包含輸入PDF檔案的mapItem陣列
    • 指定執行階段選項的AssemblerOptionSpec物件

    invokeDDX方法傳回AssemblerResult物件,其中包含工作的結果和發生的任何例外狀況。

  8. 儲存已拆解的PDF檔案。

    若要取得新建立的PDF檔案,請執行下列動作:

    • 存取AssemblerResult物件的documents欄位,此欄位是包含已解除組裝PDF檔案的Map物件。
    • 逐一檢視Map物件以取得每個結果檔案。 然後,將該陣列成員的value轉換為BLOB
    • 存取其BLOB物件的MTOM屬性,以擷取代表PDF檔案的二進位資料。 這會傳回您可以寫出至PDF檔案的位元組陣列。

另請參閱

使用MTOM叫用AEM Forms

使用SwaRef叫用AEM Forms

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2