Generera dokument för utskriftskanaler med inskickade data
Skriv ut kanaldokument genereras vanligtvis genom att data hämtas från en backend-datakälla via formulärdatamodellens get-tjänst. I vissa fall kan du behöva generera dokument för tryckkanaler med angivna data. Till exempel: Kunden fyller i ändringar av mottagarformulär och du kanske vill generera dokument för tryckkanaler med data från det skickade formuläret. För att kunna utföra den här åtgärden måste följande steg följas
Skapa förifyllningstjänst
Tjänstnamnet "ccm-print-test" används för att få åtkomst till den här tjänsten. När den här förifyllda tjänsten har definierats kan du komma åt den här tjänsten antingen i serverns eller arbetsflödets processstegsimplementering för att generera dokumentet för tryckkanalen.
import java.io.InputStream;
import org.osgi.service.component.annotations.Component;
import com.adobe.forms.common.service.ContentType;
import com.adobe.forms.common.service.DataOptions;
import com.adobe.forms.common.service.DataProvider;
import com.adobe.forms.common.service.FormsException;
import com.adobe.forms.common.service.PrefillData;
@Component(immediate = true, service = {DataProvider.class})
public class ICPrefillService implements DataProvider {
@Override
public String getServiceDescription() {
// TODO Auto-generated method stub
return "Prefill Service for IC Print Channel";
}
@Override
public String getServiceName() {
// TODO Auto-generated method stub
return "ccm-print-test";
}
@Override
public PrefillData getPrefillData(DataOptions options) throws FormsException {
// TODO Auto-generated method stub
PrefillData data = null;
if (options != null && options.getExtras() != null && options.getExtras().get("data") != null) {
InputStream is = (InputStream) options.getExtras().get("data");
data = new PrefillData(is, options.getContentType() != null ? options.getContentType() : ContentType.JSON);
}
return data;
}
}
Skapa WorkflowProcess-implementering
Kodfragmentet för implementering av workflowProcess visas nedan.Den här koden körs när processteget i AEM Workflow är kopplat till den här implementeringen. Implementeringen förväntar sig tre processargument som beskrivs nedan:
- Namnet på den DataFile-sökväg som angavs när det adaptiva formuläret konfigurerades
- Namn på utskriftskanalmallen
- Namnet på det genererade utskriftskanaldokumentet
Rad 98 - Eftersom den adaptiva formen baseras på formulärdatamodellen extraheras data som finns i datanoden för afBoundData.
Rad 128 - Tjänstnamnet för dataalternativ har angetts. Observera tjänstnamnet. Den måste matcha det namn som returnerades på rad 45 i föregående kodexempel.
Rad 135 - Dokumentet genereras med återgivningsmetoden för objektet PrintChannel
String params = arg2.get("PROCESS_ARGS","string").toString();
String payloadPath = workItem.getWorkflowData().getPayload().toString();
String dataFile = params.split(",")[0];
final String icFileName = params.split(",")[1];
String dataFilePath = payloadPath + "/"+dataFile+"/jcr:content";
Session session = workflowSession.adaptTo(Session.class);
Node xmlDataNode = null;
try {
xmlDataNode = session.getNode(dataFilePath);
InputStream xmlDataStream = xmlDataNode.getProperty("jcr:data").getBinary().getStream();
JsonParser jsonParser = new JsonParser();
BufferedReader streamReader = null;
try {
streamReader = new BufferedReader(new InputStreamReader(xmlDataStream, "UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StringBuilder responseStrBuilder = new StringBuilder();
String inputStr;
try {
while ((inputStr = streamReader.readLine()) != null)
responseStrBuilder.append(inputStr);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String submittedDataXml = responseStrBuilder.toString();
JsonObject jsonObject = jsonParser.parse(submittedDataXml).getAsJsonObject().get("afData").getAsJsonObject()
.get("afBoundData").getAsJsonObject().get("data").getAsJsonObject();
logger.info("Successfully Parsed gson" + jsonObject.toString());
InputStream targetStream = IOUtils.toInputStream(jsonObject.toString());
//InputStream targetStream = new ByteArrayInputStream(jsonObject.toString().getBytes());
// Node dataNode = session.getNode(formName);
logger.info("Got resource using resource resolver"
);
resHelper.callWith(getResolver.getFormsServiceResolver(), new Callable<Void>() {
@Override
public Void call() throws Exception {
System.out.println("The target stream is "+targetStream.available());
// TODO Auto-generated method stub
com.adobe.fd.ccm.channels.print.api.model.PrintChannel printChannel = null;
String formName = params.split(",")[2];
logger.info("The form name I got was "+formName);
printChannel = printChannelService.getPrintChannel(formName);
logger.info("Did i get print channel?");
com.adobe.fd.ccm.channels.print.api.model.PrintChannelRenderOptions options = new com.adobe.fd.ccm.channels.print.api.model.PrintChannelRenderOptions();
options.setMergeDataOnServer(true);
options.setRenderInteractive(false);
com.adobe.forms.common.service.DataOptions dataOptions = new com.adobe.forms.common.service.DataOptions();
dataOptions.setServiceName(printChannel.getPrefillService());
// dataOptions.setExtras(map);
dataOptions.setContentType(ContentType.JSON);
logger.info("####Set the content type####");
dataOptions.setFormResource(getResolver.getFormsServiceResolver().getResource(formName));
dataOptions.setServiceName("ccm-print-test");
dataOptions.setExtras(new HashMap<String, Object>());
dataOptions.getExtras().put("data", targetStream);
options.setDataOptions(dataOptions);
logger.info("####Set the data options");
com.adobe.fd.ccm.channels.print.api.model.PrintDocument printDocument = printChannel
.render(options);
logger.info("####Generated the document");
com.adobe.aemfd.docmanager.Document uploadedDocument = new com.adobe.aemfd.docmanager.Document(
printDocument.getInputStream());
logger.info("Generated the document");
Binary binary = session.getValueFactory().createBinary(printDocument.getInputStream());
Session jcrSession = workflowSession.adaptTo(Session.class);
String dataFilePath = workItem.getWorkflowData().getPayload().toString();
Node dataFileNode = jcrSession.getNode(dataFilePath);
Node icPdf = dataFileNode.addNode(icFileName, "nt:file");
Node contentNode = icPdf.addNode("jcr:content", "nt:resource");
contentNode.setProperty("jcr:data", binary);
jcrSession.save();
logger.info("Copied the generated document");
uploadedDocument.close();
return null;
}
Så här testar du detta på servern:
-
Konfigurera daglig CQ-e-posttjänst. Detta behövs för att skicka e-post med dokumentet som har genererats som en bifogad fil.
-
Kontrollera att du har lagt till följande post i konfigurationen för användarmappningstjänsten för Apache Sling
-
DevelopingWithServiceUser.core:getformsresourceServer=fd-service
-
Ladda ned och zippa upp resurser som hör till den här artikeln i ditt filsystem
-
Importera följande paket med AEM pakethanterare
- beneficiaryconfirmationic.zip
- changeofbeneficiaryform.zip
- generatebeneficiaryworkflow.zip
-
Distribuera följande med AEM Felix Web Console
- GenerateIC.GenerateIC.core-1.0-SNAPSHOT.jar. Paketet innehåller den kod som omnämns i den här artikeln.
-
Kontrollera att det adaptiva formuläret är konfigurerat att skicka till AEM Workflow enligt nedan
-
Konfigurera arbetsflödesmodellen.Kontrollera att processsteget och skicka e-postkomponenter är konfigurerade enligt din miljö
-
Förhandsgranska ChangeOfBeneficiaryForm. Fyll i viss information och skicka
-
Arbetsflödet ska anropas och dokument för konc-utskriftskanal skickas till mottagaren som anges i skicka-e-postkomponenten som en bifogad fil