套用Reader擴充功能
Reader擴充功能可讓您控制PDF檔案的使用許可權。 使用許可權與Acrobat中提供的功能有關,但不與Adobe Reader中的功能有關。 Reader擴充功能控制的功能包括新增註釋至檔案、填寫表單及儲存檔案的功能。 已新增使用許可權的PDF檔案稱為許可權啟用檔案。 在Adobe Reader中開啟許可權啟用PDF檔案的使用者可執行為該檔案啟用的操作。
若要完成此使用案例,我們需要執行下列動作:
- 將Reader擴充功能憑證新增至
fd-service
位使用者。
建立自訂OSGi服務
建立將套用使用許可權至檔案的自訂OSGi服務。 完成此任務的程式碼如下
import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.docassurance.client.api.DocAssuranceService;
import com.adobe.fd.docassurance.client.api.ReaderExtensionOptions;
import com.adobe.fd.readerextensions.client.ReaderExtensionsOptionSpec;
import com.adobe.fd.readerextensions.client.UsageRights;
import com.adobe.fd.signatures.pdf.inputs.UnlockOptions;
import com.aemforms.ares.core.ReaderExtendPDF;
import com.mergeandfuse.getserviceuserresolver.GetResolver;
@Component(service = ApplyUsageRights.class)
public class ApplyUsageRights implements ReaderExtendPDF {
@Reference
DocAssuranceService docAssuranceService;
@Reference
GetResolver getResolver;
Logger logger = LoggerFactory.getLogger(ApplyUsageRights.class);
@Override
public Document applyUsageRights(Document pdfDocument, UsageRights usageRights) {
ReaderExtensionsOptionSpec reOptionsSpec = new ReaderExtensionsOptionSpec(usageRights, "Sample ARES");
UnlockOptions unlockOptions = null;
ReaderExtensionOptions reOptions = ReaderExtensionOptions.getInstance();
reOptions.setCredentialAlias("ares");
reOptions.setResourceResolver(getResolver.getFormsServiceResolver());
reOptions.setReOptions(reOptionsSpec);
System.out.println("Applying Usage Rights");
try {
Document readerExtended = docAssuranceService.secureDocument(pdfDocument, null, null, reOptions,
unlockOptions);
reOptions.getResourceResolver().close();
return readerExtended;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
建立Servlet以串流Reader Extended PDF
下一步是使用POST方法建立servlet,將reader extended PDF傳回給使用者。 在此情況下,系統會要求使用者將PDF儲存至其檔案系統。 這是因為PDF呈現為動態PDF,而且瀏覽器隨附的pdf檢視器無法處理動態pdf。
以下是servlet的程式碼。 此servlet從最適化表單的自訂提交動作叫用。
Servlet會建立UsageRights物件,並根據使用者在最適化表單中輸入的值來設定其屬性。 此servlet接著會呼叫為此目的建立之服務的applyUsageRights方法。
package com.aemforms.ares.core.servlets;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.Map;
import javax.servlet.Servlet;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.request.RequestParameterMap;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;
import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.readerextensions.client.UsageRights;
import com.aemforms.ares.core.impl.ApplyUsageRights;
@Component(service = Servlet.class, property = {
"sling.servlet.methods=post",
"sling.servlet.paths=/bin/applyrights"
})
public class GetReaderExtendedPDF extends SlingAllMethodsServlet {
private static final long serialVersionUID = -883724052368090823 L;
@Reference
ApplyUsageRights applyRights;
Logger logger = LoggerFactory.getLogger(GetReaderExtendedPDF.class);
public org.w3c.dom.Document w3cDocumentFromStrng(String xmlString) {
try {
System.out.println("the submitted data is " + xmlString);
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xmlString));
return db.parse(is);
} catch (Exception e) {
logger.debug(e.getMessage());
}
return null;
}
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {
doPost(request, response);
}
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) {
System.out.println("In my do POST");
UsageRights usageRights = new UsageRights();
String submittedData = request.getParameter("jcr:data");
org.w3c.dom.Document submittedXml = w3cDocumentFromStrng(submittedData);
usageRights.setEnabledDynamicFormFields(true);
usageRights.setEnabledDynamicFormPages(true);
usageRights.setEnabledFormDataImportExport(true);
usageRights.setEnabledFormFillIn(Boolean.valueOf(submittedXml.getElementsByTagName("formfill").item(0).getTextContent()));
usageRights.setEnabledComments(Boolean.valueOf(submittedXml.getElementsByTagName("comments").item(0).getTextContent()));
usageRights.setEnabledEmbeddedFiles(Boolean.valueOf(submittedXml.getElementsByTagName("attachments").item(0).getTextContent()));
usageRights.setEnabledDigitalSignatures(Boolean.valueOf(submittedXml.getElementsByTagName("digitalsignatures").item(0).getTextContent()));
usageRights.setEnabledBarcodeDecoding(Boolean.valueOf(submittedXml.getElementsByTagName("barcode").item(0).getTextContent()));
RequestParameterMap requestParameterMap = request.getRequestParameterMap();
for (Map.Entry < String, RequestParameter[] > pairs: requestParameterMap.entrySet()) {
final org.apache.sling.api.request.RequestParameter[] pArr = pairs.getValue();
final org.apache.sling.api.request.RequestParameter param = pArr[0];
if (!param.isFormField()) {
try {
System.out.println("Got form attachment!!!!" + param.getFileName());
logger.debug("Got attachment!!!!" + param.getFileName());
InputStream is = param.getInputStream();
Document documentToReaderExtend = new Document(is);
documentToReaderExtend = applyRights.applyUsageRights(documentToReaderExtend, usageRights);
if (logger.isDebugEnabled()) {
documentToReaderExtend.copyToFile(new File(param.getFileName().split("/")[1]));
}
InputStream fileInputStream = documentToReaderExtend.getInputStream();
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=" + param.getFileName().split("/")[1]);
response.setContentLength((int) fileInputStream.available());
OutputStream responseOutputStream = response.getOutputStream();
documentToReaderExtend.close();
int bytes;
while ((bytes = fileInputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
responseOutputStream.flush();
responseOutputStream.close();
} catch (IOException e) {
logger.debug("Exception in streaming pdf back to client " + e.getMessage());
}
}
}
}
}
若要在本機伺服器上測試此專案,請遵循下列步驟:
-
使用configMgr主控台將以下專案新增到Apache Sling使用者對應程式服務,如下所示
DevelopingWithServiceUser.core:getformsresourceresolver=fd-service
- 下載並安裝ares.ares.core-ares套件。 此功能具有自訂服務和servlet,可套用使用許可權並串流回pdf。
- 匯入使用者端程式庫和自訂提交
- 匯入最適化表單
- 將Reader擴充功能憑證新增至「fd-service」使用者。 確定別名是"ares"。
- 預覽最適化表單
- 選取適當的許可權並上傳PDF檔案
- 按一下提交即可取得Reader Extended PDF
recommendation-more-help
8de24117-1378-413c-a581-01e660b7163e