動態建立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檔案的解譯作業。
步驟摘要 summary-of-steps
若要使用動態建立的DDX檔案來分解PDF檔案,請執行下列工作:
- 包含專案檔案。
- 建立PDF組合器使用者端。
- 建立DDX檔案。
- 轉換DDX檔案。
- 設定執行階段選項。
- 拆解PDF檔案。
- 儲存已拆解的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檔案 dynamically-create-a-ddx-document-using-the-java-api
使用組合器服務API (Java)動態建立DDX檔案並分解PDF檔案:
-
包含專案檔案。
在您的Java專案的類別路徑中包含使用者端JAR檔案,例如adobe-assembler-client.jar。
-
建立PDF組合器使用者端。
- 建立包含連線屬性的
ServiceClientFactory物件。 - 使用它的建構函式並傳遞
ServiceClientFactory物件來建立AssemblerServiceClient物件。
- 建立包含連線屬性的
-
建立DDX檔案。
-
呼叫
DocumentBuilderFactory類別的newInstance方法,以建立JavaDocumentBuilderFactory物件。 -
呼叫
DocumentBuilderFactory物件的newDocumentBuilder方法,以建立JavaDocumentBuilder物件。 -
呼叫
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);
-
-
轉換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方法填入JavaByteArrayOutputStream物件。 傳遞javax.xml.transform.dom.DOMSource和javax.xml.transform.stream.StreamResult物件。 - 建立位元組陣列,並將
ByteArrayOutputStream物件的大小配置給位元組陣列。 - 叫用
ByteArrayOutputStream物件的toByteArray方法來填入位元組陣列。 - 使用它的建構函式並傳遞位元組陣列,來建立
com.adobe.idp.Document物件。
- 呼叫
-
參照要拆解的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物件。
- 代表索引鍵名稱的字串值。 此值必須符合DDX檔案中指定的PDF來源元素的值。 (在動態建立的DDX檔案中,值為
-
-
設定執行階段選項。
- 使用建構函式建立儲存執行階段選項的
AssemblerOptionSpec物件。 - 透過叫用屬於
AssemblerOptionSpec物件的方法,設定執行階段選項以符合您的業務需求。 例如,若要指示Assembler服務在發生錯誤時繼續處理工作,請叫用AssemblerOptionSpec物件的setFailOnError方法,然後傳遞false。
- 使用建構函式建立儲存執行階段選項的
-
拆解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檔案以及發生的任何例外狀況。 - 代表動態建立之DDX檔案的
-
儲存已拆解的PDF檔案。
若要取得已拆解的PDF檔案,請執行下列動作:
- 叫用
AssemblerResult物件的getDocuments方法。 此方法會傳回java.util.Map物件。 - 逐一檢視
java.util.Map物件,直到找到結果com.adobe.idp.Document物件為止。 - 叫用
com.adobe.idp.Document物件的copyToFile方法來擷取PDF檔案。
- 叫用
另請參閱
使用網站服務API動態建立DDX檔案 dynamically-create-a-ddx-document-using-the-web-service-api
使用Assembler Service API (Web服務)動態建立DDX檔案並分解PDF檔案:
-
包含專案檔案。
建立使用MTOM的Microsoft .NET專案。 確定您在設定服務參考時使用下列WSDL定義:
http://localhost:8080/soap/services/AssemblerService?WSDL&lc_version=9.0.1。note note NOTE 將 localhost取代為主控AEM Forms之伺服器的IP位址。 -
建立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。
- 將AEM表單使用者名稱指派給欄位
-
-
建立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);
-
-
轉換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欄位。
-
-
參照要拆解的PDF檔案。
- 使用物件的建構函式建立
BLOB物件。BLOB物件是用來儲存輸入PDF檔案。 此BLOB物件會以引數的形式傳遞至invokeOneDocument。 - 透過叫用它的建構函式來建立
System.IO.FileStream物件。 傳遞代表輸入PDF檔案的檔案位置以及開啟檔案的模式的字串值。 - 建立位元組陣列以儲存
System.IO.FileStream物件的內容。 您可以取得System.IO.FileStream物件的Length屬性來決定位元組陣列的大小。 - 呼叫
System.IO.FileStream物件的Read方法,並傳遞要讀取的位元組陣列、起始位置和資料流長度,以資料流資料填入位元組陣列。 - 將物件的
MTOM屬性指派給位元組陣列的內容,以填入BLOB物件。
- 使用物件的建構函式建立
-
設定執行階段選項。
- 使用建構函式建立儲存執行階段選項的
AssemblerOptionSpec物件。 - 將值指派給屬於
AssemblerOptionSpec物件的資料成員,設定執行階段選項以符合您的業務需求。 例如,若要指示Assembler服務在發生錯誤時繼續處理工作,請將false指派給AssemblerOptionSpec物件的failOnError資料成員。
- 使用建構函式建立儲存執行階段選項的
-
拆解PDF檔案。
叫用
AssemblerServiceClient物件的invokeDDX方法,並傳遞下列值:- 代表動態建立之DDX檔案的
BLOB物件 - 包含輸入PDF檔案的
mapItem陣列 - 指定執行階段選項的
AssemblerOptionSpec物件
invokeDDX方法傳回AssemblerResult物件,其中包含工作的結果和發生的任何例外狀況。 - 代表動態建立之DDX檔案的
-
儲存已拆解的PDF檔案。
若要取得新建立的PDF檔案,請執行下列動作:
- 存取
AssemblerResult物件的documents欄位,此欄位是包含已解除組裝PDF檔案的Map物件。 - 逐一檢視
Map物件以取得每個結果檔案。 然後,將該陣列成員的value轉換為BLOB。 - 存取其
BLOB物件的MTOM屬性,以擷取代表PDF檔案的二進位資料。 這會傳回您可以寫出至PDF檔案的位元組陣列。
- 存取
另請參閱