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;
}
} |