use of com.lowagie.text.pdf.PdfStamper in project ofbiz-framework by apache.
the class PdfSurveyServices method getAcroFieldsFromPdf.
/**
*/
public static Map<String, Object> getAcroFieldsFromPdf(DispatchContext dctx, Map<String, ? extends Object> context) {
Map<String, Object> acroFieldMap = new HashMap<>();
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
Delegator delegator = dctx.getDelegator();
ByteBuffer byteBuffer = getInputByteBuffer(context, delegator);
PdfReader r = new PdfReader(byteBuffer.array());
PdfStamper s = new PdfStamper(r, os);
AcroFields fs = s.getAcroFields();
Map<String, Object> map = UtilGenerics.checkMap(fs.getFields());
s.setFormFlattening(true);
for (String fieldName : map.keySet()) {
String parmValue = fs.getField(fieldName);
acroFieldMap.put(fieldName, parmValue);
}
} catch (DocumentException | GeneralException | IOException e) {
Debug.logError(e, module);
return ServiceUtil.returnError(e.getMessage());
}
Map<String, Object> results = ServiceUtil.returnSuccess();
results.put("acroFieldMap", acroFieldMap);
return results;
}
use of com.lowagie.text.pdf.PdfStamper in project ofbiz-framework by apache.
the class PdfSurveyServices method buildSurveyFromPdf.
/**
*/
public static Map<String, Object> buildSurveyFromPdf(DispatchContext dctx, Map<String, ? extends Object> context) {
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
GenericValue userLogin = (GenericValue) context.get("userLogin");
Locale locale = (Locale) context.get("locale");
Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
String surveyId = null;
try {
String surveyName = (String) context.get("surveyName");
ByteArrayOutputStream os = new ByteArrayOutputStream();
ByteBuffer byteBuffer = getInputByteBuffer(context, delegator);
PdfReader pdfReader = new PdfReader(byteBuffer.array());
PdfStamper pdfStamper = new PdfStamper(pdfReader, os);
AcroFields acroFields = pdfStamper.getAcroFields();
Map<String, Object> acroFieldMap = UtilGenerics.checkMap(acroFields.getFields());
String contentId = (String) context.get("contentId");
GenericValue survey = null;
surveyId = (String) context.get("surveyId");
if (UtilValidate.isEmpty(surveyId)) {
survey = delegator.makeValue("Survey", UtilMisc.toMap("surveyName", surveyName));
survey.set("surveyId", surveyId);
survey.set("allowMultiple", "Y");
survey.set("allowUpdate", "Y");
survey = delegator.createSetNextSeqId(survey);
surveyId = survey.getString("surveyId");
}
// create a SurveyQuestionCategory to put the questions in
Map<String, Object> createCategoryResultMap = dispatcher.runSync("createSurveyQuestionCategory", UtilMisc.<String, Object>toMap("description", "From AcroForm in Content [" + contentId + "] for Survey [" + surveyId + "]", "userLogin", userLogin));
if (ServiceUtil.isError(createCategoryResultMap)) {
return ServiceUtil.returnError(ServiceUtil.getErrorMessage(createCategoryResultMap));
}
String surveyQuestionCategoryId = (String) createCategoryResultMap.get("surveyQuestionCategoryId");
pdfStamper.setFormFlattening(true);
for (String fieldName : acroFieldMap.keySet()) {
AcroFields.Item item = acroFields.getFieldItem(fieldName);
int type = acroFields.getFieldType(fieldName);
String value = acroFields.getField(fieldName);
Debug.logInfo("fieldName:" + fieldName + "; item: " + item + "; value: " + value, module);
GenericValue surveyQuestion = delegator.makeValue("SurveyQuestion", UtilMisc.toMap("question", fieldName));
String surveyQuestionId = delegator.getNextSeqId("SurveyQuestion");
surveyQuestion.set("surveyQuestionId", surveyQuestionId);
surveyQuestion.set("surveyQuestionCategoryId", surveyQuestionCategoryId);
if (type == AcroFields.FIELD_TYPE_TEXT) {
surveyQuestion.set("surveyQuestionTypeId", "TEXT_SHORT");
} else if (type == AcroFields.FIELD_TYPE_RADIOBUTTON) {
surveyQuestion.set("surveyQuestionTypeId", "OPTION");
} else if (type == AcroFields.FIELD_TYPE_LIST || type == AcroFields.FIELD_TYPE_COMBO) {
surveyQuestion.set("surveyQuestionTypeId", "OPTION");
// TODO: handle these specially with the acroFields.getListOptionDisplay (and getListOptionExport?)
} else {
surveyQuestion.set("surveyQuestionTypeId", "TEXT_SHORT");
Debug.logWarning("Building Survey from PDF, fieldName=[" + fieldName + "]: don't know how to handle field type: " + type + "; defaulting to short text", module);
}
// ==== create a good sequenceNum based on tab order or if no tab order then the page location
Integer tabPage = item.getPage(0);
Integer tabOrder = item.getTabOrder(0);
Debug.logInfo("tabPage=" + tabPage + ", tabOrder=" + tabOrder, module);
// array of float multiple of 5. For each of this groups the values are: [page, llx, lly, urx, ury]
float[] fieldPositions = acroFields.getFieldPositions(fieldName);
float fieldPage = fieldPositions[0];
float fieldLlx = fieldPositions[1];
float fieldLly = fieldPositions[2];
float fieldUrx = fieldPositions[3];
float fieldUry = fieldPositions[4];
Debug.logInfo("fieldPage=" + fieldPage + ", fieldLlx=" + fieldLlx + ", fieldLly=" + fieldLly + ", fieldUrx=" + fieldUrx + ", fieldUry=" + fieldUry, module);
Long sequenceNum = null;
if (tabPage != null && tabOrder != null) {
sequenceNum = Long.valueOf(tabPage.intValue() * 1000 + tabOrder.intValue());
Debug.logInfo("tabPage=" + tabPage + ", tabOrder=" + tabOrder + ", sequenceNum=" + sequenceNum, module);
} else if (fieldPositions.length > 0) {
sequenceNum = Long.valueOf((long) fieldPage * 10000 + (long) fieldLly * 1000 + (long) fieldLlx);
Debug.logInfo("fieldPage=" + fieldPage + ", fieldLlx=" + fieldLlx + ", fieldLly=" + fieldLly + ", fieldUrx=" + fieldUrx + ", fieldUry=" + fieldUry + ", sequenceNum=" + sequenceNum, module);
}
// TODO: need to find something better to put into these fields...
String annotation = null;
for (int k = 0; k < item.size(); ++k) {
PdfDictionary dict = item.getWidget(k);
// if the "/Type" value is "/Annot", then get the value of "/TU" for the annotation
PdfObject typeValue = null;
PdfObject tuValue = null;
Set<PdfName> dictKeys = UtilGenerics.checkSet(dict.getKeys());
for (PdfName dictKeyName : dictKeys) {
PdfObject dictObject = dict.get(dictKeyName);
if ("/Type".equals(dictKeyName.toString())) {
typeValue = dictObject;
} else if ("/TU".equals(dictKeyName.toString())) {
tuValue = dictObject;
}
}
if (tuValue != null && typeValue != null && "/Annot".equals(typeValue.toString())) {
annotation = tuValue.toString();
}
}
surveyQuestion.set("description", fieldName);
if (UtilValidate.isNotEmpty(annotation)) {
surveyQuestion.set("question", annotation);
} else {
surveyQuestion.set("question", fieldName);
}
GenericValue surveyQuestionAppl = delegator.makeValue("SurveyQuestionAppl", UtilMisc.toMap("surveyId", surveyId, "surveyQuestionId", surveyQuestionId));
surveyQuestionAppl.set("fromDate", nowTimestamp);
surveyQuestionAppl.set("externalFieldRef", fieldName);
if (sequenceNum != null) {
surveyQuestionAppl.set("sequenceNum", sequenceNum);
}
surveyQuestion.create();
surveyQuestionAppl.create();
}
pdfStamper.close();
if (UtilValidate.isNotEmpty(contentId)) {
survey = EntityQuery.use(delegator).from("Survey").where("surveyId", surveyId).queryOne();
survey.set("acroFormContentId", contentId);
survey.store();
}
} catch (GeneralException | DocumentException | IOException e) {
Debug.logError(e, "Error generating PDF: " + e.toString(), module);
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentPDFGeneratingError", UtilMisc.toMap("errorString", e.toString()), locale));
}
Map<String, Object> results = ServiceUtil.returnSuccess();
results.put("surveyId", surveyId);
return results;
}
use of com.lowagie.text.pdf.PdfStamper in project spring-framework by spring-projects.
the class AbstractPdfStamperView method renderMergedOutputModel.
@Override
protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
// IE workaround: write into byte array first.
ByteArrayOutputStream baos = createTemporaryOutputStream();
PdfReader reader = readPdfResource();
PdfStamper stamper = new PdfStamper(reader, baos);
mergePdfDocument(model, stamper, request, response);
stamper.close();
// Flush to HTTP response.
writeToResponse(response, baos);
}
use of com.lowagie.text.pdf.PdfStamper in project ofbiz-framework by apache.
the class PdfSurveyServices method setAcroFields.
/**
*/
public static Map<String, Object> setAcroFields(DispatchContext dctx, Map<String, ? extends Object> context) {
Map<String, Object> results = ServiceUtil.returnSuccess();
Delegator delegator = dctx.getDelegator();
try {
Map<String, Object> acroFieldMap = UtilGenerics.checkMap(context.get("acroFieldMap"));
ByteBuffer byteBuffer = getInputByteBuffer(context, delegator);
PdfReader r = new PdfReader(byteBuffer.array());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfStamper s = new PdfStamper(r, baos);
AcroFields fs = s.getAcroFields();
Map<String, Object> map = UtilGenerics.checkMap(fs.getFields());
s.setFormFlattening(true);
for (String fieldName : map.keySet()) {
String fieldValue = fs.getField(fieldName);
Object obj = acroFieldMap.get(fieldName);
if (obj instanceof Date) {
Date d = (Date) obj;
fieldValue = UtilDateTime.toDateString(d);
} else if (obj instanceof Long) {
Long lg = (Long) obj;
fieldValue = lg.toString();
} else if (obj instanceof Integer) {
Integer ii = (Integer) obj;
fieldValue = ii.toString();
} else {
fieldValue = (String) obj;
}
if (UtilValidate.isNotEmpty(fieldValue)) {
fs.setField(fieldName, fieldValue);
}
}
s.close();
baos.close();
ByteBuffer outByteBuffer = ByteBuffer.wrap(baos.toByteArray());
results.put("outByteBuffer", outByteBuffer);
} catch (DocumentException | IOException | GeneralException e) {
Debug.logError(e, module);
results = ServiceUtil.returnError(e.getMessage());
}
return results;
}
use of com.lowagie.text.pdf.PdfStamper in project ofbiz-framework by apache.
the class PdfSurveyServices method buildSurveyResponseFromPdf.
/**
*/
public static Map<String, Object> buildSurveyResponseFromPdf(DispatchContext dctx, Map<String, ? extends Object> context) {
String surveyResponseId = null;
Locale locale = (Locale) context.get("locale");
try {
Delegator delegator = dctx.getDelegator();
String partyId = (String) context.get("partyId");
String surveyId = (String) context.get("surveyId");
surveyResponseId = (String) context.get("surveyResponseId");
if (UtilValidate.isNotEmpty(surveyResponseId)) {
GenericValue surveyResponse = EntityQuery.use(delegator).from("SurveyResponse").where("surveyResponseId", surveyResponseId).queryOne();
if (surveyResponse != null) {
surveyId = surveyResponse.getString("surveyId");
}
} else {
surveyResponseId = delegator.getNextSeqId("SurveyResponse");
GenericValue surveyResponse = delegator.makeValue("SurveyResponse", UtilMisc.toMap("surveyResponseId", surveyResponseId, "surveyId", surveyId, "partyId", partyId));
surveyResponse.set("responseDate", UtilDateTime.nowTimestamp());
surveyResponse.set("lastModifiedDate", UtilDateTime.nowTimestamp());
surveyResponse.create();
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
ByteBuffer byteBuffer = getInputByteBuffer(context, delegator);
PdfReader r = new PdfReader(byteBuffer.array());
PdfStamper s = new PdfStamper(r, os);
AcroFields fs = s.getAcroFields();
Map<String, Object> hm = UtilGenerics.checkMap(fs.getFields());
s.setFormFlattening(true);
for (String fieldName : hm.keySet()) {
// AcroFields.Item item = fs.getFieldItem(fieldName);
String value = fs.getField(fieldName);
GenericValue surveyQuestionAndAppl = EntityQuery.use(delegator).from("SurveyQuestionAndAppl").where("surveyId", surveyId, "externalFieldRef", fieldName).queryFirst();
if (surveyQuestionAndAppl == null) {
Debug.logInfo("No question found for surveyId:" + surveyId + " and externalFieldRef:" + fieldName, module);
continue;
}
String surveyQuestionId = (String) surveyQuestionAndAppl.get("surveyQuestionId");
String surveyQuestionTypeId = (String) surveyQuestionAndAppl.get("surveyQuestionTypeId");
GenericValue surveyResponseAnswer = delegator.makeValue("SurveyResponseAnswer", UtilMisc.toMap("surveyResponseId", surveyResponseId, "surveyQuestionId", surveyQuestionId));
if (surveyQuestionTypeId == null || "TEXT_SHORT".equals(surveyQuestionTypeId)) {
surveyResponseAnswer.set("textResponse", value);
}
delegator.create(surveyResponseAnswer);
}
s.close();
} catch (GeneralException | DocumentException | IOException e) {
Debug.logError(e, "Error generating PDF: " + e.toString(), module);
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentPDFGeneratingError", UtilMisc.toMap("errorString", e.toString()), locale));
}
Map<String, Object> results = ServiceUtil.returnSuccess();
results.put("surveyResponseId", surveyResponseId);
return results;
}
Aggregations