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));
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];
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
/* Interesting... this doesn't work, I guess we have to iterate to find the stuff...
PdfObject typeValue = dict.get(new PdfName("/Type"));
if (typeValue != null && "/Annot".equals(typeValue.toString())) {
PdfObject tuValue = dict.get(new PdfName("/TU"));
annotation = tuValue.toString();
}
*/
PdfObject typeValue = null;
PdfObject tuValue = null;
Set<PdfName> dictKeys = UtilGenerics.checkSet(dict.getKeys());
Iterator<PdfName> dictKeyIter = dictKeys.iterator();
while (dictKeyIter.hasNext()) {
PdfName dictKeyName = dictKeyIter.next();
PdfObject dictObject = dict.get(dictKeyName);
if ("/Type".equals(dictKeyName.toString())) {
typeValue = dictObject;
} else if ("/TU".equals(dictKeyName.toString())) {
tuValue = dictObject;
}
//Debug.logInfo("AcroForm widget fieldName[" + fieldName + "] dictKey[" + dictKeyName.toString() + "] dictValue[" + dictObject.toString() + "]", module);
}
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 = delegator.findByPrimaryKey("Survey", UtilMisc.toMap("surveyId", surveyId));
survey.set("acroFormContentId", contentId);
survey.store();
}