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));
String surveyQuestionCategoryId = (String) createCategoryResultMap.get("surveyQuestionCategoryId");
pdfStamper.setFormFlattening(true);
Iterator<String> i = acroFieldMap.keySet().iterator();
while (i.hasNext()) {
String fieldName = i.next();
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?)
/*String[] listOptionDisplayArray = acroFields.getListOptionDisplay(fieldName);
String[] listOptionExportArray = acroFields.getListOptionExport(fieldName);
Debug.logInfo("listOptionDisplayArray: " + listOptionDisplayArray + "; listOptionExportArray: " + listOptionExportArray, module);*/
} 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];