文件AEM 6.5使用手冊

動態建立DDX檔案

2025年5月5日
  • 適用對象:
  • Experience Manager 6.5
  • 主題:

建立對象:

  • 開發人員

本檔案中的範例和範例僅適用於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參考。

步驟摘要

若要使用動態建立的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檔案

使用組合器服務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.DOMSource和javax.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檔案

使用Assembler Service 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組合器使用者端。

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