Använda Reader-tillägg
Med Reader Extensions kan du ändra användningsrättigheter för PDF-dokument. Användningsrättigheterna gäller funktioner som är tillgängliga i Acrobat men inte i Adobe Reader. Funktionerna som styrs av Reader Extensions inkluderar möjligheten att lägga till kommentarer i ett dokument, fylla i formulär och spara dokumentet. PDF-dokument som har användarrättigheter tillagda kallas rättighetsaktiverade dokument. En användare som öppnar ett rättighetsaktiverat PDF-dokument i Adobe Reader kan utföra de åtgärder som är aktiverade för det dokumentet.
För att uppnå detta måste vi göra följande:
- Lägg till Reader Extensions-certifikatettill
fd-service
-användaren.
Skapa en anpassad OSGi-tjänst
Skapa en anpassad OSGi-tjänst som tillämpar användningsrättigheter på dokumenten. Koden för att uppnå detta visas nedan
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;
}
}
Skapa serverutrymme för direktuppspelning av Reader-utökad PDF
Nästa steg är att skapa en servlet med en POST-metod som returnerar läsarprogrammet extendedPDF till användaren. I det här fallet uppmanas användaren att spara PDF i sitt filsystem. Detta beror på att PDF återges som en dynamisk PDF och att PDF-visningsprogrammen som medföljer webbläsarna inte hanterar dynamiska PDF-filer.
Här följer koden för servleten. Servern anropas från anpassad skickaåtgärd i adaptiv form.
Servlet skapar UsageRights-objektet och ställer in dess egenskaper baserat på de värden som användaren anger i det adaptiva formuläret. Servern anropar sedan metoden applyUsageRights för den tjänst som skapats för detta ändamål.
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());
}
}
}
}
}
Så här testar du detta på den lokala servern:
-
Lägg till följande post i Apache Sling User Mapper Service med hjälp av configMgr-konsolen som visas nedan
DevelopingWithServiceUser.core:getformsresourceresolver=fd-service
- Hämta och installera ares.ares.core-ares-paketet. Detta har den anpassade tjänsten och servleten för att tillämpa användningsrättigheter och strömma tillbaka PDF-filen.
- Importera klientlibs och anpassad sändning
- Importera det adaptiva formuläret
- Lägg till Reader Extensions-certifikat till "fd-service"-användare. Kontrollera att aliaset är ares.
- Förhandsgranska anpassat formulär
- Välj rätt behörighet och ladda upp PDF-fil
- Klicka på Skicka för att hämta Reader Extended PDF