basic pdf template lib
This commit is contained in:
67
pdf/pom.xml
Normal file
67
pdf/pom.xml
Normal file
@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>de.muehlencord</groupId>
|
||||
<artifactId>shared</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>de.muehlencord.shared</groupId>
|
||||
<artifactId>shared-pdf</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.freemarker</groupId>
|
||||
<artifactId>freemarker</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hamcrest</groupId>
|
||||
<artifactId>hamcrest-core</artifactId>
|
||||
<version>1.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.pdfbox</groupId>
|
||||
<artifactId>pdfbox</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.seleniumhq.selenium</groupId>
|
||||
<artifactId>selenium-java</artifactId>
|
||||
<scope>test</scope>
|
||||
<version>2.44.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.opera</groupId>
|
||||
<artifactId>operadriver</artifactId>
|
||||
<scope>test</scope>
|
||||
<version>1.5</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.seleniumhq.selenium</groupId>
|
||||
<artifactId>selenium-remote-driver</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@ -0,0 +1,37 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class ConfigurationException extends Exception {
|
||||
|
||||
/**
|
||||
* Creates a new instance of <code>ConfigurationException</code> without
|
||||
* detail message.
|
||||
*/
|
||||
public ConfigurationException() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>ConfigurationException</code> with the
|
||||
* specified detail message.
|
||||
*
|
||||
* @param msg the detail message.
|
||||
*/
|
||||
public ConfigurationException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>ConfigurationException</code> with the
|
||||
* specified detail message and the given root cause.
|
||||
*
|
||||
* @param msg the detail message.
|
||||
* @param th the root cause.
|
||||
*/
|
||||
public ConfigurationException(String msg, Throwable th) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
}
|
||||
79
pdf/src/main/java/de/muehlencord/shared/pdf/Content.java
Normal file
79
pdf/src/main/java/de/muehlencord/shared/pdf/Content.java
Normal file
@ -0,0 +1,79 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public abstract class Content {
|
||||
|
||||
@Expose
|
||||
protected int x;
|
||||
|
||||
@Expose
|
||||
protected int y;
|
||||
|
||||
@Expose
|
||||
protected Font standardFont;
|
||||
|
||||
@Expose
|
||||
protected Map<String, Font> fontMap;
|
||||
|
||||
public Content(int x, int y) {
|
||||
this.standardFont = new Font("Helvetica", 11);
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.fontMap = null;
|
||||
}
|
||||
|
||||
public void addFont(String name, Font font) {
|
||||
if (fontMap == null) {
|
||||
fontMap = new ConcurrentHashMap<>();
|
||||
}
|
||||
fontMap.put(name, font);
|
||||
}
|
||||
|
||||
protected PDFont getFont(String fontName) throws ConfigurationException {
|
||||
if (fontName.equals(PDType1Font.HELVETICA.getBaseFont())) {
|
||||
return PDType1Font.HELVETICA;
|
||||
} else {
|
||||
throw new ConfigurationException("Font " + fontName + " not supported");
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void addContentToPdf(PDRectangle rect, PDPageContentStream cos) throws IOException, ConfigurationException;
|
||||
|
||||
/* *** getter / setter *** */
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(int x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public int getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(int y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public Font getStandardFont() {
|
||||
return standardFont;
|
||||
}
|
||||
|
||||
public void setStandardFont(Font standardFont) {
|
||||
this.standardFont = standardFont;
|
||||
}
|
||||
|
||||
}
|
||||
51
pdf/src/main/java/de/muehlencord/shared/pdf/Font.java
Normal file
51
pdf/src/main/java/de/muehlencord/shared/pdf/Font.java
Normal file
@ -0,0 +1,51 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class Font {
|
||||
|
||||
private String fontName;
|
||||
private int fontSize;
|
||||
private int padding;
|
||||
|
||||
public Font(String fontName, int fontSize) {
|
||||
this.fontName = fontName;
|
||||
this.fontSize = fontSize;
|
||||
this.padding = 2;
|
||||
}
|
||||
|
||||
public Font(String fontName, int fontSize, int padding) {
|
||||
this.fontName = fontName;
|
||||
this.fontSize = fontSize;
|
||||
this.padding = padding;
|
||||
}
|
||||
|
||||
/* *** getter / setter *** */
|
||||
|
||||
public String getFontName() {
|
||||
return fontName;
|
||||
}
|
||||
|
||||
public void setFontName(String fontName) {
|
||||
this.fontName = fontName;
|
||||
}
|
||||
|
||||
public int getFontSize() {
|
||||
return fontSize;
|
||||
}
|
||||
|
||||
public void setFontSize(int fontSize) {
|
||||
this.fontSize = fontSize;
|
||||
}
|
||||
|
||||
public int getPadding() {
|
||||
return padding;
|
||||
}
|
||||
|
||||
public void setPadding(int padding) {
|
||||
this.padding = padding;
|
||||
}
|
||||
|
||||
}
|
||||
19
pdf/src/main/java/de/muehlencord/shared/pdf/GsonUtil.java
Normal file
19
pdf/src/main/java/de/muehlencord/shared/pdf/GsonUtil.java
Normal file
@ -0,0 +1,19 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class GsonUtil {
|
||||
|
||||
public final static Gson getGsonInstance() {
|
||||
return new GsonBuilder()
|
||||
.setPrettyPrinting()
|
||||
.registerTypeAdapter(Content.class, new InterfaceAdapter<>())
|
||||
.create();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,54 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import com.google.gson.JsonDeserializationContext;
|
||||
import java.lang.reflect.Type;
|
||||
import com.google.gson.JsonDeserializer;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonSerializationContext;
|
||||
import com.google.gson.JsonSerializer;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class InterfaceAdapter<T> implements JsonSerializer<T>, JsonDeserializer<T> {
|
||||
|
||||
@Override
|
||||
public final JsonElement serialize(final T object, final Type interfaceType, final JsonSerializationContext context) {
|
||||
final JsonObject member = new JsonObject();
|
||||
member.addProperty("type", object.getClass().getName());
|
||||
member.add("data", context.serialize(object));
|
||||
return member;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final T deserialize(final JsonElement elem, final Type interfaceType, final JsonDeserializationContext context) throws JsonParseException {
|
||||
final JsonObject member = (JsonObject) elem;
|
||||
final JsonElement typeString = get(member, "type");
|
||||
final JsonElement data = get(member, "data");
|
||||
final Type actualType = typeForName(typeString);
|
||||
|
||||
return context.deserialize(data, actualType);
|
||||
}
|
||||
|
||||
private Type typeForName(final JsonElement typeElem) {
|
||||
try {
|
||||
return Class.forName(typeElem.getAsString());
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new JsonParseException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private JsonElement get(final JsonObject wrapper, final String memberName) {
|
||||
final JsonElement elem = wrapper.get(memberName);
|
||||
|
||||
if (elem == null) {
|
||||
throw new JsonParseException(
|
||||
"no '" + memberName + "' member found in json file.");
|
||||
}
|
||||
return elem;
|
||||
}
|
||||
|
||||
}
|
||||
43
pdf/src/main/java/de/muehlencord/shared/pdf/PDFDocument.java
Normal file
43
pdf/src/main/java/de/muehlencord/shared/pdf/PDFDocument.java
Normal file
@ -0,0 +1,43 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class PDFDocument {
|
||||
|
||||
@Expose
|
||||
private PaperSize paperSize;
|
||||
|
||||
@Expose
|
||||
private final List<Content> contentList;
|
||||
|
||||
public PDFDocument() {
|
||||
this.contentList = new ArrayList<>();
|
||||
}
|
||||
|
||||
public PDFDocument addContent (Content content) {
|
||||
contentList.add (content);
|
||||
return this;
|
||||
}
|
||||
|
||||
/* *** getter / setter *** */
|
||||
|
||||
public PaperSize getPaperSize() {
|
||||
return paperSize;
|
||||
}
|
||||
|
||||
public void setPaperSize(PaperSize paperSize) {
|
||||
this.paperSize = paperSize;
|
||||
}
|
||||
|
||||
public List<Content> getContentList() {
|
||||
return contentList;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
75
pdf/src/main/java/de/muehlencord/shared/pdf/PDFTemplate.java
Normal file
75
pdf/src/main/java/de/muehlencord/shared/pdf/PDFTemplate.java
Normal file
@ -0,0 +1,75 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import freemarker.template.Template;
|
||||
import freemarker.template.TemplateException;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.PDPage;
|
||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
|
||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class PDFTemplate {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(PDFTemplate.class);
|
||||
|
||||
public final static String A4 = "A4";
|
||||
|
||||
private final Template template;
|
||||
private final ConcurrentHashMap<String, Object> dataModel;
|
||||
|
||||
public PDFTemplate(Template template) {
|
||||
this.template = template;
|
||||
this.dataModel = new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
public void create(String filenName) throws ConfigurationException, IOException {
|
||||
Writer out = new StringWriter();
|
||||
try {
|
||||
template.process(dataModel, out);
|
||||
} catch (TemplateException ex) {
|
||||
throw new IOException("Error while processing template", ex);
|
||||
}
|
||||
String json = out.toString();
|
||||
LOGGER.info(json);
|
||||
|
||||
Gson gson = GsonUtil.getGsonInstance();
|
||||
PDFDocument pdfDoc = gson.fromJson(json, PDFDocument.class);
|
||||
|
||||
PDDocument doc = new PDDocument();
|
||||
|
||||
PDPage page;
|
||||
switch (pdfDoc.getPaperSize()) {
|
||||
case A4:
|
||||
page = new PDPage(PDRectangle.A4);
|
||||
break;
|
||||
default:
|
||||
throw new ConfigurationException("Papersize " + pdfDoc.getPaperSize().getLabel() + " not supported");
|
||||
}
|
||||
doc.addPage(page);
|
||||
|
||||
PDRectangle rect = page.getMediaBox();
|
||||
PDPageContentStream cos = new PDPageContentStream(doc, page, AppendMode.APPEND, false);
|
||||
for (Content content : pdfDoc.getContentList()) {
|
||||
content.addContentToPdf(rect, cos);
|
||||
}
|
||||
cos.close();
|
||||
doc.save(filenName);
|
||||
}
|
||||
|
||||
void applyTemplate(Template template) {
|
||||
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class TableContent extends Content {
|
||||
|
||||
@Expose
|
||||
Font headerFont;
|
||||
|
||||
@Expose
|
||||
List<Object> header;
|
||||
|
||||
@Expose
|
||||
List<List<Object>> data;
|
||||
|
||||
public TableContent(int x, int y) {
|
||||
super(x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addContentToPdf(PDRectangle rect, PDPageContentStream cos) throws IOException, ConfigurationException {
|
||||
cos.beginText();
|
||||
cos.setFont(getFont(headerFont.getFontName()), headerFont.getFontSize());
|
||||
cos.newLineAtOffset(x,y);
|
||||
}
|
||||
|
||||
/* *** getter / setter *** */
|
||||
public Font getHeaderFont() {
|
||||
return headerFont;
|
||||
}
|
||||
|
||||
public void setHeaderFont(Font headerFont) {
|
||||
this.headerFont = headerFont;
|
||||
}
|
||||
|
||||
}
|
||||
65
pdf/src/main/java/de/muehlencord/shared/pdf/TextContent.java
Normal file
65
pdf/src/main/java/de/muehlencord/shared/pdf/TextContent.java
Normal file
@ -0,0 +1,65 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class TextContent extends Content {
|
||||
|
||||
private final List<String> textLines;
|
||||
|
||||
public TextContent() {
|
||||
this(-1, -1);
|
||||
}
|
||||
|
||||
public TextContent(int x, int y) {
|
||||
super(x, y);
|
||||
this.textLines = new LinkedList<>();
|
||||
}
|
||||
|
||||
public TextContent(int x, int y, String text) {
|
||||
super(x, y);
|
||||
this.textLines = new LinkedList<>();
|
||||
this.textLines.add(text);
|
||||
}
|
||||
|
||||
public TextContent addLine() {
|
||||
this.textLines.add("");
|
||||
return this;
|
||||
}
|
||||
|
||||
public TextContent addLine(String text) {
|
||||
this.textLines.add(text);
|
||||
return this;
|
||||
}
|
||||
|
||||
public TextContent addLine(String text, String fontShortcut) {
|
||||
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
||||
}
|
||||
|
||||
/* *** getter / setter */
|
||||
public List<String> getTextLines() {
|
||||
return textLines;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addContentToPdf(PDRectangle rect, PDPageContentStream cos) throws IOException, ConfigurationException {
|
||||
PDFont font = getFont(standardFont.getFontName());
|
||||
cos.beginText();
|
||||
cos.setFont(font, standardFont.getFontSize());
|
||||
cos.setLeading(standardFont.getFontSize() + standardFont.getPadding());
|
||||
cos.newLineAtOffset(x, y);
|
||||
for (String line : textLines) {
|
||||
cos.showText(line);
|
||||
cos.newLine();
|
||||
}
|
||||
cos.endText();
|
||||
}
|
||||
}
|
||||
24
pdf/src/test/java/de/muehlencord/shared/pdf/ContentTest.java
Normal file
24
pdf/src/test/java/de/muehlencord/shared/pdf/ContentTest.java
Normal file
@ -0,0 +1,24 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class ContentTest {
|
||||
|
||||
public ContentTest() {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetFont() throws ConfigurationException {
|
||||
TextContent textContent = new TextContent(1,1,"Helvetica");
|
||||
PDFont font = textContent.getFont("Helvetica");
|
||||
assertEquals (PDType1Font.HELVETICA, font);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import org.junit.After;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class PDFDocumentTest {
|
||||
|
||||
private static Gson gson;
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpClass() {
|
||||
gson = GsonUtil.getGsonInstance();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testToJson() {
|
||||
System.out.println("testToJson");
|
||||
PDFDocument doc = new PDFDocument();
|
||||
doc.setPaperSize(PaperSize.A4);
|
||||
TextContent addressContent = new TextContent(40, 692, "Max Mustermann")
|
||||
.addLine("Musterstraße 123")
|
||||
.addLine("12345 Musterhausen");
|
||||
doc.addContent(addressContent);
|
||||
|
||||
TextContent invoiceInfoInformation = new TextContent(40, 442, "Sehr geehrter Anzeigenkunde, ")
|
||||
.addLine()
|
||||
.addLine()
|
||||
.addLine("Wir danken für den Auftrag und bitten um Erledigung der folgenden Anzeigenabrechnung");
|
||||
doc.addContent(invoiceInfoInformation);
|
||||
|
||||
TextContent informationContent = new TextContent(400, 662);
|
||||
informationContent.addFont("bold", new Font("Helvetica-Bold", 12, 2));
|
||||
informationContent.addLine ("Anzeigenabrechnung", "bold");
|
||||
|
||||
System.out.println(gson.toJson(doc));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
package de.muehlencord.shared.pdf;
|
||||
|
||||
import freemarker.template.Configuration;
|
||||
import freemarker.template.Template;
|
||||
import freemarker.template.TemplateExceptionHandler;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author jomu
|
||||
*/
|
||||
public class PDFTemplateTest {
|
||||
|
||||
@Test
|
||||
// @Ignore // TODO get template from test resources
|
||||
public void testCreate() throws IOException, ConfigurationException {
|
||||
Configuration cfg = new Configuration(Configuration.VERSION_2_3_24);
|
||||
cfg.setDirectoryForTemplateLoading(new File("c:/temp"));
|
||||
cfg.setDefaultEncoding("UTF-8");
|
||||
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
|
||||
cfg.setLogTemplateExceptions(false);
|
||||
|
||||
Template template = cfg.getTemplate("test.ftlh");
|
||||
|
||||
PDFTemplate doc = new PDFTemplate(template);
|
||||
doc.create ("c:/temp/test.pdf");
|
||||
}
|
||||
|
||||
}
|
||||
33
pdf/src/test/resources/log4j.xml
Normal file
33
pdf/src/test/resources/log4j.xml
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
|
||||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
|
||||
debug="true">
|
||||
|
||||
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c] %m%n" />
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<logger name="org.hibernate">
|
||||
<level value="warn" />
|
||||
</logger>
|
||||
|
||||
<category name="de.muehlencord">
|
||||
<priority value="DEBUG"/>
|
||||
</category>
|
||||
|
||||
<category name="com.sun">
|
||||
<priority value="WARN"/>
|
||||
</category>
|
||||
|
||||
<category name="javax.xml">
|
||||
<priority value="WARN"/>
|
||||
</category>
|
||||
|
||||
<root>
|
||||
<level value="INFO" />
|
||||
<appender-ref ref="consoleAppender" />
|
||||
</root>
|
||||
|
||||
</log4j:configuration>
|
||||
Reference in New Issue
Block a user