動態建立DDX文檔

您可以動態建立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檔案的解體。

注意

有關組合器服務的詳細資訊,請參閱AEM Forms的服務參考

注意

有關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實例。 如果您使用Web服務,請將資料類型轉換為BLOB實例。

轉換DDX文檔

使用org.w3c.dom類建立的DDX文檔必須轉換為com.adobe.idp.Document對象。 要在使用Java API時執行此任務,請使用Java XML轉換類。 如果您使用Web服務,請將DDX文檔轉換為BLOB對象。

參考要拆卸的PDF文檔

要拆解PDF文檔,請參照表示要拆解的PDF文檔的PDF檔案。 當傳遞到組合器服務時,將為文檔中的每個級別1書籤返回一個單獨的PDF文檔。

設定運行時選項

您可以設定運行時選項,以控制組合器服務在執行作業時的行為。 例如,您可以設定一個選項,指示組合器服務在遇到錯誤時繼續處理作業。 要設定運行時選項,請使用AssemblerOptionSpec對象。

反匯編PDF文檔

叫用invokeDDX操作,拆解PDF文檔。 傳遞動態建立的DDX檔案。 組合器服務返回集合對象內已拆解的PDF文檔。

儲存已拆解的PDF檔案

所有已拆解的PDF文檔都在收集對象中返回。 逐一查看集合物件,並將每個PDF檔案儲存為PDF檔案。

另請參閱

使用Java API動態建立DDX檔案

使用Web服務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文檔。

    • 通過調用DocumentBuilderFactorynewInstance方法建立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。)
      • com.adobe.idp.Document物件,包含要拆解的PDF檔案。
  6. 設定運行時選項。

    • 使用其建構子建立AssemblerOptionSpec物件,以儲存執行時選項。
    • 通過調用屬於AssemblerOptionSpec對象的方法來設定運行時選項以滿足您的業務要求。 例如,要指示組合器服務在發生錯誤時繼續處理作業,請調用AssemblerOptionSpec對象的setFailOnError方法並傳遞false
  7. 反匯編PDF文檔。

    調用AssemblerServiceClient對象的invokeDDX方法並傳遞以下值:

    • com.adobe.idp.Document對象,表示動態建立的DDX文檔
    • 包含要拆解的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程式庫檔案

設定連接屬性

使用Web服務API動態建立DDX文檔

使用組合器服務API(Web服務)動態建立DDX文檔並拆解PDF文檔:

  1. 包含專案檔案。

    建立使用MTOM的Microsoft .NET項目。 在設定服務引用時,請確保使用以下WSDL定義:http://localhost:8080/soap/services/AssemblerService?WSDL&lc_version=9.0.1

    注意

    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方法。 通過調用其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對象的資料成員分配值,以設定運行時選項以滿足您的業務要求。 例如,要指示組合器服務在發生錯誤時繼續處理作業,請將false分配給AssemblerOptionSpec對象的failOnError資料成員。
  7. 反匯編PDF文檔。

    調用AssemblerServiceClient對象的invokeDDX方法並傳遞以下值:

    • BLOB對象,表示動態建立的DDX文檔
    • 包含輸入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

本頁內容