動態建立DDX文檔

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

您可以動態建立DDX文檔,該文檔可用於執行Assembler操作。 動態建立DDX檔案可讓您在執行時期取得的DDX檔案中使用值。 若要動態建立DDX檔案,請使用屬於您所使用之程式設計語言的類別。 例如,如果您使用Java開發客戶端應用程式,請使用屬於org.w3c.dom.*包的類。 同樣地,如果您使用Microsoft .NET,請使用屬於System.Xml命名空間的類。

在將DDX文檔傳遞到Assembler服務之前,請將XML從org.w3c.dom.Document實例轉換為com.adobe.idp.Document實例。 如果您使用web services,請將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檔案。

注意

有關Assembler服務的詳細資訊,請參見AEM Forms的服務參考

注意

有關DDX文檔的詳細資訊,請參閱匯編器服務和DDX參考

步驟摘要

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

  1. 包含專案檔案。
  2. 建立PDF匯寫程式式用戶端。
  3. 建立DDX檔案。
  4. 轉換DDX檔案。
  5. 設定執行時期選項。
  6. 反匯編PDF檔案。
  7. 儲存已拆解的PDF檔案。

包含專案檔案

在您的開發專案中加入必要的檔案。 如果要使用Java建立客戶端應用程式,請包括必要的JAR檔案。 如果您使用web services,請確定您包含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 services,請將資料類型轉換為BLOB例項。

轉換DDX檔案

使用org.w3c.dom類建立的DDX文檔必須轉換為com.adobe.idp.Document對象。 要在使用Java API時執行此任務,請使用Java XML轉換類。 如果您使用web services,請將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檔案

使用web service API動態建立DDX檔案

包含AEM FormsJava庫檔案

設定連接屬性

以程式設計方式解譯PDF檔案

使用Java API動態建立DDX檔案

使用Assembler Service 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建構函式建立java.util.Map物件,用來儲存輸入的PDF檔案。

    • 使用其建構函式建立java.io.FileInputStream物件,並將PDF檔案的位置傳遞至反匯編。

    • 建立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方法並傳遞下列值:

    • 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 FormsJava庫檔案

設定連接屬性

使用web service API動態建立DDX檔案

使用Assembler Service API(web service)動態建立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方法。 調用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對象,將MemoryStream對象填入DDX文檔。 叫用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方法並傳遞下列值:

    • BLOB物件,代表動態建立的DDX檔案
    • 包含輸入PDF檔案的mapItem陣列
    • 指定運行時選項的AssemblerOptionSpec對象

    invokeDDX方法返回一個AssemblerResult對象,該對象包含作業的結果和發生的任何例外。

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

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

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

另請參閱

使用MTOM叫用AEM Forms

使用SwaRef叫用AEM Forms

本頁內容

Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now