以程式設計方式組合PDF檔案

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

您可以使用Assembler Service API將多個PDF檔案組合為單一PDF檔案。 下圖顯示三個PDF檔案合併為單一PDF檔案。

pa_pa_document_assembly

若要將兩份或多份PDF檔案整合為單一PDF檔案,您需要DDX檔案。 DDX文檔描述了Assembler服務生成的PDF文檔。 即,DDX文檔指示Assembler服務執行哪些操作。

在本討論中,假設使用了以下DDX文檔。

 <?xml version="1.0" encoding="UTF-8"?>
 <DDX xmlns="https://ns.adobe.com/DDX/1.0/">
     <PDF result="out.pdf">
         <PDF source="map.pdf" />
         <PDF source="directions.pdf" />
     </PDF>
 </DDX>

此DDX檔案將名為​map.pdf​和​directions.pdf​的兩份PDF檔案合併為一份PDF檔案。

注意

要查看拆解PDF文檔的DDX文檔,請參閱Programmaly Desprication PDF Documents

注意

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

注意

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

使用web services調用Assembler服務時的注意事項

在組裝大型檔案時,當您新增頁首和頁尾時,可能會遇到OutOfMemory錯誤,檔案將無法組裝。 若要降低發生此問題的機率,請新增DDXProcessorSetting元素至DDX檔案,如下列範例所示。

<DDXProcessorSetting name="checkpoint" value="2000" />

您可以將此元素新增為DDX元素的子系,或作為PDF result元素的子系。 此設定的預設值為0(零),會關閉核取點,而DDX的運作就像DDXProcessorSetting元素不存在一樣。 如果您遇到OutOfMemory錯誤,可能需要將值設為整數,通常介於500和5000之間。 小查核點值會導致檢查點更頻繁。

步驟摘要

若要從多份PDF檔案組合單一PDF檔案,請執行下列工作:

  1. 包含專案檔案。
  2. 建立PDF匯寫程式式用戶端。
  3. 參考現有的DDX檔案。
  4. 參考輸入PDF檔案。
  5. 設定執行時期選項。
  6. 組合輸入的PDF檔案。
  7. 擷取結果。

包含專案檔案

在您的開發專案中加入必要的檔案。 如果要使用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上,則為必需)

如果AEM Forms部署在JBoss以外的受支援J2EE應用程式伺服器上,則必須將adobe-utilities.jar和jbossall-client.jar檔案替換為特定於部署AEM Forms的J2EE應用程式伺服器的JAR檔案。

建立PDF匯寫程式式用戶端

在以寫程式方式執行匯編器操作之前,必須建立匯編器客戶端。

參考現有的DDX檔案

必須參考DDX檔案才能組合PDF檔案。 例如,請考慮本節中介紹的DDX文檔。 此DDX檔案指示Assembler服務將兩個PDF檔案合併為單一PDF檔案。

參考輸入PDF檔案

參考要傳遞至Assembler服務的輸入PDF檔案。 例如,如果要傳遞兩個名為「地圖」和「方向」的輸入PDF檔案,則必須傳遞對應的PDF檔案。

map.pdf檔案和directions.pdf檔案都必須放在系列物件中。 索引鍵的名稱必須與DDX檔案中PDF來源屬性的值相符。 如果DDX檔案中的索引鍵和來源屬性相符,則PDF檔案的名稱無關緊要。

注意

如果調用invokeDDX操作,則返回包含集合對象的AssemblerResult對象。 當您將兩個或兩個以上的輸入PDF檔案傳遞至Assembler服務時,就會使用此操作。 但是,如果只將一個輸入的PDF傳遞給Assembler服務,而且只需要一個返回文檔,請調用invokeOneDocument操作。 調用此操作時,將返回單個文檔。 有關使用此操作的資訊,請參閱組合加密的PDF文檔

設定執行時期選項

您可以設定運行時選項,以控制Assembler服務在執行作業時的行為。 例如,您可以設定一個選項,指示Assembler服務在遇到錯誤時繼續處理作業。 有關可設定的運行時選項的資訊,請參閱AEM FormsAPI參考中的AssemblerOptionSpec類參考。

匯整輸入的PDF檔案

在您建立服務用戶端、參考DDX檔案、建立儲存輸入PDF檔案的系列物件,以及設定執行時期選項後,您就可以叫用DDX作業。 使用本節中指定的DDX檔案時,map.pdf和direction.pdf檔案會合併為一個PDF檔案。

擷取結果

Assembler服務返回一個java.util.Map對象,該對象可從AssemblerResult對象中獲得,並包含操作結果。 傳回的java.util.Map物件包含產生的檔案和任何例外。

下表匯總了返回的java.util.Map對象中可以找到的一些鍵值和對象類型。

關鍵值

物件類型

說明

documentName

com.adobe.idp.Document

包含在DDX合成元素中指定的合成文檔

documentName

Exception

包含文檔的任何例外

OutputMapConstants.LOG_NAME

com.adobe.idp.Documen

包含作業日誌

另請參閱

包含AEM FormsJava庫檔案

設定連接屬性

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

使用Java API組合PDF檔案

使用Assembler Service API(Java)來組合PDF檔案:

  1. 包含專案檔案。

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

  2. 建立PDF匯寫程式式用戶端。

    • 建立包含連接屬性的ServiceClientFactory對象。
    • 使用其建構子並傳遞ServiceClientFactory對象,建立AssemblerServiceClient對象。
  3. 參考現有的DDX檔案。

    • 使用DDX文檔的建構子並傳遞指定DDX檔案位置的字串值,建立代表DDX文檔的java.io.FileInputStream對象。
    • 使用其建構子並傳遞java.io.FileInputStream對象,建立com.adobe.idp.Document對象。
  4. 參考輸入PDF檔案。

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

    • 對於每個輸入的PDF檔案,請使用其建構函式並傳遞輸入的PDF檔案位置來建立java.io.FileInputStream物件。

    • 對於每個輸入的PDF文檔,請建立com.adobe.idp.Document對象並傳遞包含PDF文檔的java.io.FileInputStream對象。

    • 對於每個輸入文檔,通過調用put方法並傳遞以下參數,向java.util.Map對象添加一個條目:

      • 代表索引鍵名稱的字串值。 此值必須與DDX檔案中指定之PDF來源元素的值相符。
      • 包含源PDF文檔的com.adobe.idp.Document對象(或java.util.List對象,指定多個文檔)。
  5. 設定執行時期選項。

    • 使用其建構子建立一個AssemblerOptionSpec對象,該對象儲存運行時選項。
    • 通過調用屬於AssemblerOptionSpec對象的方法,設定運行時選項以滿足您的業務要求。 例如,若要指示Assembler服務在發生錯誤時繼續處理作業,請叫用AssemblerOptionSpec物件的setFailOnError方法並傳遞false
  6. 組合輸入的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對象,該對象包含作業的結果和發生的任何例外。

  7. 擷取結果。

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

    • 叫用AssemblerResult物件的getDocuments方法。 這會傳回java.util.Map物件。
    • 重複java.util.Map物件,直到找到結果com.adobe.idp.Document物件。 (您可以使用DDX檔案中指定的PDF結果元素來取得檔案。)
    • 叫用com.adobe.idp.Document物件的copyToFile方法來擷取PDF檔案。
    注意

    如果LOG_LEVEL設定為生成日誌,則可以使用AssemblerResult對象的getJobLog方法提取日誌。

另請參閱

快速入門(SOAP模式):使用Java API組合PDF檔案

包含AEM FormsJava庫檔案

設定連接屬性

使用web service API組合PDF檔案

使用Assembler Service API(web service)來組合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檔案。

    • 使用其建構子建立BLOB對象。 BLOB物件用來儲存DDX檔案。
    • 通過調用System.IO.FileStream對象的建構子並傳遞一個字串值來建立對象,該字串值表示DDX文檔的檔案位置和開啟檔案的模式。
    • 建立儲存System.IO.FileStream對象內容的位元組陣列。 您可以取得System.IO.FileStream物件的Length屬性,以判斷位元組陣列的大小。
    • 調用System.IO.FileStream物件的Read方法,並傳遞要讀取的位元組陣列、開始位置和串流長度,以串流資料填入位元組陣列。
    • 通過為MTOM對象的屬性指定位元組陣列的內容來填充BLOB對象。
  4. 參考輸入PDF檔案。

    • 對於每個輸入的PDF檔案,請使用其建構函式建立BLOB物件。 BLOB物件用來儲存輸入的PDF檔案。
    • 通過調用其建構子並傳遞一個字串值來建立System.IO.FileStream對象,該字串值表示輸入PDF文檔的檔案位置以及開啟檔案的模式。
    • 建立儲存System.IO.FileStream對象內容的位元組陣列。 您可以取得System.IO.FileStream物件的Length屬性,以判斷位元組陣列的大小。
    • 呼叫System.IO.FileStream物件的Read方法,以串流資料填入位元組陣列。 傳遞要讀取的位元組陣列、起始位置和串流長度。
    • 通過為MTOM對象的欄位分配位元組陣列的內容來填充BLOB對象。
    • 建立MyMapOf_xsd_string_To_xsd_anyType對象。 此收集物件用於儲存輸入的PDF檔案。
    • 對於每個輸入的PDF檔案,請建立MyMapOf_xsd_string_To_xsd_anyType_Item物件。 例如,如果使用兩個輸入的PDF檔案,請建立兩個MyMapOf_xsd_string_To_xsd_anyType_Item物件。
    • MyMapOf_xsd_string_To_xsd_anyType_Item對象的key欄位分配代表鍵名的字串值。 此值必須與DDX檔案中指定之PDF來源元素的值相符。 (請對每個輸入的PDF檔案執行此工作。)
    • 將儲存PDF文檔的BLOB對象指定給MyMapOf_xsd_string_To_xsd_anyType_Item對象的value欄位。 (請對每個輸入的PDF檔案執行此工作。)
    • MyMapOf_xsd_string_To_xsd_anyType_Item對象添加到MyMapOf_xsd_string_To_xsd_anyType對象。 調用MyMapOf_xsd_string_To_xsd_anyType對象的Add方法並傳遞MyMapOf_xsd_string_To_xsd_anyType對象。 (請對每個輸入的PDF檔案執行此工作。)
  5. 設定執行時期選項。

    • 使用其建構子建立一個AssemblerOptionSpec對象,該對象儲存運行時選項。
    • 通過為屬於AssemblerOptionSpec對象的資料成員分配值,設定運行時選項以滿足您的業務要求。 例如,要指示Assembler服務在出現錯誤時繼續處理作業,請將false分配給AssemblerOptionSpec對象的failOnError資料成員。
  6. 組合輸入的PDF檔案。

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

    • 代表DDX文檔的BLOB對象。
    • 包含輸入PDF檔案的mapItem陣列。 其鍵必須與PDF源檔案的名稱匹配,其值必須是與這些檔案對應的BLOB對象。
    • 指定運行時選項的AssemblerOptionSpec對象。

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

  7. 擷取結果。

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

    • 存取AssemblerResult物件的documents欄位,此欄位是包含結果PDF檔案的Map物件。
    • 重複Map物件,直到找到與結果檔案名稱相符的索引鍵。 然後將該陣列成員的value轉換為BLOB
    • 存取PDF檔案的BLOB物件的MTOM屬性,擷取代表PDF檔案的二進位資料。 這會傳回可寫出至PDF檔案的位元組陣列。
    注意

    如果LOG_LEVEL設定為生成日誌,則可以通過獲取AssemblerResult對象的jobLog資料成員的值來提取日誌。

另請參閱

使用MTOM叫用AEM Forms

本頁內容

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
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