#java #pdf #itext #acrobat
Вопрос:
Мы используем iTextPDF для создания отчета в формате PDF. Он начинается с формы PDF в качестве шаблона. Мы заполняем его данными JSON. У меня есть поля даты и поля времени в форме, несколько полей даты и времени. В JSON дата отформатирована как гггг-ММ-дд, а время-как 24 часа, ЧЧ:мм. Я хочу отобразить дату в PDF в формате ММ/дд/гггг, а время-в 12-часовом формате.
Как я могу выполнить вычисление или что-то подобное для значений, передаваемых в форму? Мой JSON выглядит так:
"F_Backing1_Week": "1",
"F_Backing1_Date": "2021-11-09",
"F_Backing1_Time": "02:00",
"F_Backing2_Week": "1",
"F_Backing2_Date": "2021-11-09",
"F_Backing2_Time": "04:30",
Моя форма акробата настроена так:
Мой Java — код, который создает PDF-файл:
public PdfObject makePDFFromJson(String templatePath, String pdfName, String json) throws IOException {
PdfObject pdfObject = new PdfObject();
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream stream = this.getClass().getClassLoader().getResourceAsStream(templatePath);
PdfWriter writer = new PdfWriter(out);
writer.setCompressionLevel(9);
PdfDocument pdf = new PdfDocument(new PdfReader(stream), writer);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
Map<String, PdfFormField> fields = form.getFormFields();
Gson gson = new GsonBuilder().create();
Map<String, String> jsonMap = gson.fromJson(json, Map.class);
for(Map.Entry<String,String> entry : jsonMap.entrySet()){
if(fields.containsKey(entry.getKey())) {
logger.debug(entry.getValue());
if(entry.getValue().contains("data:image/png;base64")) {
logger.debug("found an image!");
fields.get(entry.getKey()).setValue(entry.getValue().split(",")[1]);
} else {
fields.get(entry.getKey()).setValue(entry.getValue());
}
}
}
form.flattenFields();
pdf.close();
pdfObject.setPdfBytes(out.toByteArray());
out.close();
pdfObject.setPdfName(pdfName);
return pdfObject;
}
Как я могу отформатировать эти значения?
Комментарии:
1. Для iText эти поля, по сути, являются полями обычного текста. Если вы хотите отобразить содержимое в специальном формате, вам необходимо соответствующим образом отформатировать строку и установить эту отформатированную строку в качестве значения поля.
2. Есть ли какой-либо способ форматирования из Acrobat? или он просто возьмет любую веревочку, которую я в него брошу?
3. На самом деле это зависит от обстоятельств. Обычно вы можете бросить в него что угодно, используя itext. Но после открытия формы может быть запущен какой-то Javascript, который переформатирует значения всех полей.