diff --git a/pom.xml b/pom.xml index cc50454..4671334 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,12 @@ hwplib 1.1.1 + + + net.sf.jasperreports + jasperreports-pdf + 7.0.2 + @@ -75,7 +81,9 @@ ${project.artifactId}-${project.version} - ${basedir}/src/main/resources + + ${basedir}/src/main/resources + @@ -117,6 +125,9 @@ **/*.class + **/*.ttf + *.properties + *.xml diff --git a/src/main/java/cokr/xit/base/docs/jasper/JasperView.java b/src/main/java/cokr/xit/base/docs/jasper/JasperView.java new file mode 100644 index 0000000..3832275 --- /dev/null +++ b/src/main/java/cokr/xit/base/docs/jasper/JasperView.java @@ -0,0 +1,93 @@ +package cokr.xit.base.docs.jasper; + +import java.io.InputStream; +import java.net.URL; +import java.util.Collection; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.view.AbstractView; + +import cokr.xit.foundation.Assert; +import cokr.xit.foundation.data.DataObject; +import net.sf.jasperreports.engine.JRDataSource; +import net.sf.jasperreports.engine.JREmptyDataSource; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.data.JRBeanArrayDataSource; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import net.sf.jasperreports.engine.data.JRMapArrayDataSource; +import net.sf.jasperreports.engine.data.JRMapCollectionDataSource; +import net.sf.jasperreports.export.SimpleExporterInput; +import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; +import net.sf.jasperreports.pdf.JRPdfExporter; + +public class JasperView extends AbstractView { + private static final JREmptyDataSource emptySource = new JREmptyDataSource(); + + @Override + protected void renderMergedOutputModel(Map model, HttpServletRequest hreq, HttpServletResponse hresp) throws Exception { + String reportRoot = "/WEB-INF/report"; + DataObject params = new DataObject() + .set("resDir", resDir(hreq.getServletContext().getResource(reportRoot))); + Map paramMap = (Map)model.get("params"); + if (!Assert.isEmpty(paramMap)) + params.putAll(paramMap); + + JRDataSource datasource = null; + Object data = model.get("data"); + if (data != null) { + if (data.getClass().isArray()) { + datasource = new JRBeanArrayDataSource((Object[])data); + } else if (data instanceof Collection collection) { + datasource = new JRBeanCollectionDataSource(collection); + } else { + datasource = new JRBeanArrayDataSource(new Object[] {data}); + } + } else { + data = model.get("dataMap"); + if (data != null) { + if (data instanceof Collection collection) + datasource = new JRMapCollectionDataSource((Collection>)collection); + else if (data.getClass().isArray()) + datasource = new JRMapArrayDataSource((Map[])data); + else + datasource = new JRMapArrayDataSource(new Map[] {(Map)data}); + } + } + if (data == null) + datasource = emptySource; + + String jasper = Assert.notEmpty((String)model.get("jasper"), "jasper"); + if (!jasper.startsWith("/")) + jasper = "/" + jasper; + jasper = reportRoot + (!jasper.startsWith("/") ? "/" + jasper : jasper); + try (InputStream input = hreq.getServletContext().getResourceAsStream(jasper);) { + JasperPrint print = JasperFillManager.fillReport( + input, + params, + datasource + ); + JRPdfExporter exporter = new JRPdfExporter(); + exporter.setExporterInput(new SimpleExporterInput(print)); + + String filename = Assert.notEmpty((String)model.get("filename"), "filename"); + hresp.setContentType("application/pdf"); + hresp.setHeader("Content-Disposition", Assert.ifEmpty((String)model.get("disposition"), "inline") + "; filename=" + filename); + + exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(hresp.getOutputStream())); + exporter.exportReport(); + } catch (Exception e) { + throw Assert.runtimeException(e); + } + } + + private String resDir(URL url) { + if (url == null) return ""; + + String path = url.toString(); + return !path.endsWith("/") ? path : path.substring(0, path.length() - 1); + } +} \ No newline at end of file diff --git a/src/main/resources/fonts.xml b/src/main/resources/fonts.xml new file mode 100644 index 0000000..4081cf2 --- /dev/null +++ b/src/main/resources/fonts.xml @@ -0,0 +1,67 @@ + + + + classpath:fonts/gulim.ttf + Identity-H + true + + 굴림 + + + + classpath:fonts/gulimche.ttf + Identity-H + true + + 굴림체 + + + + classpath:fonts/batang.ttf + Identity-H + true + + 바탕 + + + + classpath:fonts/batangche.ttf + Identity-H + true + + 바탕체 + + + + classpath:fonts/dotum.ttf + Identity-H + true + + 돋움 + + + + classpath:fonts/dotumche.ttf + Identity-H + true + + 돋움체 + + + + classpath:fonts/gungsuh.ttf + Identity-H + true + + 궁서 + + + + classpath:fonts/gungsuhche.ttf + Identity-H + true + + 궁서체 + + + \ No newline at end of file diff --git a/src/main/resources/fonts/batang.ttf b/src/main/resources/fonts/batang.ttf new file mode 100644 index 0000000..01a23db Binary files /dev/null and b/src/main/resources/fonts/batang.ttf differ diff --git a/src/main/resources/fonts/batangche.ttf b/src/main/resources/fonts/batangche.ttf new file mode 100644 index 0000000..b5bcc10 Binary files /dev/null and b/src/main/resources/fonts/batangche.ttf differ diff --git a/src/main/resources/fonts/dotum.ttf b/src/main/resources/fonts/dotum.ttf new file mode 100644 index 0000000..3de8725 Binary files /dev/null and b/src/main/resources/fonts/dotum.ttf differ diff --git a/src/main/resources/fonts/dotumche.ttf b/src/main/resources/fonts/dotumche.ttf new file mode 100644 index 0000000..f232899 Binary files /dev/null and b/src/main/resources/fonts/dotumche.ttf differ diff --git a/src/main/resources/fonts/gulim.ttf b/src/main/resources/fonts/gulim.ttf new file mode 100644 index 0000000..9c7946a Binary files /dev/null and b/src/main/resources/fonts/gulim.ttf differ diff --git a/src/main/resources/fonts/gulimche.ttf b/src/main/resources/fonts/gulimche.ttf new file mode 100644 index 0000000..8815925 Binary files /dev/null and b/src/main/resources/fonts/gulimche.ttf differ diff --git a/src/main/resources/fonts/gungsuh.ttf b/src/main/resources/fonts/gungsuh.ttf new file mode 100644 index 0000000..9cc8022 Binary files /dev/null and b/src/main/resources/fonts/gungsuh.ttf differ diff --git a/src/main/resources/fonts/gungsuhche.ttf b/src/main/resources/fonts/gungsuhche.ttf new file mode 100644 index 0000000..0860017 Binary files /dev/null and b/src/main/resources/fonts/gungsuhche.ttf differ diff --git a/src/main/resources/jasperreports_extension.properties b/src/main/resources/jasperreports_extension.properties new file mode 100644 index 0000000..3e4b0b8 --- /dev/null +++ b/src/main/resources/jasperreports_extension.properties @@ -0,0 +1,2 @@ +net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory +net.sf.jasperreports.extension.simple.font.families.fonts=fonts.xml