/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2014, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.form.docx; import org.docx4j.Docx4J; import org.docx4j.convert.out.HTMLSettings; import org.docx4j.model.structure.PageSizePaper; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.exceptions.InvalidFormatException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import ru.codeinside.gses.form.FormConverter; import ru.codeinside.gses.form.FormData; import ru.codeinside.gses.form.FormEntry; import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.TimeZone; final public class DocxFormConverter implements FormConverter { final static String SPACE = "\u00A0\u00A0\u00A0\u00A0"; public DocxFormConverter() { createDocument(); } @Override public void createForm(FormData formData) { WordprocessingMLPackage mlPackage = createDocument(); MainDocumentPart document = mlPackage.getMainDocumentPart(); new StyleBuilder(document.getStyleDefinitionsPart().getJaxbElement().getStyle()).build(); Builder b = new Builder(document); b.addP(PStyle.orgStyle); b.addR(); b.text(formData.orgName); b.addP(PStyle.receiptStyle); b.addR(); b.text("ЗАЯВЛЕНИЕ "); b.text("№"); b.addR(RStyle.ufs); if (formData.receiptId != null) { b.text(formData.receiptId.toString()); } else { b.text(SPACE); } b.addR(); b.text(" от "); b.addR(RStyle.ufs); if (formData.receiptDate != null) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm"); dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Moscow")); b.text(dateFormat.format(formData.receiptDate)); } else { b.text(SPACE); } b.addP(PStyle.serviceStyle); b.addR(); b.text(formData.serviceName); if (formData.entries != null) { addEntries(formData.entries, b, 1); } if (formData.docxFile != null) { try { mlPackage.save(new File(formData.docxFile)); } catch (Docx4JException e) { e.printStackTrace(); } } if (formData.htmlFile != null) { OutputStream os = null; try { os = new FileOutputStream(formData.htmlFile); HTMLSettings settings = new HTMLSettings(); settings.setWmlPackage(mlPackage); Docx4J.toHTML(settings, os, Docx4J.FLAG_NONE); } catch (Docx4JException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { close(os); } } } void addEntries(FormEntry[] entries, Builder b, int level) { for (FormEntry entry : entries) { PStyle pStyle = PStyle.valueOf("field" + Math.min(level, 6) + "Style"); b.addP(pStyle); b.addR(); b.text(entry.name); if (entry.value != null) { b.text(" "); b.addR(RStyle.ufs); b.text(entry.value); } if (entry.children != null) { addEntries(entry.children, b, level + 1); } } } WordprocessingMLPackage createDocument() { try { return WordprocessingMLPackage.createPackage(PageSizePaper.A4, false); } catch (InvalidFormatException e) { throw new IllegalStateException(e); } } void close(Closeable closable) { if (closable != null) { try { closable.close(); } catch (IOException e) { e.printStackTrace(); } } } }