Дерево страниц
Skip to end of metadata
Go to start of metadata
Автоматическое формирование файла c помощью Java

Структура шаблона

  • {folder name} - название папки
    • {file name}.java - java-код
    • {file name}.sql - sql-код
    • template.xml - описание конфигурации

Описание инструмента




Написание кода

Создание java-кода

Пример
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Map;
import java.io.IOException;

import org.springframework.beans.factory.annotation.Autowired;

import ru.intertrust.cm.core.business.api.CollectionsService;
import ru.intertrust.cm.core.business.api.dto.Id;
import ru.intertrust.cm.core.business.api.dto.IdentifiableObject;
import ru.intertrust.cm.core.business.api.dto.IdentifiableObjectCollection;
import ru.intertrust.cm.core.business.impl.report.ReportBuilderFormats;
import ru.intertrust.cm.core.config.model.ReportMetadataConfig;
import ru.intertrust.cm.core.model.ReportServiceException;
import ru.intertrust.cm.core.service.api.ReportGenerator;

import ru.intertrust.cm.core.business.api.dto.DomainObject;
import com.healthmarketscience.rmiio.RemoteInputStreamClient;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import ru.intertrust.cm.core.business.api.AttachmentService;
import ru.intertrust.cmj.af.utils.BeansUtils;
import java.io.InputStreamReader;
import java.io.Reader;
import ru.intertrust.cm_sochi.business.activator.model.constant.AGdataMessageConst;
import ru.intertrust.cm_sochi.shared.fixtures.MockAttachmentService;
import ru.intertrust.cm.core.business.impl.LocalAttachmentServiceImpl;

import org.docx4j.convert.in.xhtml.ImportXHTMLProperties;
import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart;
import org.docx4j.wml.RFonts;
import org.docx4j.wml.RPr;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.exceptions.Docx4JException;

public class PrintFormRequestAccessIS implements ReportGenerator {
	String sqlFileName = "sql.sql";
	@Autowired
    private CollectionsService collectionsService;
    @Override
    public InputStream generate(ReportMetadataConfig reportMetadata, File templateFolder, Map<String, Object> parameters) {
        try {
			File newHtmlFile = File.createTempFile("new", ".docx");
			String htmlString = "";
			
			IdentifiableObjectCollection collection = getCollection(parameters, templateFolder);			
			for (IdentifiableObject identifiableObject : collection) {
				htmlString = getHtmlReport(identifiableObject);
				break;
			}

			WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

			NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
			wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
			ndp.unmarshalDefaultNumbering();

			XHTMLImporterImpl xhtmlImporter = new XHTMLImporterImpl(wordMLPackage);
			String baseURLNotUsed = "";
			wordMLPackage.getMainDocumentPart().getContent().addAll(xhtmlImporter.convert(htmlString, baseURLNotUsed));
			setDefaultFont(wordMLPackage, "Times New Roman");
			wordMLPackage.save(newHtmlFile);

            return new FileInputStream(newHtmlFile);
		} catch (Exception ex) {
			throw new ReportServiceException("Error generate report", ex);
		}
	}
	
	public void setDefaultFont(WordprocessingMLPackage wmlPackage, String fontName) throws Docx4JException {
		RFonts rfonts = Context.getWmlObjectFactory().createRFonts(); 
		rfonts.setAsciiTheme(null);
		rfonts.setAscii(fontName);
		rfonts.setHAnsi(fontName);
		rfonts.setEastAsia(fontName);
		RPr rpr = wmlPackage.getMainDocumentPart().getPropertyResolver().getDocumentDefaultRPr();
		rpr.setRFonts(rfonts);
	}

    @Override
    public String getFormat(){
        return ReportBuilderFormats.DOCX_FORMAT.getFormat();
    }

	private String getHtmlReport(IdentifiableObject identifiableObject){
		Id docId = identifiableObject.getId();
		String htmlImage = getAttachmentText(docId);
			String table = "<table>"+ "</table>";
			String style = "<style>"+ "</style>";
			
		if ((htmlImage.indexOf("<style>")>=0)&&  (htmlImage.indexOf("</style>"))>=0){
	      	style = htmlImage.substring(htmlImage.indexOf("<style>"), htmlImage.indexOf("</style>")) + "</style>";
	    }
		if ((htmlImage.indexOf("<table")>=0)&&  (htmlImage.lastIndexOf("</table>"))>=0){
			table = htmlImage.substring(htmlImage.indexOf("<table"), htmlImage.lastIndexOf("</table>")) + "</table>";
			
			while (table.indexOf(" style=\"width") > 0) {
			    int first = table.indexOf(" style=\"width");
			    String str1 = table.substring(first);
				int second = str1.indexOf(">");
				String str = table.substring(first, first + second);
				table = table.replace(str,"");
			}
	    }
		table = table.replaceAll("<a href>", "<a>");
		
		/*String str2 = table;
		int first1 = -1;
		while(str2.indexOf("<CAPITAL") >= 0) {
		    str2 = str2.substring(str2.indexOf("<CAPITAL"));
			if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") < 0 && str2.indexOf(">") >= 0) {
				String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf(">"));
				first1 = str2.indexOf(">") + (">").length();
				if(!str3.endsWith("/")) {
					String str4 = str3 + ">";
					table = table.replace(str4, str4.replace(">","/>"));
				}
			} else if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") >= 0 && str2.indexOf("<CAPITAL") != str2.lastIndexOf("<CAPITAL") && str2.indexOf("</CAPITAL>") == str2.lastIndexOf("</CAPITAL>")) {
				String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf("</CAPITAL>")) + "</CAPITAL>";
				first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length();
				while(str3.indexOf("<CAPITAL") >=0 && str3.indexOf(">")>=0) {
				    if(!(str3.indexOf("<CAPITAL") == str3.lastIndexOf("<CAPITAL") && str3.indexOf("</CAPITAL>") == str3.lastIndexOf("</CAPITAL>") )) {
						String str4 = str3.substring(str3.indexOf("<CAPITAL"), str3.indexOf(">"));
						if(!str4.endsWith("/")) {
							String str5 = str4 + ">";
							table = table.replace(str5, str5.replace(">","/>"));
						}
						int first = str3.indexOf(">");
						str3 = str3.substring(first+1);
				    }
				}
			} else {	
				first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length();
			}
			str2 = str2.substring(first1);
		}*/

		String htmlString = "<!DOCTYPE html>"
                + "<html>"
					+ "<head>"
					+ "<meta charset=\"utf-8\"/>"
					+ "<title>Печатная форма</title>"
					
					+ "<style>"
				    + "html, body { "
					+   "margin-left: 15%;"
					+   "margin-right: 15%;"
					+   "width: 100%;"
					+   "font-family: 'Times New Roman', Times, serif;"
				    + "}"
					+ ".t1{border:none;border-collapse:collapse;empty-cells: show;}"
					+ ".t2{padding: 2px 5px;border:1px solid}"
					+ "table.t2{border:none}</style>"  
					+ style
					+ "<style>"
					+ "table.t11{border:none; width:60%}" 
					+ ".t21{padding: 2px 5px;border:none}"
					+ "html, body { "
					+   "font-size: 12pt;"
					+ "}"
					+ "td.t3{width:308px}"
					+ "</style>" 
					
					
					+ "</head>"
					+ "<body>"
					
					+"<table class=\"t3\" align=\"justify\">"
					+ "<tr class=\"t3\">"
						+ "<td width=\"350px\" align=\"left\">" + identifiableObject.getString("request_date") + " № " + identifiableObject.getString("request_number")
						+ "</td>"
						+ "<td class=\"t3\" width=\"308px\" align=\"left\"><b>" + identifiableObject.getString("department_head_position") + "</b></td>"
					+ "</tr>"
					+ "<tr class=\"t3\">"
						+ "<td class=\"t3\" width=\"308px\" align=\"left\"></td>"
						+ "<td class=\"t3\" width=\"308px\" align=\"left\"><b>" + identifiableObject.getString("resource_owner_organization") + "</b></td>"
					+ "</tr>"	
					+ "<tr class=\"t3\">"
						+ "<td class=\"t3\" width=\"308px\" align=\"left\"></td>"
						+ "<td class=\"t3\" width=\"308px\" align=\"left\"><b>" + identifiableObject.getString("resource_owner_department_head") + "</b></td>"
					+ "</tr>"					
					+ "</table>"
					
					+ "<p align=\"center\"><b>" + identifiableObject.getString("service_request_type") + "</b></p>"
					+ "<p align=\"center\"><b>" + identifiableObject.getString("IS_environment") + "</b></p>"
				    + "<p/>"
					+ "<p>Прошу предоставить/отозвать права доступа:</p>"
				    + "<p/>"
					
					+ "<div>"
					+ "<table class=\"t3\" align=\"justify\">"
					+ "<tr class=\"t3\"><td class=\"t3\">ФИО работника по заявке: </td><td class=\"t3\">" + identifiableObject.getString("worker") + "</td></tr>"		
					+ "<tr class=\"t3\"><td class=\"t3\">ГО/Филиал: </td><td class=\"t3\">" + identifiableObject.getString("branch") + "</td></tr>"	
					+ "<tr class=\"t3\"><td class=\"t3\">Подразделение: </td><td class=\"t3\">" + identifiableObject.getString("subdivision") + "</td></tr>";
					
					
					if (identifiableObject.getString("isServMass").equals("0")){
					 htmlString = htmlString + "<tr class=\"t3\"><td class=\"t3\">Должность работника: </td><td class=\"t3\">" + identifiableObject.getString("worker_position") + "</td></tr>"
					+ "<tr class=\"t3\"><td class=\"t3\">Табельный номер: </td><td class=\"t3\">" + identifiableObject.getString("personnel_number") + "</td></tr>" 
					+ "<tr class=\"t3\"><td class=\"t3\">Телефон: </td><td class=\"t3\">" + identifiableObject.getString("phone") + "</td></tr>";
					}
					
					htmlString = htmlString + "<tr class=\"t3\"><td class=\"t3\">Комментарий: </td><td class=\"t3\">" + identifiableObject.getString("comment") + "</td></tr>"
					+ "</table>"
					+ "</div>"

					+ "<p/>"
					+ "<p align=\"left\">к следующим информационным ресурсам " + identifiableObject.getString("initiator_organization") + ":</p>"
					
					+ "<table class=\"t1\" align=\"justify\" bordercolor=\"black\" cols=\"4\">"
					+ "<tr class=\"t2\">"
						+ "<td class=\"t2\" height=\"50px\" align=\"center\"><b>Наименование информационного ресурса</b>" + "</td>"
						+ "<td class=\"t2\" height=\"50px\" align=\"center\"><b>Наименование должности распорядителя ресурса</b>" + "</td>"
						+ "<td class=\"t2\" height=\"50px\" align=\"center\"><b>ФИО распорядителя ресурса</b>" + "</td>"
						+ "<td class=\"t2\" width=\"180px\" height=\"50px\" align=\"center\"><b>Виза</b>" + "</td>"
					+ "</tr>"
					+ "<tr class=\"t2\">"
						+ "<td class=\"t2\" height=\"50px\" align=\"center\">" + identifiableObject.getString("information_system") + "</td>"
						+ "<td class=\"t2\" height=\"50px\" align=\"center\">" + identifiableObject.getString("resource_owner_position") + "</td>"
						+ "<td class=\"t2\" height=\"50px\" align=\"center\">" + identifiableObject.getString("resource_owner_fullname") + "</td>"
						+ "<td class=\"t2\" width=\"180px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("resource_owner_visa") + "\n" + identifiableObject.getString("resource_owner_visa_date") + "</td>"
					+ "</tr>"
					+ "</table>"

					+ "<p/>"
					+ "<p align=\"left\">Дополнительные данные по заявке:</p>"
					+ table.replaceAll("<br>","<br/>")
					+ "<br/>"
					+ "<table class=\"t11\" align=\"justify\" bordercolor=\"black\" cols=\"3\">"
					+ "<tr class=\"t21\">"
						+ "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("subdivision_head_position") + "</td>"
						+ "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("subdivision_head_visa") + " " + identifiableObject.getString("subdivision_head_visa_date") + "</td>"
						+ "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\">" + identifiableObject.getString("subdivision_head_fullname") + "</td>"
					+ "</tr>"
					+ "<tr class=\"t21\">"
						+ "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\" valign=\"bottom\">____________________<br/>(должность руководителя)</td>"
						+ "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\" valign=\"bottom\">____________________<br/>(виза)</td>"
						+ "<td class=\"t21\" width=\"308px\" height=\"50px\" align=\"center\" valign=\"bottom\">____________________<br/>(Фамилия И.О.)</td>"
					+ "</tr>"
					+ "</table>"
					+ "<p/>"
					
					+ "Данные об Инициаторе заявки:<br/>"
					+ identifiableObject.getString("initiator_fullname") + "<br/>"
					+ identifiableObject.getString("initiator_position") + "<br/>"
					+ identifiableObject.getString("initiator_subdivision") + "<br/>"
					+ identifiableObject.getString("initiator_phone_number")
					+ "</body>"
                + "</html>";
		if (htmlString.contains("<CAPITAL>")) {
			String str2 = htmlString;
			int first1 = -1;
			while(str2.indexOf("<CAPITAL") >= 0) {
				str2 = str2.substring(str2.indexOf("<CAPITAL"));
				if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") < 0 && str2.indexOf(">") >= 0) {
					String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf(">"));
					first1 = str2.indexOf(">") + (">").length();
					if(!str3.endsWith("/")) {
						String str4 = str3 + ">";
						htmlString = htmlString.replace(str4, str4.replace(">","/>"));
					}
				} else if (str2.indexOf("<CAPITAL") >= 0 && str2.indexOf("</CAPITAL>") >= 0 && str2.indexOf("<CAPITAL") != str2.lastIndexOf("<CAPITAL") && str2.indexOf("</CAPITAL>") == str2.lastIndexOf("</CAPITAL>")) {
					String str3 = str2.substring(str2.indexOf("<CAPITAL"), str2.indexOf("</CAPITAL>")) + "</CAPITAL>";
					first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length();
					while(str3.indexOf("<CAPITAL") >=0 && str3.indexOf(">")>=0) {
						if(!(str3.indexOf("<CAPITAL") == str3.lastIndexOf("<CAPITAL") && str3.indexOf("</CAPITAL>") == str3.lastIndexOf("</CAPITAL>") )) {
							String str4 = str3.substring(str3.indexOf("<CAPITAL"), str3.indexOf(">"));
							if(!str4.endsWith("/")) {
								String str5 = str4 + ">";
								htmlString = htmlString.replace(str5, str5.replace(">","/>"));
							}
							int first = str3.indexOf(">");
							str3 = str3.substring(first+1);
						}
					}
				} else {	
					first1 = str2.indexOf("</CAPITAL>") + ("</CAPITAL>").length();
				}
				str2 = str2.substring(first1);
			}
		} else htmlString = htmlString.replace("CAPITAL","");
        return htmlString;
    }


	public IdentifiableObjectCollection getCollection(Map<String, Object> parameters, File templateFolder){
		String query = "";
		String request_id = parameters.get("request_id").toString();
		request_id = request_id.substring(request_id.indexOf("id=") + 3, request_id.length() - 1);
		
		try {
			File sqlFile = new File(templateFolder, sqlFileName);
			query = queryString(sqlFile, "$request_id", request_id);
		} catch (Exception ex) {
            throw new ReportServiceException("Error generate report1", ex);
        }
		return collectionsService.findCollectionByQuery(query);
	}
	
	private AttachmentService attachmentService = BeansUtils.getTypedBean(AttachmentService.class);
	
	public String getAttachmentText(Object objDocId){
	    StringBuffer buffer = new StringBuffer();
	    if (objDocId == null) {
	        return buffer.toString();
	    }

		Id docId = (Id) objDocId;
		for(DomainObject o : attachmentService.findAttachmentDomainObjectsFor(docId, "F_AddFiles_Rkk")){
			if(buffer.length() > 0){
				buffer.append("\n");
			}
			try{
				buffer.append(convertToString(RemoteInputStreamClient.wrap(attachmentService.loadAttachment(o.getId()))));
			} catch (Exception e){
				throw new RuntimeException();
			}
		}
		return buffer.toString();
	}

	private String convertToString(InputStream inputStream) {
		final int bufferSize = 1024;
		final char[] buffer = new char[bufferSize];
		final StringBuilder out = new StringBuilder();
		try (
				Reader in = new InputStreamReader(inputStream, "UTF-8"))

		{
			for (; ; ) {
				int rsz = in.read(buffer, 0, buffer.length);
				if (rsz < 0)
					break;
				out.append(buffer, 0, rsz);
			}
			return out.toString();


		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}
	
	private String queryString (File sqlFile, String old, String newv) {
		String query = "";
        try {
            query = FileUtils.readFileToString(sqlFile);
            query = query.replace(old, newv);
        } catch (IOException e) {
            e.printStackTrace();
        }
		return query;
	}
}


Описание шаблона 

Создать файла tempate.xml, в котором:

template.xml
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<ReportMetadataConfig name="{name}" description="{description}" reportGeneratorClass="{file name.java}"/>