diff --git a/pdf/pom.xml b/pdf/pom.xml
deleted file mode 100644
index 16dc5e2..0000000
--- a/pdf/pom.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
- 4.0.0
-
- de.muehlencord
- shared
- 1.2-SNAPSHOT
-
-
- de.muehlencord.shared
- shared-pdf
- 1.2-SNAPSHOT
- jar
-
-
- org.freemarker
- freemarker
-
-
- org.junit.jupiter
- junit-jupiter-engine
- test
-
-
- org.slf4j
- slf4j-api
-
-
- org.apache.pdfbox
- pdfbox
-
-
- com.google.code.gson
- gson
-
-
- org.slf4j
- slf4j-log4j12
- test
-
-
- commons-io
- commons-io
-
-
- org.apache.commons
- commons-lang3
-
-
-
\ No newline at end of file
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/CellValue.java b/pdf/src/main/java/de/muehlencord/shared/pdf/CellValue.java
deleted file mode 100644
index c638d8f..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/CellValue.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-abstract class CellValue {
-
- protected abstract int getColSize();
-
- protected abstract float getCellPadding();
-
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/ColumnDefinition.java b/pdf/src/main/java/de/muehlencord/shared/pdf/ColumnDefinition.java
deleted file mode 100644
index 5dbce13..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/ColumnDefinition.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class ColumnDefinition {
-
- @Expose
- private final Float width;
-
- protected ColumnDefinition(Float width) {
- this.width = width;
- }
-
- /* *** getter *** */
-
- protected float getWidth() {
- return width;
- }
-
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/ConfigurationException.java b/pdf/src/main/java/de/muehlencord/shared/pdf/ConfigurationException.java
deleted file mode 100644
index 3171cb3..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/ConfigurationException.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class ConfigurationException extends Exception {
-
- /**
- * Creates a new instance of ConfigurationException without
- * detail message.
- */
- public ConfigurationException() {
- }
-
- /**
- * Constructs an instance of ConfigurationException with the
- * specified detail message.
- *
- * @param msg the detail message.
- */
- public ConfigurationException(String msg) {
- super(msg);
- }
-
- /**
- * Constructs an instance of ConfigurationException 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);
- }
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/Content.java b/pdf/src/main/java/de/muehlencord/shared/pdf/Content.java
deleted file mode 100644
index 3d3db35..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/Content.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-import java.io.IOException;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-abstract class Content implements TemplateSerializeable {
-
- protected PDFDocument document;
- protected PDRectangle rect;
-
- @Expose
- protected Float x;
-
- @Expose
- protected Float y;
-
- public Content(PDFDocument document) {
- this.document = document;
- this.x = null;
- this.y = null;
- }
-
- public Content(PDFDocument doc, float x, float y) {
- this(doc);
- this.x = x;
- this.y = y;
- }
-
- public void setDocument(PDFDocument doc) {
- this.document = doc;
- }
-
- public void setCoordinate(Coordinate coord) {
- if (x == null) {
- x = coord.getX();
- }
- if (y == null) {
- y = coord.getY();
- }
- }
-
- protected abstract Coordinate addContentToPdf(PDPageContentStream cos) throws IOException, ConfigurationException;
-
- public abstract String getTemplateJsonString();
-
- /* *** getter / setter *** */
- public float getX() {
- return x;
- }
-
- public void setX(float x) {
- this.x = x;
- }
-
- public float getY() {
- return y;
- }
-
- public void setY(float y) {
- this.y = y;
- }
-
- protected PDRectangle getRectangle() {
- return rect;
- }
-
- protected void setRect(PDRectangle rect) {
- this.rect = rect;
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/Coordinate.java b/pdf/src/main/java/de/muehlencord/shared/pdf/Coordinate.java
deleted file mode 100644
index aa90cbf..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/Coordinate.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class Coordinate {
-
- final float x;
- final float y;
-
- public Coordinate(float x, float y) {
- this.x = x;
- this.y = y;
- }
-
- public float getX() {
- return x;
- }
-
- public float getY() {
- return y;
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/DefaultTableRow.java b/pdf/src/main/java/de/muehlencord/shared/pdf/DefaultTableRow.java
deleted file mode 100644
index 2415195..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/DefaultTableRow.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class DefaultTableRow extends TableRow implements TemplateSerializeable {
-
- @Expose
- private final List row;
-
- @Expose
- private final List padding;
-
- @Expose
- private Boolean isList;
-
- @Expose
- private String listName;
-
- @Expose
- private String varName;
-
- protected DefaultTableRow() {
- this.row = new ArrayList<>();
- this.padding = new ArrayList<>();
- this.isList = false;
- this.listName = null;
- this.varName = null;
- }
-
- @Override
- public String getTemplateJsonString() {
- // copy object, null values for listName and isList so they are no longer printed in the template
- DefaultTableRow newRow = new DefaultTableRow ();
- newRow.row.addAll(this.row);
- newRow.padding.addAll(this.padding);
- newRow.isList = null;
- newRow.listName = null;
- newRow.varName = null;
-
- String returnValue = GsonUtil.getInstance().toJson(newRow);
- if (isList()) {
- String listStartString = "<#list ";
- listStartString += getListName();
- listStartString += " as ";
- listStartString += getVarName();
- listStartString += ">\n";
-
- String listEndString = "<#if (" + getVarName() + "?has_next)>,#if>";
- listEndString += "#list>\n";
-
- returnValue = listStartString + returnValue + listEndString;
- }
-
- return returnValue;
- }
-
- @Override
- protected void addColumn(TextElement element) {
- row.add(element);
- padding.add(null);
- }
-
- @Override
- protected void addColumn(TextElement element, float p) {
- row.add(element);
- padding.add(p);
- }
-
- /* *** TableRow methods *** */
- @Override
- protected int getColumnCount() {
- return row.size();
- }
-
- @Override
- protected String getColumnValue(int columnPos) {
- return row.get(columnPos).getText();
- }
-
- @Override
- protected PDFTextAlignment getAlignment(int columnPos) {
- return row.get(columnPos).getAlign();
- }
-
- @Override
- protected float getCellPadding(int columnPos) {
- Float currentPadding = padding.get(columnPos);
- if (currentPadding == null) {
- return 0F;
- } else {
- return currentPadding;
- }
- }
-
- @Override
- protected String getFontAlias(int columnPos) {
- return row.get(columnPos).getFontAlias();
- }
-
- @Override
- protected boolean isList() {
- return isList;
- }
-
- @Override
- protected DefaultTableRow createList(String listName, String varName) {
- this.listName = listName;
- this.varName = varName;
- this.isList = true;
- return this;
- }
-
- @Override
- protected String getListName() {
- return listName;
- }
-
- @Override
- protected String getVarName() {
- return varName;
- }
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/DefaultTableRowTypeAdapterFactory.java b/pdf/src/main/java/de/muehlencord/shared/pdf/DefaultTableRowTypeAdapterFactory.java
deleted file mode 100644
index 92f5bc8..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/DefaultTableRowTypeAdapterFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class DefaultTableRowTypeAdapterFactory extends GsonCustomizedTypeAdapterFactory {
-
- protected DefaultTableRowTypeAdapterFactory() {
- super(DefaultTableRow.class);
- }
-
- @Override
- protected JsonElement updateElement(JsonElement toSerialize) {
-
- JsonObject elem = toSerialize.getAsJsonObject();
- final JsonObject member = new JsonObject();
- member.addProperty("type", DefaultTableRow.class.getName());
- member.add("data", toSerialize.getAsJsonObject());
- return member;
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/GsonCustomizedTypeAdapterFactory.java b/pdf/src/main/java/de/muehlencord/shared/pdf/GsonCustomizedTypeAdapterFactory.java
deleted file mode 100644
index 16ecb10..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/GsonCustomizedTypeAdapterFactory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.Gson;
-import com.google.gson.JsonElement;
-import com.google.gson.TypeAdapter;
-import com.google.gson.TypeAdapterFactory;
-import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonWriter;
-import java.io.IOException;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-abstract class GsonCustomizedTypeAdapterFactory implements TypeAdapterFactory {
-
- protected final Class customizedClass;
-
- public GsonCustomizedTypeAdapterFactory(Class customizedClass) {
- this.customizedClass = customizedClass;
- }
-
- /**
- * Override this to muck with {@code toSerialize} before it is written to
- * the outgoing JSON stream.
- */
- protected void beforeWrite(C source, JsonElement toSerialize) {
- // do nothing in default implementation
- }
-
- /**
- * Override this to muck with {@code deserialized} before it parsed into the
- * application type.
- */
- protected void afterRead(JsonElement deserialized) {
- // do nothing in default implementation
- }
-
- protected JsonElement updateElement(JsonElement toSerialize) {
- // do nothing in default implementation
- return toSerialize;
- }
-
- @Override
- public final TypeAdapter create(Gson gson, TypeToken type) {
- TypeAdapter returnValue = null;
- if (customizedClass.isAssignableFrom(type.getRawType())) {
- returnValue = (TypeAdapter) customizeMyClassAdapter(gson, (TypeToken) type);
- }
- return returnValue;
- }
-
- private TypeAdapter customizeMyClassAdapter(Gson gson, TypeToken type) {
- final TypeAdapter delegate = gson.getDelegateAdapter(this, type);
- final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class);
- return new TypeAdapter() {
- @Override
- public void write(JsonWriter out, C value) throws IOException {
- JsonElement tree = delegate.toJsonTree(value);
- tree = updateElement(tree);
- beforeWrite(value, tree);
- elementAdapter.write(out, tree);
- }
-
- @Override
- public C read(JsonReader in) throws IOException {
- JsonElement tree = elementAdapter.read(in);
- afterRead(tree);
- return delegate.fromJsonTree(tree);
- }
- };
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/GsonUtil.java b/pdf/src/main/java/de/muehlencord/shared/pdf/GsonUtil.java
deleted file mode 100644
index 1421337..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/GsonUtil.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class GsonUtil {
-
- private final static Gson INSTANCE = new GsonBuilder()
- .setPrettyPrinting()
- .excludeFieldsWithoutExposeAnnotation()
- .registerTypeAdapter(Content.class, new InterfaceAdapter<>())
- .registerTypeAdapter(TableRow.class, new InterfaceAdapter<>())
- .registerTypeAdapter(CellValue.class, new InterfaceAdapter<>())
- .registerTypeAdapterFactory(new PDFImageContentTypeAdapterFactory())
- .registerTypeAdapterFactory(new PDFTableContentTypeAdapterFactory())
- .registerTypeAdapterFactory(new PDFTextContentTypeAdapterFactory())
- .registerTypeAdapterFactory(new DefaultTableRowTypeAdapterFactory())
- .registerTypeAdapterFactory(new TextCellValueTypeAdapterFactory())
- .create();
-
- protected final static Gson getInstance() {
- return INSTANCE;
- }
-
-}
-
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/InterfaceAdapter.java b/pdf/src/main/java/de/muehlencord/shared/pdf/InterfaceAdapter.java
deleted file mode 100644
index 018cc6d..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/InterfaceAdapter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.JsonDeserializationContext;
-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;
-import java.lang.reflect.Type;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class InterfaceAdapter implements JsonSerializer, JsonDeserializer {
-
- @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, object.getClass()));
- 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;
- }
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFDocument.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFDocument.java
deleted file mode 100644
index d489c5c..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFDocument.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.font.PDFont;
-import org.apache.pdfbox.pdmodel.font.PDType1Font;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFDocument {
-
- @Expose
- private final PDFPaperSize paperSize;
-
- @Expose
- protected PDFFont standardFont;
-
- @Expose
- protected Map fontMap;
-
- @Expose
- private final List contentList;
-
- private PDDocument pdDocument;
-
- public PDFDocument(PDFPaperSize ps) {
- this.paperSize = ps;
- this.contentList = new ArrayList<>();
- this.standardFont = new PDFFont("Helvetica", 11);
- this.fontMap = null;
- }
-
- public String getTemplateString() {
- StringBuilder sb = new StringBuilder();
- int indent = 0; // TODO add indent support
- sb.append("{\n");
-
- // paper size
- sb.append("\"paperSize\": ");
- sb.append(paperSize.getTemplateJsonString());
- sb.append(",\n");
-
- // standardFOnt
- sb.append ("\"standardFont\": ");
- sb.append (standardFont.getTemplateJsonString());
- sb.append (",\n");
-
-
- sb.append("\"fontMap\": {\n");
- Iterator> it = fontMap.entrySet().iterator();
- while (it.hasNext()) {
- Entry entry = it.next();
- sb.append("\"").append(entry.getKey()).append("\": ");
- sb.append (entry.getValue().getTemplateJsonString());
- if (it.hasNext()) {
- sb.append(",");
- }
- sb.append("\n");
- }
- sb.append ("},\n"); // fontMap
-
- sb.append ("\"contentList\": [\n");
- Iterator contentIterator = contentList.iterator();
- while (contentIterator.hasNext()) {
- Content content = contentIterator.next();
- String contentString = content.getTemplateJsonString();
- sb.append (contentString);
- if (contentIterator.hasNext())
- sb.append (",");
- sb.append ("\n");
- }
- sb.append ("]\n");
-
- sb.append("}"); // closing pdfDocument
- return sb.toString();
- }
-
- public void addFont(String name, PDFFont 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 if (fontName.equals(PDType1Font.HELVETICA_BOLD.getBaseFont())) {
- return PDType1Font.HELVETICA_BOLD;
- } else {
- throw new ConfigurationException("Font " + fontName + " not supported");
- }
- }
-
- public PDFFont getFontByAlias(String fontAlias) throws ConfigurationException {
- if ((fontMap != null) && (fontMap.containsKey(fontAlias))) {
- return fontMap.get(fontAlias);
- } else {
- throw new ConfigurationException("Font " + fontAlias + " not found in mapping. ");
- }
- }
-
- public PDFDocument addContent(Content content) {
- contentList.add(content);
- return this;
- }
-
- /* *** getter / setter *** */
- public PDFPaperSize getPaperSize() {
- return paperSize;
- }
-
- public PDFFont getStandardFont() {
- return standardFont;
- }
-
- public void setStandardFont(PDFFont standardFont) {
- this.standardFont = standardFont;
- }
-
- public List getContentList() {
- return contentList;
- }
-
- public PDDocument getPdDocument() {
- return pdDocument;
- }
-
- public void setPdDocument(PDDocument pdDocument) {
- this.pdDocument = pdDocument;
- }
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFFont.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFFont.java
deleted file mode 100644
index 3abf1cf..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFFont.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFFont implements TemplateSerializeable {
-
- @Expose
- private String fontName;
- @Expose
- private int fontSize;
- @Expose
- private int padding;
-
- public PDFFont(String fontName, int fontSize) {
- this.fontName = fontName;
- this.fontSize = fontSize;
- this.padding = 2;
- }
-
- public PDFFont(String fontName, int fontSize, int padding) {
- this.fontName = fontName;
- this.fontSize = fontSize;
- this.padding = padding;
- }
-
- @Override
- public String getTemplateJsonString() {
- return GsonUtil.getInstance().toJson (this);
- }
-
-
-
- /* *** 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;
- }
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFImageContent.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFImageContent.java
deleted file mode 100644
index 695b4cd..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFImageContent.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-import de.muehlencord.shared.pdf.util.ImageUtil;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import javax.imageio.ImageIO;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
-import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFImageContent extends Content implements TemplateSerializeable {
-
- @Expose
- private Float scale = null;
-
- @Expose
- private String base64CodedImage = null;
-
- public PDFImageContent(PDFDocument document, String contentString) throws IOException {
- super(document);
- this.base64CodedImage = contentString;
- }
-
- public PDFImageContent(PDFDocument document, File file) throws IOException {
- super(document);
- this.base64CodedImage = ImageUtil.getEncodedString(ImageIO.read(file));
- }
-
- public PDFImageContent(PDFDocument document, BufferedImage img) throws IOException {
- super(document);
- this.base64CodedImage = ImageUtil.getEncodedString(img);
- }
-
- public PDFImageContent(PDFDocument document, float x, float y, String contentString) throws IOException {
- super(document, x, y);
- this.base64CodedImage = contentString;
- }
-
- public PDFImageContent(PDFDocument document, float x, float y, File file) throws IOException {
- super(document, x, y);
- this.base64CodedImage = ImageUtil.getEncodedString(ImageIO.read(file));
- }
-
- public PDFImageContent(PDFDocument document, float x, float y, BufferedImage img) throws IOException {
- super(document, x, y);
- this.base64CodedImage = ImageUtil.getEncodedString(img);
- }
-
- public PDFImageContent(PDFDocument document, float x, float y, float scale, String contentString) throws IOException {
- super(document, x, y);
- this.scale = scale;
- this.base64CodedImage = contentString;
- }
-
- public PDFImageContent(PDFDocument document, float x, float y, float scale, File file) throws IOException {
- super(document, x, y);
- this.scale = scale;
- this.base64CodedImage = ImageUtil.getEncodedString(ImageIO.read(file));
- }
-
- public PDFImageContent(PDFDocument document, float x, float y, float scale, BufferedImage img) throws IOException {
- super(document, x, y);
- this.scale = scale;
- this.base64CodedImage = ImageUtil.getEncodedString(img);
- }
-
-
- /**
- * defaut toJson implementation uses standard JSON string
- * @return
- */
- @Override
- public String getTemplateJsonString() {
- String returnValue = GsonUtil.getInstance().toJson(this);
- return returnValue;
- }
-
- @Override
- protected Coordinate addContentToPdf(PDPageContentStream cos) throws IOException, ConfigurationException {
- BufferedImage image = ImageUtil.getImageFromEncodedString(base64CodedImage);
- PDImageXObject pdImage = LosslessFactory.createFromImage(document.getPdDocument(), image);
-
- float height = pdImage.getHeight() * getScale();
- float width = pdImage.getWidth() * getScale();
- cos.drawImage(pdImage, x, y, width, height);
- return new Coordinate(x, y - height);
- }
-
- /* *** getter / setter */
- public float getScale() {
- if (scale == null) {
- return 1F;
- } else {
- return scale;
- }
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFImageContentTypeAdapterFactory.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFImageContentTypeAdapterFactory.java
deleted file mode 100644
index 0798c56..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFImageContentTypeAdapterFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class PDFImageContentTypeAdapterFactory extends GsonCustomizedTypeAdapterFactory {
-
- protected PDFImageContentTypeAdapterFactory() {
- super(PDFImageContent.class);
- }
-
- @Override
- protected JsonElement updateElement(JsonElement toSerialize) {
- final JsonObject member = new JsonObject();
- member.addProperty("type", PDFImageContent.class.getName());
- member.add("data", toSerialize.getAsJsonObject());
- return member;
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFPaperSize.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFPaperSize.java
deleted file mode 100644
index def4ac2..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFPaperSize.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public enum PDFPaperSize implements TemplateSerializeable {
-
- A4("A4");
-
- private String label;
-
- private PDFPaperSize(String label) {
- this.label = label;
- }
-
- public String getLabel() {
- return label;
- }
-
- @Override
- public String getTemplateJsonString() {
- return GsonUtil.getInstance().toJson(this);
- }
-
-
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTableContent.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTableContent.java
deleted file mode 100644
index 2add8e0..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTableContent.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.Gson;
-import com.google.gson.annotations.Expose;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.font.PDFont;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFTableContent extends Content {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(PDFTableContent.class);
-
- @Expose
- private final List columSizes;
-
- @Expose
- private List data = null;
-
- public PDFTableContent(PDFDocument doc, PDFFont hf) {
- super(doc);
- this.columSizes = new ArrayList<>();
- this.data = new ArrayList<>();
-
- }
-
- public PDFTableContent(PDFDocument doc, PDFFont hf, float x, float y) {
- super(doc, x, y);
- this.columSizes = new ArrayList<>();
- this.data = new ArrayList<>();
- }
-
- /**
- * defaut toJson implementation uses standard JSON string
- *
- * @return
- */
- @Override
- public String getTemplateJsonString() {
- Gson gson = GsonUtil.getInstance();
- StringBuilder sb = new StringBuilder();
- sb.append ("{\n");
- sb.append ("\"type\": ");
- sb.append ("\"").append(this.getClass().getName()).append ("\",\n");
- sb.append ("\"data\": {");
- sb.append ("\"columSizes\": ");
- sb.append (gson.toJson(columSizes));
- sb.append (",\"data\": [");
- Iterator it = data.iterator();
- while (it.hasNext()) {
- TableRow row = it.next();
- sb.append (row.getTemplateJsonString());
- if (it.hasNext()) {
- sb.append (",\n");
- }
- }
- sb.append ("]\n"); // data array
- sb.append ("}\n"); // data list
- sb.append ("}\n"); // pdf table object
-
- return sb.toString();
- // return GsonUtil.getInstance().toJson(this);
- }
-
- public PDFTableContent addColumn(float size) {
- // TODO check if enough columns are defined
- this.columSizes.add(new ColumnDefinition(size));
- return this;
- }
-
- public PDFTableContent addColumn(float... sizes) {
- // TODO check if enough columns are defined
- for (float size : sizes) {
- addColumn(size);
- }
- return this;
- }
-
- public PDFTableContent addRow() {
- DefaultTableRow newRow = new DefaultTableRow();
- data.add(newRow);
- return this;
- }
-
- public PDFTableContent addListRow(String listName, String varName) {
- DefaultTableRow newRow = new DefaultTableRow();
- newRow.createList(listName, varName);
- data.add(newRow);
- return this;
- }
-
- public PDFTableContent addRow(String... values) throws ConfigurationException {
- return PDFTableContent.this.addRow(Arrays.asList(values));
- }
-
- public PDFTableContent addRow(List values) throws ConfigurationException {
- DefaultTableRow newRow = new DefaultTableRow();
- data.add(newRow);
- if (values.size() != columSizes.size()) {
- throw new ConfigurationException("Table defines " + columSizes.size() + " columns, but " + values.size() + " columns given");
- }
- validateConfiguration(newRow, false);
- for (String cellText : values) {
- PDFTableContent.this.setCellValue(cellText);
- }
- return this;
- }
-
- public PDFTableContent setCellValue(String text) throws ConfigurationException {
- TableRow lastRow = data.get(data.size() - 1);
- validateConfiguration(lastRow, true);
- lastRow.addColumn(new TextElement(text));
- return this;
- }
-
- public PDFTableContent setCellValue(String text, String fontAlias) throws ConfigurationException {
- TableRow lastRow = data.get(data.size() - 1);
- validateConfiguration(lastRow, true);
- data.get(data.size() - 1).addColumn(new TextElement(text, fontAlias));
- return this;
- }
-
- public PDFTableContent setCellValue(String text, float padding) throws ConfigurationException {
- TableRow lastRow = data.get(data.size() - 1);
- validateConfiguration(lastRow, true);
- lastRow.addColumn(new TextElement(text), padding);
- return this;
- }
-
- public PDFTableContent setCellValue(String text, String fontAlias, float padding) throws ConfigurationException {
- TableRow lastRow = data.get(data.size() - 1);
- validateConfiguration(lastRow, true);
- lastRow.addColumn(new TextElement(text, fontAlias), padding);
- return this;
- }
-
- public PDFTableContent setCellValue(String text, PDFTextAlignment alignment) throws ConfigurationException {
- TableRow lastRow = data.get(data.size() - 1);
- validateConfiguration(lastRow, true);
- lastRow.addColumn(new TextElement(text, alignment));
- return this;
- }
-
- public PDFTableContent setCellValue(String text, String fontAlias, PDFTextAlignment alignment) throws ConfigurationException {
- if (data.isEmpty()) {
- throw new ConfigurationException("Need to call newRow first");
- }
- data.get(data.size() - 1).addColumn(new TextElement(text, fontAlias, alignment));
- return this;
- }
-
- public PDFTableContent setCellValue(String text, PDFTextAlignment alignment, float padding) throws ConfigurationException {
- if (data.isEmpty()) {
- throw new ConfigurationException("Need to call newRow first");
- }
- data.get(data.size() - 1).addColumn(new TextElement(text, alignment), padding);
- return this;
- }
-
- @Override
- protected Coordinate addContentToPdf(PDPageContentStream cos) throws IOException, ConfigurationException {
- cos.beginText();
-
- int xOffSet = 0;
- for (int i = 0; i < columSizes.size(); i++) {
- xOffSet -= columSizes.get(i).getWidth();
- }
- int yOffset = document.getStandardFont().getFontSize() * -1 - document.getStandardFont().getPadding();
- float currentX = x;
- float currentY = y;
-
- cos.newLineAtOffset(x, y);
-
- for (int lineNo = 0; lineNo < data.size(); lineNo++) {
- TableRow currentRow = data.get(lineNo);
- for (int colNo = 0; colNo < currentRow.getColumnCount(); colNo++) {
- String currentColText = currentRow.getColumnValue(colNo);
- PDFTextAlignment currentColAlignment = currentRow.getAlignment(colNo);
- float cellPadding = currentRow.getCellPadding(colNo);
- float colWidth = columSizes.get(colNo).getWidth();
- String fontAlias = currentRow.getFontAlias(colNo);
- PDFFont font;
- int fontSize;
- if (fontAlias != null) {
- font = document.getFontByAlias(fontAlias);
- fontSize = document.getFontByAlias(fontAlias).getFontSize();
- } else {
- font = document.getStandardFont();
- fontSize = document.getStandardFont().getFontSize();
- }
- PDFont pdFont = document.getFont(font.getFontName());
- cos.setFont(pdFont, fontSize);
-
- float startX;
- // FIXME duplication with header and textContent object
- if (currentColAlignment == PDFTextAlignment.RIGHT) {
- float textWdith = (pdFont.getStringWidth(currentColText) / 1000F) * fontSize;
- float width = colWidth - (2F * cellPadding);
- startX = width - textWdith;
- LOGGER.info("Text width for {} = {}", currentColText, textWdith);
- cos.newLineAtOffset(startX, 0);
- } else {
- startX = 0;
- }
-
- cos.showText(currentColText);
- cos.newLineAtOffset(columSizes.get(colNo).getWidth() - startX, 0);
- }
- cos.newLineAtOffset(xOffSet, yOffset);
- currentY += yOffset;
- }
- currentY += yOffset;
-
- cos.endText();
-
- return new Coordinate(currentX, currentY);
- }
-
- private void validateConfiguration(TableRow lastRow, boolean calledFromSetCellValue) throws ConfigurationException {
- if (data.isEmpty()) {
- throw new ConfigurationException("Need to call newRow first");
- }
- if (calledFromSetCellValue) {
- if (lastRow.getColumnCount() >= columSizes.size()) {
- throw new ConfigurationException("Cannot add more columns than defined");
- }
- }
-
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTableContentTypeAdapterFactory.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTableContentTypeAdapterFactory.java
deleted file mode 100644
index a00e9f0..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTableContentTypeAdapterFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class PDFTableContentTypeAdapterFactory extends GsonCustomizedTypeAdapterFactory {
-
- protected PDFTableContentTypeAdapterFactory() {
- super(PDFTableContent.class);
- }
-
- @Override
- protected JsonElement updateElement(JsonElement toSerialize) {
- final JsonObject member = new JsonObject();
- member.addProperty("type", PDFTableContent.class.getName());
- member.add("data", toSerialize.getAsJsonObject());
- return member;
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTemplate.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTemplate.java
deleted file mode 100644
index 26f95a3..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTemplate.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.Gson;
-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 Joern Muehlencord (joern@muehlencord.de)
- */
-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 dataModel;
-
- public PDFTemplate(Template template) {
- this.template = template;
- this.dataModel = new ConcurrentHashMap<>();
- }
-
- public void addToDatamodel(String key, Object value) {
- this.dataModel.put(key, value);
- }
-
- 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.debug(json);
-
- Gson gson = GsonUtil.getInstance();
- PDFDocument pdfDoc = gson.fromJson(json, PDFDocument.class);
- pdfDoc.setPdDocument(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");
- }
- pdfDoc.getPdDocument().addPage(page);
-
- try (PDPageContentStream cos = new PDPageContentStream(pdfDoc.getPdDocument(), page, AppendMode.APPEND, false)) {
- Coordinate coord = new Coordinate(page.getMediaBox().getLowerLeftX(), page.getMediaBox().getUpperRightY());
- for (Content content : pdfDoc.getContentList()) {
- content.setDocument(pdfDoc); // FIXME move to serialization
- content.setRect(page.getMediaBox());
- content.setCoordinate(coord);
- coord = content.addContentToPdf(cos);
- }
- }
- pdfDoc.getPdDocument().save(filenName);
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextAlignment.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextAlignment.java
deleted file mode 100644
index 1c71f7c..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextAlignment.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public enum PDFTextAlignment {
-
- LEFT,
- RIGHT;
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextContent.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextContent.java
deleted file mode 100644
index 1172878..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextContent.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
-import org.apache.pdfbox.pdmodel.PDPageContentStream;
-import org.apache.pdfbox.pdmodel.font.PDFont;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFTextContent extends Content {
-
- @Expose
- private final List textLines;
-
- public PDFTextContent(PDFDocument doc) {
- super(doc);
- this.textLines = new LinkedList<>();
- }
-
- public PDFTextContent(PDFDocument doc, float x, float y) {
- super(doc, x, y);
- this.textLines = new LinkedList<>();
- }
-
- public PDFTextContent(PDFDocument doc, float x, float y, String text) {
- super(doc, x, y);
- this.textLines = new LinkedList<>();
- this.textLines.add(new TextElement(text));
- }
-
- /**
- * defaut toJson implementation uses standard JSON string
- *
- * @return
- */
- @Override
- public String getTemplateJsonString() {
- String returnValue = GsonUtil.getInstance().toJson(this);
- return returnValue;
- }
-
- public PDFTextContent addLine() {
- this.textLines.add(new TextElement());
- return this;
- }
-
- public PDFTextContent addLine(String text) {
- this.textLines.add(new TextElement(text));
- return this;
- }
-
- public PDFTextContent addLine(String text, PDFTextAlignment align) {
- this.textLines.add(new TextElement(text, align));
- return this;
- }
-
- public PDFTextContent addLine(String text, String fontAlias) {
- this.textLines.add(new TextElement(text, fontAlias));
- return this;
- }
-
- /* *** getter / setter */
- @Override
- protected Coordinate addContentToPdf(PDPageContentStream cos) throws IOException, ConfigurationException {
- float margin = 40F;
- cos.beginText();
- cos.newLineAtOffset(x, y);
- float currentY = y;
- for (TextElement textLine : textLines) {
- PDFFont font = (textLine.getFontAlias() == null ? document.getStandardFont() : document.getFontByAlias(textLine.getFontAlias()));
- PDFont pdFont = document.getFont(font.getFontName());
- cos.setFont(pdFont, font.getFontSize());
- int leading = font.getFontSize() + font.getPadding();
-
- if (textLine.getAlign() == PDFTextAlignment.RIGHT) {
- float textWdith = (pdFont.getStringWidth(textLine.getText()) / 1000F) * font.getFontSize();
- float width = rect.getUpperRightX() - rect.getLowerLeftX() - 2 * margin;
- float startX = width - textWdith;
- cos.newLineAtOffset(startX, 0);
- }
- currentY -= leading;
- cos.setLeading(leading);
- cos.showText(textLine.getText());
- cos.newLine();
- }
- cos.endText();
-
- return new Coordinate(x, currentY);
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextContentTypeAdapterFactory.java b/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextContentTypeAdapterFactory.java
deleted file mode 100644
index 99ef78b..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/PDFTextContentTypeAdapterFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class PDFTextContentTypeAdapterFactory extends GsonCustomizedTypeAdapterFactory {
-
- protected PDFTextContentTypeAdapterFactory() {
- super(PDFTextContent.class);
- }
-
- @Override
- protected JsonElement updateElement(JsonElement toSerialize) {
- final JsonObject member = new JsonObject();
- member.addProperty("type", PDFTextContent.class.getName());
- member.add("data", toSerialize.getAsJsonObject());
- return member;
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/TableRow.java b/pdf/src/main/java/de/muehlencord/shared/pdf/TableRow.java
deleted file mode 100644
index 4454232..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/TableRow.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-abstract class TableRow implements TemplateSerializeable {
-
- protected abstract TableRow createList(String listName, String varName);
-
- protected abstract int getColumnCount();
-
- protected abstract boolean isList();
-
- protected abstract String getColumnValue(int columnPos);
-
- protected abstract PDFTextAlignment getAlignment(int columnPos);
-
- protected abstract float getCellPadding (int columnPos);
-
- protected abstract String getFontAlias(int columnPos);
-
- protected abstract String getListName();
-
- protected abstract String getVarName();
-
- protected abstract void addColumn(TextElement element);
-
- protected abstract void addColumn(TextElement element, float padding);
-
-
-
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/TemplateException.java b/pdf/src/main/java/de/muehlencord/shared/pdf/TemplateException.java
deleted file mode 100644
index 52c6bbb..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/TemplateException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class TemplateException extends Exception {
-
- /**
- * Creates a new instance of TemplateException without detail
- * message.
- */
- public TemplateException() {
- }
-
- /**
- * Constructs an instance of TemplateException with the
- * specified detail message.
- *
- * @param msg the detail message.
- */
- public TemplateException(String msg) {
- super(msg);
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/TemplateSerializeable.java b/pdf/src/main/java/de/muehlencord/shared/pdf/TemplateSerializeable.java
deleted file mode 100644
index 0f729ee..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/TemplateSerializeable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-interface TemplateSerializeable {
-
- String getTemplateJsonString();
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/TextCellValue.java b/pdf/src/main/java/de/muehlencord/shared/pdf/TextCellValue.java
deleted file mode 100644
index 7bbabdd..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/TextCellValue.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class TextCellValue extends CellValue {
-
- @Expose
- private final TextElement cellValue;
- @Expose
- private final Integer colSize;
- @Expose
- private final Float cellPadding;
-
- public TextCellValue(String cellValue, int colSizes) {
- this.cellValue = new TextElement(cellValue);
- this.colSize = colSizes;
- this.cellPadding = null;
- }
-
- public TextCellValue(String cellValue, int colSizes, float cellPadding) {
- this.cellValue = new TextElement(cellValue);
- this.colSize = colSizes;
- this.cellPadding = cellPadding;
- }
-
- public TextCellValue(String cellValue, int colSizes, PDFTextAlignment align) {
- this.cellValue = new TextElement(cellValue, align);
- this.colSize = colSizes;
- this.cellPadding = null;
- }
-
- public TextCellValue(String cellValue, int colSize, PDFTextAlignment align, float cellPadding) {
- this.cellValue = new TextElement(cellValue, align);
- this.colSize = colSize;
- this.cellPadding = cellPadding;
- }
-
- /* *** getter / setter *** */
- public String getCellText() {
- return cellValue.getText();
- }
-
- public PDFTextAlignment getAlignment() {
- return cellValue.getAlign();
- }
-
- @Override
- public int getColSize() {
- return colSize;
- }
-
- @Override
- public float getCellPadding() {
- if (cellPadding == null) {
- return 0F;
- } else {
- return cellPadding;
- }
- }
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/TextCellValueTypeAdapterFactory.java b/pdf/src/main/java/de/muehlencord/shared/pdf/TextCellValueTypeAdapterFactory.java
deleted file mode 100644
index cc7512b..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/TextCellValueTypeAdapterFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class TextCellValueTypeAdapterFactory extends GsonCustomizedTypeAdapterFactory {
-
- protected TextCellValueTypeAdapterFactory() {
- super(TextCellValue.class);
- }
-
- @Override
- protected JsonElement updateElement(JsonElement toSerialize) {
- final JsonObject member = new JsonObject();
- member.addProperty("type", TextCellValue.class.getName());
- member.add("data", toSerialize.getAsJsonObject());
- return member;
- }
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/TextElement.java b/pdf/src/main/java/de/muehlencord/shared/pdf/TextElement.java
deleted file mode 100644
index ab7572b..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/TextElement.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.annotations.Expose;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-class TextElement {
-
- @Expose
- private final String text;
- @Expose
- private final String fontAlias;
- @Expose
- private final PDFTextAlignment align;
-
- public TextElement() {
- this.text = "";
- this.fontAlias = null;
- this.align = null;
- }
-
- public TextElement(String text) {
- this.text = text;
- this.fontAlias = null;
- this.align = null;
- }
-
- public TextElement(String text, PDFTextAlignment align) {
- this.text = text;
- this.fontAlias = null;
- this.align = align;
- }
-
- public TextElement(String text, String fontAlias) {
- this.text = text;
- this.fontAlias = fontAlias;
- this.align = null;
- }
-
- public TextElement(String text, String fontAlias, PDFTextAlignment align) {
- this.text = text;
- this.fontAlias = fontAlias;
- this.align = align;
- }
-
- /* *** getter / setter *** */
- public String getText() {
- return text;
- }
-
- public String getFontAlias() {
- return fontAlias;
- }
-
- public PDFTextAlignment getAlign() {
- if (align == null) {
- return PDFTextAlignment.LEFT;
- } else {
- return align;
- }
- }
-
-}
diff --git a/pdf/src/main/java/de/muehlencord/shared/pdf/util/ImageUtil.java b/pdf/src/main/java/de/muehlencord/shared/pdf/util/ImageUtil.java
deleted file mode 100644
index 52aaedb..0000000
--- a/pdf/src/main/java/de/muehlencord/shared/pdf/util/ImageUtil.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf.util;
-
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-import javax.imageio.ImageIO;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class ImageUtil {
-
- public static String getEncodedString(BufferedImage img) throws IOException {
- final ByteArrayOutputStream os = new ByteArrayOutputStream();
- ImageIO.write(img, "png", Base64.getEncoder().wrap(os));
- return os.toString(StandardCharsets.UTF_8.name());
- }
-
- public static BufferedImage getImageFromEncodedString(String base64CodedString) throws IOException {
- return ImageIO.read(new ByteArrayInputStream(Base64.getDecoder().decode(base64CodedString)));
- }
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/DefaultTableRowTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/DefaultTableRowTest.java
deleted file mode 100644
index c5468b1..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/DefaultTableRowTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class DefaultTableRowTest {
-
- @Test
- public void testFromJson() {
- String jsonString = "{\n"
- + " \"type\": \"de.muehlencord.shared.pdf.DefaultTableRow\",\n"
- + " \"data\": {\n"
- + " \"row\": [\n"
- + " {\n"
- + " \"text\": \"Rechnungs-Nr.:\"\n"
- + " },\n"
- + " {\n"
- + " \"text\": \"${invoiceNumber}\"\n"
- + " }\n"
- + " ],\n"
- + " \"isList\": false\n"
- + " }\n"
- + " }";
-
- TableRow tableRow = GsonUtil.getInstance().fromJson(jsonString, TableRow.class);
- assertFalse(tableRow == null, "tableRowObject");
- assertEquals(2, tableRow.getColumnCount(), "column count");
- assertFalse(tableRow.isList(), "isList");
- }
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/Invoice.java b/pdf/src/test/java/de/muehlencord/shared/pdf/Invoice.java
deleted file mode 100644
index a344d31..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/Invoice.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class Invoice {
-
- private final List invoiceLines;
-
- private Date invoiceDate;
- private String customerNumber;
- private String invoiceNumber;
- private String logo = null;
-
- public Invoice() {
- this.invoiceLines = new ArrayList<>();
- }
-
- public void addInvoiceLine(InvoiceLine il) {
- this.invoiceLines.add(il);
- }
-
- /* *** getter / setter *** */
- public List getInvoiceLines() {
- return invoiceLines;
- }
-
- public String getLogo() {
- return logo;
- }
-
- public void setLogo(String logo) {
- this.logo = logo;
- }
-
- public Date getInvoiceDate() {
- return invoiceDate;
- }
-
- public void setInvoiceDate(Date invoiceDate) {
- this.invoiceDate = invoiceDate;
- }
-
- public String getCustomerNumber() {
- return customerNumber;
- }
-
- public void setCustomerNumber(String customerNumber) {
- this.customerNumber = customerNumber;
- }
-
- public String getInvoiceNumber() {
- return invoiceNumber;
- }
-
- public void setInvoiceNumber(String invoiceNumber) {
- this.invoiceNumber = invoiceNumber;
- }
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/InvoiceLine.java b/pdf/src/test/java/de/muehlencord/shared/pdf/InvoiceLine.java
deleted file mode 100644
index 6bc28f8..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/InvoiceLine.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class InvoiceLine {
-
- private String description;
- private String price;
- private String amount;
- private String total;
-
- public InvoiceLine(String description, String price, String amount, String total) {
- this.description = description;
- this.price = price;
- this.amount = amount;
- this.total = total;
- }
-
-
-
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getPrice() {
- return price;
- }
-
- public void setPrice(String price) {
- this.price = price;
- }
-
- public String getAmount() {
- return amount;
- }
-
- public void setAmount(String amount) {
- this.amount = amount;
- }
-
- public String getTotal() {
- return total;
- }
-
- public void setTotal(String total) {
- this.total = total;
- }
-
-
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFFontTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/PDFFontTest.java
deleted file mode 100644
index b9378c6..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFFontTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFFontTest {
-
- public PDFFontTest() {
- }
-
- @Test
- public void testTemplateSerialisation() {
- PDFFont font = new PDFFont("Test", 12, 0);
- String gsonString = GsonUtil.getInstance().toJson(font);
- String templateString = font.getTemplateJsonString();
- System.out.println(templateString);
- assertEquals(gsonString, templateString);
- }
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFImageContentTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/PDFImageContentTest.java
deleted file mode 100644
index 214f6ed..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFImageContentTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFImageContentTest {
-
- public PDFImageContentTest() {
- }
-
- @Test
- public void testImage() throws IOException, URISyntaxException {
-
- URL urlLogo = PDFImageContentTest.class.getResource("logo-verkehrsverein-hoevelh.jpg");
- File imageFile = new File (urlLogo.toURI());
-
- PDFDocument doc = new PDFDocument(PDFPaperSize.A4);
- PDFImageContent logoContent = new PDFImageContent(doc, 400F, 700F, 0.6F, imageFile);
-
- System.out.println(GsonUtil.getInstance().toJson(logoContent));
- System.out.println(GsonUtil.getInstance().toJson(logoContent));
- }
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFTextContentTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/PDFTextContentTest.java
deleted file mode 100644
index c61d9d5..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFTextContentTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class PDFTextContentTest {
-
- @Test
- public void testSomeMethod() {
- PDFDocument doc = new PDFDocument(PDFPaperSize.A4);
- PDFTextContent informationContent = new PDFTextContent(doc, 400F, 662F);
- informationContent.addLine("Anzeigenabrechnung", "bold");
- informationContent.addLine("Veronika Mühlencord", "helv12");
- informationContent.addLine("Telefon: 05257/940154", "helv12");
- informationContent.addLine("Telefax: 05257/940156", "helv12");
- informationContent.addLine();
- informationContent.addLine("Hövelhof, den ${invoice.invoiceDate?date}", "bold");
- doc.addContent(informationContent);
-
- // System.out.println (informationContent.getTemplateJsonString());
- // System.out.println ("*****");
- // System.out.println (GsonUtil.getGsonInstance().toJson(informationContent));
- System.out.println("*****");
-
- Gson gson = new GsonBuilder()
- .registerTypeAdapterFactory(new PDFImageContentTypeAdapterFactory())
- .setPrettyPrinting()
- .excludeFieldsWithoutExposeAnnotation()
- .create();
-
- System.out.println(gson.toJson(informationContent, PDFTextContent.class));
- }
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/TextTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/TextTest.java
deleted file mode 100644
index 11f3916..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/TextTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class TextTest {
-
- public TextTest() {
- }
-
- @Test
- public void testFromJson() {
- String jsonString = "{\n"
- + "\"text\": \"Rechnungs-Nr.:\"\n"
- + "}";
-
- TextElement text = GsonUtil.getInstance().fromJson(jsonString, TextElement.class);
- assertFalse(text == null, "text object");
- assertEquals("Rechnungs-Nr.:", text.getText(), "text value");
-
- }
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/test/GsonSerialisation.java b/pdf/src/test/java/de/muehlencord/shared/pdf/test/GsonSerialisation.java
deleted file mode 100644
index b554986..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/test/GsonSerialisation.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf.test;
-
-import de.muehlencord.shared.pdf.ConfigurationException;
-import de.muehlencord.shared.pdf.PDFDocument;
-import de.muehlencord.shared.pdf.PDFFont;
-import de.muehlencord.shared.pdf.PDFPaperSize;
-import de.muehlencord.shared.pdf.PDFTableContent;
-import de.muehlencord.shared.pdf.PDFTemplate;
-import de.muehlencord.shared.pdf.TemplateException;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import java.io.File;
-import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
-import org.apache.commons.io.FileUtils;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class GsonSerialisation {
-
- @Test
- public void testSerialisation() throws ConfigurationException, TemplateException, IOException {
-
- PDFDocument doc = new PDFDocument(PDFPaperSize.A4);
- doc.addFont("helv12", new PDFFont("Helvetica", 12, 2));
-
- PDFTableContent userList = new PDFTableContent(doc, doc.getFontByAlias("helv12"), 40F, 692F);
- userList.addColumn(50, 300);
- userList.addListRow("users", "user")
- .setCellValue("${user.firstName}")
- .setCellValue("${user.lastName}");
- doc.addContent(userList);
-
- // System.out.println ("*******");
- // System.out.println (doc.toJson());
- String jsonString = doc.getTemplateString();
- String fileName = System.getProperty("java.io.tmpdir") + "/users.ftlh";
- File file = new File(fileName);
- FileUtils.writeStringToFile(file, jsonString, "UTF-8");
-
- System.out.println("*******");
- System.out.println(jsonString);
- System.out.println("*******");
-
- Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
- cfg.setDirectoryForTemplateLoading(new File(System.getProperty("java.io.tmpdir")));
- cfg.setDefaultEncoding("UTF-8");
- Template template = cfg.getTemplate("users.ftlh");
- PDFTemplate pdfDoc = new PDFTemplate(template);
- List users = new LinkedList<>();
- users.add(new User("John", "Doe"));
- users.add(new User("Jane", "Roe"));
- pdfDoc.addToDatamodel("users", users);
- fileName = System.getProperty("java.io.tmpdir") + "/users.pdf";
- pdfDoc.create(fileName);
-
- }
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/test/PDFDocumentTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/test/PDFDocumentTest.java
deleted file mode 100644
index fafe603..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/test/PDFDocumentTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf.test;
-
-import de.muehlencord.shared.pdf.ConfigurationException;
-import de.muehlencord.shared.pdf.Invoice;
-import de.muehlencord.shared.pdf.InvoiceLine;
-import de.muehlencord.shared.pdf.PDFDocument;
-import de.muehlencord.shared.pdf.PDFFont;
-import de.muehlencord.shared.pdf.PDFImageContent;
-import de.muehlencord.shared.pdf.PDFPaperSize;
-import de.muehlencord.shared.pdf.PDFTableContent;
-import de.muehlencord.shared.pdf.PDFTemplate;
-import de.muehlencord.shared.pdf.PDFTextAlignment;
-import de.muehlencord.shared.pdf.PDFTextContent;
-import de.muehlencord.shared.pdf.TemplateException;
-import de.muehlencord.shared.pdf.util.ImageUtil;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateExceptionHandler;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.Date;
-import javax.imageio.ImageIO;
-import org.apache.commons.io.FileUtils;
-import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestMethodOrder;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-@TestMethodOrder(OrderAnnotation.class)
-public class PDFDocumentTest {
-
- private String jsonString = null;
-
- @Test
- public void testToJson() throws FileNotFoundException, IOException, ConfigurationException, TemplateException, URISyntaxException {
- System.out.println("testToJson");
- PDFDocument doc = new PDFDocument(PDFPaperSize.A4);
- doc.addFont("bold", new PDFFont("Helvetica-Bold", 12, 2));
- doc.addFont("helv12", new PDFFont("Helvetica", 12, 2));
-
- PDFTextContent addressContent = new PDFTextContent(doc, 40F, 692F, "Max Mustermann")
- .addLine("Musterstraße 123")
- .addLine("12345 Musterhausen");
- doc.addContent(addressContent);
-
- PDFImageContent logoContent = new PDFImageContent(doc, 400F, 700F, 0.6F, "${invoice.logo}");
- doc.addContent(logoContent);
-
- PDFTextContent informationContent = new PDFTextContent(doc, 400F, 662F);
- informationContent.addLine("Anzeigenabrechnung", "bold");
- informationContent.addLine("Veronika Mühlencord", "helv12");
- informationContent.addLine("Telefon: 05257/940154", "helv12");
- informationContent.addLine("Telefax: 05257/940156", "helv12");
- informationContent.addLine();
- informationContent.addLine("Hövelhof, den ${invoice.invoiceDate?date}", "bold");
- doc.addContent(informationContent);
-
- PDFTableContent informationContent2 = new PDFTableContent(doc, doc.getStandardFont());
- informationContent2.addColumn(100, 100)
- .addRow("Kunden-Nr", "${invoice.customerNumber}")
- .addRow("Rechnungs-Nr.:", "${invoice.invoiceNumber}")
- .addRow("Ausgabe: ", "Dezember")
- .addRow("Rechnungsdatum:", "${invoice.invoiceDate?date}");
- doc.addContent(informationContent2);
-
- PDFTextContent invoiceInfoInformation = new PDFTextContent(doc, 40F, 442F, "Sehr geehrter Anzeigenkunde, ")
- .addLine()
- .addLine()
- .addLine("Wir danken für den Auftrag und bitten um Erledigung der folgenden Anzeigenabrechnung")
- .addLine();
- doc.addContent(invoiceInfoInformation);
-
- PDFTableContent invoiceLines = new PDFTableContent(doc, doc.getFontByAlias("bold"));
- invoiceLines.addColumn(50, 300, 80, 80);
- invoiceLines.addRow()
- .setCellValue("Menge", "bold", 10F)
- .setCellValue("Beschreibung", "bold", 10F)
- .setCellValue("Einzelpreis", "bold", PDFTextAlignment.RIGHT)
- .setCellValue("Summe", "bold", PDFTextAlignment.RIGHT);
- invoiceLines.addRow()
- .setCellValue("1000", PDFTextAlignment.RIGHT, 5F)
- .setCellValue("Anzeige Hövelhofer Rundschau")
- .setCellValue("10,00 €", PDFTextAlignment.RIGHT)
- .setCellValue("10,00 €", PDFTextAlignment.RIGHT);
- invoiceLines.addListRow("invoice.invoiceLines", "invoiceline")
- .setCellValue("${invoiceline.amount}", PDFTextAlignment.RIGHT, 5F)
- .setCellValue("${invoiceline.description}")
- .setCellValue("${invoiceline.price}", PDFTextAlignment.RIGHT)
- .setCellValue("${invoiceline.total}", PDFTextAlignment.RIGHT);
- invoiceLines.addRow()
- .setCellValue("2", PDFTextAlignment.RIGHT, 5F)
- .setCellValue("Anzeige Hövelhofer Rundschau")
- .setCellValue("10,00 €", PDFTextAlignment.RIGHT)
- .setCellValue("20,00 €", PDFTextAlignment.RIGHT);
- doc.addContent(invoiceLines);
-
- PDFTextContent test = new PDFTextContent(doc)
- .addLine("Das ist ein Test");
- doc.addContent(test);
-
- jsonString = doc.getTemplateString();
-
- String fileName = System.getProperty("java.io.tmpdir") + "/test.ftlh";
- File file = new File(fileName);
- FileUtils.writeStringToFile(file, jsonString, "UTF-8");
-
- // create pdf
- Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
- cfg.setDirectoryForTemplateLoading(new File(System.getProperty("java.io.tmpdir")));
- cfg.setDefaultEncoding("UTF-8");
- cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
- cfg.setLogTemplateExceptions(false);
-
- Template template = cfg.getTemplate("test.ftlh");
- PDFTemplate pdfDoc = new PDFTemplate(template);
-
- Invoice invoice = new Invoice();
- invoice.setInvoiceDate(new Date());
- invoice.setCustomerNumber("8755");
- invoice.setInvoiceNumber("1234567");
- invoice.addInvoiceLine(new InvoiceLine("Product 1", "10,00 €", "1", "10,00 €"));
- invoice.addInvoiceLine(new InvoiceLine("Product 2", "5,00 €", "10", "50,00 €"));
- invoice.addInvoiceLine(new InvoiceLine("Product 3", "100,00 €", "20", "2000,00 €"));
-
- URL urlLogo = PDFDocumentTest.class.getResource("logo-verkehrsverein-hoevelh.jpg");
- File imageFile = new File (urlLogo.toURI());
- BufferedImage image = ImageIO.read(imageFile);
- invoice.setLogo(ImageUtil.getEncodedString(image));
-
- pdfDoc.addToDatamodel("invoice", invoice);
-
- fileName = System.getProperty("java.io.tmpdir") + "/test.pdf";
- pdfDoc.create(fileName);
- }
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/test/User.java b/pdf/src/test/java/de/muehlencord/shared/pdf/test/User.java
deleted file mode 100644
index 47e6e72..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/test/User.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf.test;
-
-import com.google.gson.annotations.Expose;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class User {
-
- @Expose
- private final String firstName;
-
- @Expose
- private final String lastName;
-
- public User(String firstName, String lastName) {
- this.firstName = firstName;
- this.lastName = lastName;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
-
-
-}
diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/util/ImageUtilTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/util/ImageUtilTest.java
deleted file mode 100644
index f1a85d0..0000000
--- a/pdf/src/test/java/de/muehlencord/shared/pdf/util/ImageUtilTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.muehlencord.shared.pdf.util;
-
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import javax.imageio.ImageIO;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-/**
- *
- * @author Joern Muehlencord (joern@muehlencord.de)
- */
-public class ImageUtilTest {
-
- public ImageUtilTest() {
- }
-
- @Test
- public void testFromBase64() throws IOException {
- System.out.println ("testFromFile");
- // 208x123
- // String base64CodedString = "iVBORw0KGgoAAAANSUhEUgAAANAAAAB7CAYAAAAFfw5ZAAAgkElEQVR42u2dB3wdxZ3HbUIuXEg5wkEad0eSu3AhFzgS0i4c5FJIjKkxJUAAU0yzMSYYDKYZDHJvuFe5V7khV7nbcpd7t2xsy5Z7katsWdbcfOe9fW92376++9Tm7898JFlPu7Oz85v519/UEUaMGElZ6pghMGLEAMiIEQMgI0YMgIwYMQAyYsSIAZARIwZARowYABkxYgBkxIgRAyAjRgyAjBgxADJixADIiBEDICNGjBgAGTFiAGTEiAGQESO1CkBnz5eJCflbxdhFWxJuk5ZsE3PW7harCg+IoiOnxLkLF8Ul+S9d4ToTF28TY+Q9aFNWFIqL5eWunz14/ExSfU6lHT9zLuK+izYWpXw9xm3uut1i/e5D4mjJWVF+6ZLnL5b3cPrsBbF8W7HoObVAvNRjuvjz+6PFr5oNET9tmi1+0Wyw+P1bI0XDTlNEmzFLRF7B5+LA8dMpv71L8hlmyGtYz8j7O3uhzLeJu3DDnqTGfLyc29MLdoolW/aJwv3HxYkzparPngFo/a5D4tuPfyq+cHfbhNsX72knvvxAB3H1X7uKG57vK+77cJz4eFS+fLgicab0gqioqEipU9v2HRP/+lTP0H1ubjJQHDpxxvWzny3brvqQTL+Taf/0UGeRv2mv7Z4Xyy+JR9tNSvmagXHrKL75WDdx66vZokmvmWLikq3i1LnzokJUpPVCGfPio6dErymrxN2txop/lu+m7l1tRJ16WaIOX92a/N2Vsj+3SmC9N3SBKNi+P+l3V3LmvPjN60NDz/jdJ7qLTXuO+AKesovl4qGsCUmN+eX3tBVX3N9BfK1BJ/EvT/ZQfX2ld54YNX+T2HvkZMpz1Qagax7tGn2QE23yZVz1cBdx/0c5Ysjs9eLk2fNJdw4Afedv3UPX/PFL/WMC6B/ubZd+v6O0rzTo6Aqgh7ImencfOWb/KF/ug59MEFOWF6b8MplYA2euFXe0GC4uq596X77/TC/x3rAFYtfBkqQA9MvXBoeuw+LgJ4AeaD3ek3FnMbvllYHig+ELxcbdh5Me+5gAuqx+25itbv3gyhZldWNis1JMW7kjqY6lBSDZl0zsQE4Afene9gk3rlvnLpdxC07eARIEyYwXn2XMGvecqa7vfA/sQN+Qi9qPXugnfv33IeK25kPVV35msXPdoeTPf35vtFKfE+lLZQMo3lylWc/lOl/l/93ceKDoPHG51AQupA8gVDLUgCGzN0Rp60W/6WtE1pjF4sXu09Wq9y2pAtaJeBlZ4ntP9xKdJixPeFKkDCB53/99Y5gYKbflsQs3e9S2iBOnS2MC6Ct/6Sg+Gb1YTrYdcVuu3GFGL9gsOo5fJp7qlCt+2KhPxAtFfc2Rensi6hxjij2Auma7jvyeft0nNYFPJ68Uy7cWi/3HTotTUiM4LScIX4vlz8ukTdBl0gr196jCzmvQv+xZ6+K+u8oE0BX3txfNB8yJMVc3iEF560TXiSvEGwPniPtb54gbGvUNzptIMD3dZYrCQ1oAYoVC/UrIgJSDi/6+escB0X7cUvEbucI5O8Zu9b5UCy4lAKJ0dqBH2k5SE9xPcQPQoo17kzRWhHIebCk6Kt4ePE/tdM7V/8jJs3HBs1QC4P/eGhEx8e/7aJwC4ZnSsrjX4I0AqtELNon6H4yNAPS/NewZF0SVCSDU31lrdiU05siFsnKx+1CJGDlvo3i8/WTx9Qc7R4zfH98ZJeav350ZAOk95N8+acS2HbtE/ODZ3hEdQ9eMt5rVCgA5JnE3uUugj4fV3/YiJ39LzLHad+SUUpH1MeYa7wyZLw6XnE2+H/Lf/mOnxFvZ88QXLJUn2G58sZ+Ytfrz6g2giHEX4nzZRTFh8VZxT6txEXP1Dy1HirU7D2YSQPZJge3zW6na6R3jYftMXR1zYtQ2AAVc92XKiRAaK/n1zYFzo44T/99i0Fzb2DIO7aQGkKoTQr/2x1IltYFI7Wo5Ud9DdQSQvnAUHS4Rr/efHQGiJzvmymcrzTyArBcxf/2eCBDd3HiAcpUaANmFXaiu5T2r10Y83GaimixumgjPjWNAf9nvD1uYNnj0d4fK7bRnowG0OgMoHMuqEO8OjXxm7NVo4+orgKwXQQBLGcvay27aJ0912AAoPE6Tl24XX7qvfWiMmCRuACLo/Vf5nIDM+uzDsj/HT5d6+pw4Tx5pO9E2of67yUBRWHysRgIIYc4/3XmK7Zn/S86/aE4F3wFkTY4OOctsOjVBWwxgN09TbQUQQb3LNTvomS5TXZ+FWBH3tD5HsHR6kqGCRCVP2j0h72qwdXbxqNYUACErtu1XNp/Ndo+yu2cEQAgu1NvfGO5QORa4dqq2AqilNP51G4hFxzk+eDGJoOufa9g5V5RFSXXyQq15qceMsFc16CE85ZgbNQlAjHnrUfm2XehnTQepOVxpAArvQuFOEbNxUztqI4C27D0qfv5qduia18hdZfHmva4L0U0vDwgHcKXKN2bhZl92n9COtyJyxysoPFBjAYRs2H1YXN+wZzjWJMcZFbvSAISs2nFAXCsH1rrH1Y90cXUm1DYAkcRJMDq84mWJl3vOcH2OBRv2iK826GQLeO85fNLX5yUepYObqD6BSR20NQ1A3IN8R32nx8FQqQDCHch1rXuQ0kLwzrl61gYA8cznzpeJvFWfBx0C4RdFYJSgtJv0nbY6kHoTbCTwEsvwUwj4Ptt1qg3gbw6aW6MBxLPhfXO68S84nDoZBVC5nHiPtZ9s0y1xiwqvACSve/ubw5VKk5O/Na3Gdh1tYroBCJ2Zv4nXJi7ZJobO2aCSNYn6X/1IVxt4sC8odXBTyZSdNHie7fPN+s7yVX2z7st70ifTo+0m2xaqmgYgggU4a0Je0aAddPz0ucoDEC/i7/1m217EGy7BwvSysbOUJyvddv3TvURh8fGEAKQyAGQfEmry2iqZ1BGw+9qDnVQGwM79x6MCAoP+uW7TbH+XNWaJEP7iR/Vn2NwNwSTYwL3/9O5otYPWXAAJlT+op1j9sFHfCEdCRgGEvDNkgW2y41HyFkDetOue7JEUgNJt1Kk0lnYPq16snU/t4NrfdZm4QmRCxi/eGk41Cu70p0sv1GgArd15SDlMrPv8x3N9VK1V5e1AsrUYZFdB/t5/tucA4kWn276X5A7EVp9oI8+NAq+IzHX5PQ4CsoHxwDnHBVvkKYJ82ueVCuyzEKsbs2BzuM+ykSd2tobvQFRaf+ORLtoOBIAqcQeKUEHkDkQFa4WHNtAdcmUct2iLmCBtjXRabpydwGkDtRm7RExbuTOBtkPkLitUQVOM1EZyPNCtla5dL5zGc0uTgWKYtJX0seH7Zv1m2QBEGr/fOhwA6plboDkvslSaUc22gYSiK7iSEg8tC+OII0k3owBCZ77zndE2L9xQxySpTW5snptFhWfDxvjze2Nsu/OPXugrJ8bnofHha/ucpbbPNPhkfIRnyA8bCKDqwH3doTnURC9c/xlrwoV4stWT78fJ85BRAGEgf/+Z3qF7UIexeNNepxOu1mYioDJSZKerdcQi9JqeCbotEszTcouQe73w1dPATcIrxZQ1HUCNe820ue4xNyotDkSHqGLVXz5qCqw6Tqmt2diM0ZqdB8WNL4TzsL7+UGeV0W7JZjkpIeywfv9lOXncIuReCnNDvydZ4Mu2FjtifDULQAS3f/rKoJBajWd2xNyNlQeg0gsXIwKG0WIYtRVA9pXP7mmzxondgGpTXZ16sccMX6ix7AHF8EqMA8FZI1PTcuHItPiiNq9wIOzYf7xyAESH8OLo+VS4bTGohQFQhEBsoXv4sD9CC438CseB/nvGal6U4Gu6QtUrOYv6wudWE1STAMRcI86lP3PT3nmudAQZARCAuNPRIeIZeiDOACgs7Dg6QKid0icsttJNjQfYvJlkZEcbz3QWvqzRi202GUw+bsCoKQBSmdgj7ZnYlHNEyw7xHUAHpIH7nC2PKjC4U1fsiMo6U9tVuCa9Z9pUJmfZB99/4pjYGPaxKieTd10HxhaGIF1dZHLV1IrUgOq21k7vRraMrgFkCkDc8PMDJ8Rz3aZGBAtbjVhkOBGiCCw9N6vdJSvk6lfxIMfnYNMkb04fWwz97Lx1HoCoQqmEt79pV93wxHFfN6nuAGLMBsxYoxiI9N0fdp6te49G/TvPAaR4eWRnqCFRxq4DPETZj506F1flq40AgloKdU0fM4gWNxcdcR1nElOvb9jL9sKhrYVbIdUx4N0xpja7RzYYlvj/aOCsrgDieXAOkCFDPqI+lv/5fF+lKYkYC5InAOL6dITPQ30E1/O1j3ZzYTj5TO1KidhMtQVAVjCVxEWyEpxj1mJQbGYeyC/1+iDlcpW7FlWkXFPxvsXZkdT7C9KRQTQfKCSz2wADZqyt9rxwAQ68CrX8cA12Fgg//+f1oRFceCwYhF3ijV1UAEF6Tj7W+l2HozZiFsQoUDHekgj+3dsjxFUPd47oDPo5L3TXwRMJDVA6AKJmgxfHNbxqzoXEDUCk5uw5dDKhBqnfdnldJjgv6YXu01XunRM8d8ZRH6xJ0UHaPirp0fH3TILX+89RvAbwxDFpLEDRcH0z8cn5ghDztubDIt4dSbW9p65KiZmUUxFizZ9EG2qtfn83APWUC0msa6z7/JBYtqVYzReyOSjHULyFLvmI7L7s7omowtG5seWF+PkauZO4t66qloXJE07Pj+RXJlKOVymZoq90AESg9tvyb71q9KO/XH1jAYiYDbozWRaJNMCCvUKq/OXO0gaN1C9R1zSfgVT+J3Kc3K6FakJQEBJGst/hm6Os5AmpEcAi+02rStgxkcjRI8UoFW5sxiT2/Em83fvhONsi5saNzQISa67yezJfdNYje0Z8lqI2pjKYYsZE7UjvT2fQdHd4iFndqvPpDLTunxXEBpAnLbAAcVQMdtAGuWomc9QJY8yZRU92ylUrcrTTCCJaxGcCO+rzn05T7DSJvrsIAHnYnOaEl6czWBnwDT4er6qjk80r9ABAWUpFA73ozhB3d520IqWjImodgIInSZCuww7BrjBb6vKoVqmNXaBMHHWSbOkItS5OX9iJ/tbhM5Vvl+xEqjYAqhcouGRsuC5BangLUz3PKgQgTpiDU5ktPtFGct1HI/NV1irOA7wZpOyk60YlDwmWTes+8GzzgtwE3ZZ+JNPvZJvKRdOeCQCR6pHONXEOENEfMW+j4sc7KBeIioA3xhNDm1P+uG77nGUKTBzdgdpIfQuqI1/5mRR9UqzgeoPgBVU7lfdHwmtnqar7Mf4syHrtEQDiCJhkrsGuTjEnHkoWCNQ0vMHpztU6EV6KFJvXkuj10+lzOs/n2bWFv8I92E1wIuC4WLPjoFLN+MrPunPB63dWVcffSzGHDBsxYgBkxIgBkBEjBkBGjBgAGTFiJDkAlZ06LYqnzzHNNNOitNIjR6MD6MiyAjH5hl+L8dfdbJpppjnaxOt/JvbmzowNoInfu1XkXHujaaaZ5mjjv3OTBFBedACVbCsUq5q3EstfbmGaaaY52sqmLcXRgrWxnQgV5eWmmWZatBaLE8GIESPGjW3EiAGQESMGQEaMGAD5K+lklvtfCFBTJUCqAZFJmTSMz5eVq6/8bP2u0l5qNRi5qAC6KAdxxbZiVStCg5jD69oJCpis69MonHO7BxSqK7eHP1fgKAvne46F16+1dudBT/vLtSi60u+xQzt+kQmn9zGRxnNQqVt0+KSqsLykHVvi90JFzU9h8TExaek2xbzz/KfTxYOfTFB8A3ylhBuyRk6ig8jkggRWKr2iviiZMdEb40ll9K6DJYp7+1IS4+KcM360Uy4sVbaSbo6wo1qR9otm2WLuWm/5lmGggdnfukfnKMcTwlpzS5NBoc/96rUhCmz65KYK1vo97QfP9HY98TtV8MA0RIm6dX3KnUfO3xi6PvRcVHnqfYjXrpLPznX+/dneivkFAgvIQDhxwQ8qLvp6Qk5ESryf7JiryEw4Hc+VDyH4fxCqQ5DyWLtJ6uwmDpRKZrfvPXV1UmPibJRacz4tVFMv95yhKnah24r3XtWceWVQWveO1y8qWWMCyMnKw+q0UzHSewOigTPXicvqh19a27FLow6GonnSCO50ACGUjkMHpU8EBr2gcH/aIFoud+JfNBsc80ApAGSjvU2DE4EJCyccp+J5dVgWKzKnld/Talzw9LuspPsGwxHMnCx8qHmJiJP4Pl2iFfoA1wL8bUdPno0JIH3OeN3gURifnwyAgoNIPblXq6OXAEJgrvn92yPDdFqQN3bKTYuSmGPMH+cgX43S9v6PcsQe2SfPAeRCPwWP+BKX81GT2XXoKzwRinDRZae54v72iiwRjYOxhUEJNiB3iq028vMd1JErqHbxdiNvAWRvD2ZNEPmb9lYjAAVbhxxvSMu9BhB9Qqd3EqC7nbua6OT7yMHMD6/dnLW7Iq7nBBAkHZx3BHGFW2s5ZL54fcAcdUbsXe+PUYdoqeNeXCY4/G59p61O+hn4PEQiTDTndWEuggPu3aELFJMRthiqEeMK4LD3hs/dqIDCCQxu/aon+w3BSqx+2QAk/watINqY2Nt8xZDD+MD5Demh4ht09OG3LYarZ4w3Z+K9j2QbJDeMWUoAgp2Sg3vTBZHXALImDacS1NX6y3OMXrA5qf7yWWwo/Vhz+NWiTWQngG6QfYx51GJFwJrnWjDfcFw6dEpMmogJWy9A8tdq+KKEn4HP4QT6Y8tREddil4ZFSNkzcWl+KxTZCIsQz6Qf9KUOcZYTeOGGoqjXce5Ab2XPS+od0FDPcdgw9n9weR6OvXRqGc4588NGfT0/+jKp403sK1BgJQlwLVctACFMyBd7TLepXZY9lGiHIYBUHMna88PgGW2iJA2gGC9l057D4m050a5xoeeNd5KFJXj2oK+yHXkiG0dzQKmcym62YMMexWbq7BP0ydE4ztMBkFsfmAuv9Ztt68Pl97RVtFaZBlDMOJATQHRGUcVqA4dn5mAUgsPKBBCC2x2DV+/vUwnaQ7gnn+48xQbAv3w8Xqk40cQrAOmThV3eSXSOmheP2J3foR7aJplUf1qnqMrqAvga6mMTHJ/X+s1ydTN7CSBLcGlD+Kj3ARDrB4pVOQDd3WqscrFe81f7rsRKmepL8RNA9Gmy1O2v1w3JBOwhdQrbmCW2l8P5PKy+sQxmrwFk9YWT0O54c7itP5AfEuOIBTzb0Rzybz8YvtCzEATvwzmBcVC4qfV+AAiBIB+7Rj/WUj/9oQoCaJxSjT4eZT8JDQ9OImz9mQaQNZlg2Kyr3YNjVsZEsYf4v5z8LeLbj39qX/Fnro2r+fkBoICpVKHOpAmdHBAEBKfWuR0kzA6LlzC8e7ZRNkKJhwdEWyruz1/NtvWJXZozjTIBIJ4TJ0h4HnZQNqQVYqmiACoXZ0vLVJRaBxGThQOCkwWR3wBCiKMQgHPGh9xI7qEFVqt9CjusXwCygI3nU5+IBGDZFZ2fI9ZzhXXiQHBlnrNml+fZDVyvz9TVyp1r3QtHhzoGRNup/QKQk48cDx1Onyq+AwWCZ5yQpk4tdpxdk+wBSpkAEMJ5Mnc6+os9pPNrw7VsO9BKfsVgTvQ+fgIIwdb83Vsjwl4wnBqOw7ZIz3HabrihL/mUGnT8dGnEPHipx3TbzugXgMolgODwrpYA4qWxXTKR9QBbI7kzQSpe1QBEf3OXb1fpPTZ7aHR+yFVqW+Hl70gDyd9UlHDait8Aoo+QquuT8dam2bZTKjitW39G7BJ1eLNPAOK6AEQPGfz4xf42Z4tfAMJhoFzamgqna0FVGkDW4OGXZ9u2ndqchKcnUwCy+svBXm72EMFXzhK1/p+DlwbPWp/UxPMbQAiBu+u0fuIoWLixKPT7CUu22o52wUY5EiPdxbM+PdHdZjNyEJjfAELd1scbu1UPbFZ5AFmTsuXg+Tb7gsCjOkU6gcmXSQBZerM6Ml7r740v9lNJoHr6z7tD5ie9amcCQKiZumuelZ9FzHoX7Ki6+vZs16mujgYvhXN0AulT4fdIAqk1fn4AiGvzjvRnJcePvlQrACGHS86Iv3WYbJuUHAUYMHArqhSAEPK3bMfB65nI8it6NSn4yUomAMTEaaw7RHByDA44ObAJVHxG0wbajlvqez0O9pUKWmsLEIuqXwDiumRRqEOrNfun3/Q1tkWv2gAIISZxW/OhES5NcqqqGoCEcgsXqhICZ6YvKg95VanYDJkAEEKNjr5YPd1litplqNchVmf9/2VyUlF+kAmx5QsGd75AQZ43AFJnact3QrpTm7FL1EFg+jXJuDhxujTmnEEtJ1v/1b6z0mpvy8VhZ4yT5VMCkBU/cSZxquh0DBWicgAU6K9bmgsvPlWDO1MA4nhJffLgKUQ1RX35bYsRtmzhnEVbMlIR6nRuMLZWxr4TQGTzF8txSaThjMDji3OA5E2OYHQmk5KLt9glI9uvbGzszqVbir0FkDUpnUHLy+q3VYMbbVJWBoCsSP23tGCp1SiYm7x0e0rVTpkCkHOyEiRlshKf020Ry63re3WrbNTm6Ds5WQquAJITniJC1KlEGuUVvCd1SLJLNvgDrXMCGSIuz1jtAKR883K3ebVPnu1hmZTO4FplAYg+cJQh1Z8RJ1UHv8dIpyK0oooCiJVYH98mvWaqCRQ4aDcnFCdiR+2ZWyCE8L88nJKIkA0kG6pONBso3RopEkdx37eX9h32d7QFIgJA8m+/+0SPtBtOp2VbfQIQQrJh4EWGB/T2N4eryH9lA+jUufPKZtDTXAgAO1NSyFxIthI0EwDCUUAptg54DlwWQRvhpR4zbM9BaYTfOxCLJkWL4fedpSa3pwCS18Zmfa7bVFUNW3S4JKGSbqcTgbILYmXptO3Fx2J6NtMGEEKRFce06wPAiz966lylxoGyxiy2gQedGmBjv+kqHas36mhViwNBwvJLrbSc8marLp++KlVKAxfeRj1D2Q/BeNdtE/qExuEaB5J9ImRAxkeshjfx+oa9ItQ17pXoO6lWXji3yYoH6GotW1bFV+RWrw9AxjIR5L+xCzer/DE9XgW5hpWJoMClqSHcj0rNKgMg2cc5a3crQgu9sHFLUTh9igxlPbCNt4qAo3/qW4VYvHmv7T1fJ9WczVqf3LxweOjiNdzSyvbR5g/vqFYAyBrc1o5y6K82sNeyZAJAFh3Vbc2H2VbnDx2FaWT3NuycG2kPFR2pEgCir80dNT7QT1GtaQlu3p+8PMCX8vtofaLAT1ff2CnOXSiLCaBUnxctgYUwkeep9gBCTpdeUHqrPgjkSrFSZgpAJ0PFceGVDJIQyEKcAk+bzVWahD3kdzY2xCKQfehxnn7TV0fw41H3r6upZJ7vOVziy2QhHvKzpmH7EQ9sj9wCW5/SiQNRVXvfR3Z7moUQR1CtABBCeTKGur6yQ6Kxbd+xjNQD2QOPWeLWV7PFsq37otYDodbpPAiJ2kN+AohdxrkQ4Ul0q5CdJRenqx7ubM9PHJnvSzlDq+ELIzJQnKXdaXEiyH+z1+ySi24/2/PgCDoVp76pxgAIIRB2gy1zO0t5jCjE87Mi1Wn3YD/Ey9Pjdx/a1JI2auWPZw/5VlCHKjwq32afUZ7dJwq5CbvlM13sYCPZM1ooIdU+TZLXs2UEyPu107xvXgDIulevKasCBJBarImq4VjvsUYByCq+onpVH3BKk/0AEPcLkYLUSz5JFG/XYw4uOHbRLTHsIT8ARBYHJehfus8+bmRMnI1RNoIXlCCk/je3yR2LLOl0dyL+nuuoWJo2PqQRub0TL1J5yLd7TVdNLXsoBjNUjQKQNfBUdzrTZ/SfvQJQwCFgLyx7OGuCOFSSOAEKjEO3OuJDJHKWRbGHvASQxcxDQFLfeegDRXVrdh6M+/e4tOs6YinE49KpD+LvZq7aGcHRQIwGFtUKn0hFuC721j3k+mn2HfbQ6ij2UI0DEEJV5WPtJ0WllfWKF45VW7d72OlUcVySvHBD56xXSYi6kdxl4nJveOFc7keADv4zbC5FJezkYJMTd65WaxNLOBygmWPV5nt2JosWN2GOORHg1O42aYUigHSWrzgzob0GkDU+Mwp2ihsa2U2BZ7CHHDwMNRZAFtmfTgbhJYAsToBrNbuHAq+BM9emzEz6zpD5EfZQrrSH4jGTAiB2CvoZreEEILJNMiTk+AQRQ1W+9SJZQOet25NU/7k+1MBuC9ad745SdhQre+DkhYpQTEw1+Q97iswS+lb/gzE2ddviZegmAZIwM6kHvHDdP1up0nns8aFIe6hGAsgSkjn1ClAvAMQAQpzotHtaDJqblt5PybSNTFB+/dO7kfaQGzc2/YzV2A0w8ElQJPHWpq4F70VZNqocXstUhOyPloPn2SuHNSJ7+tDg4/GqhqenNNazZ60TPXNXqYWDOBMTT01Yx04GxfGgvPgLk9f1QOzSTR35lthDTkqtGg0gi37XSwBBtvdUJ3sg9IHW41VwMV1ZtLFI3NJkYER8SLeHPCWXl9e/Uu6cDeQEZmJcSrOqlPHOzlsXQdLoTKitG8ygr+tMstV4LygZh1AzHie2XwBC2LXZkZ1ufQLmtQJAaiUpj1xJUgVQyNWr2T2skHPX7fbsfCDUQCZ1uFTDbg+lBCBrktYLOFTYbW56eYDKsMZtDseaV/EbrsOBWowTeYqKjsoNJC5HivAZVOG7Pxirdqhk+uVXSXdEUWTQHrJ46SodQIXSmIVlh1WQ1j5nmSJW9DIQx6QjXcO6x4QosQqKqwCb9Tloa49oZdesSMSVrN8/1m6ycgB4fUIdaTHWPWhwZXN6Gnlq2BtNeufZfh+voSI92fEzpWbCI0BtCy/5UtAO8UO4LhF+chWxucgkQAW6Uqp4HKZFjAm3OWlXqNkUrDHp8d7h3Uw2ljRFTvQHtWfmgCyvngPbDG44fUzVSQ2yi/sdc4bjXVIp1U8ZQJYnR29+iH79WKpKvL5koq/0L9Z9nL9LtFWWlMt7H5WTasPuQ2Le+t1i8rJtIid/q5i2slAs3rxPbJeLaMnZUk/fcbnHzxtrPCtjnM0p3UaMGAAZMWIAZMSIAZARIwZARowYMQAyYsQAyIgRAyAjRgyAjBgxYgBkxIgBkBEjBkBGjBgAGTFiAGTEiBEDICNGDICMGDEAMmLEAMiIESOx5f8BkaZKoLP2OTsAAAAASUVORK5C";
- // 100x59
- // String base64CodedString = "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";
- // 208x123, transparent background
- // String base64CodedString ="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";
- String base64CodedString = "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";
- BufferedImage img = ImageUtil.getImageFromEncodedString(base64CodedString);
- File outputfile = new File("c:/temp/image.png");
- ImageIO.write(img, "png", outputfile);
- }
-
- @Test
- @Disabled
- public void testFromFile() throws IOException {
- System.out.println ("testFromFile");
- BufferedImage img = ImageIO.read(new File ("c:/temp/dn_logo_smartteller_transparent.png"));
- System.out.println (ImageUtil.getEncodedString(img));
- }
-
-
-}
diff --git a/pdf/src/test/resources/de/muehlencord/shared/pdf/logo-verkehrsverein-hoevelh.jpg b/pdf/src/test/resources/de/muehlencord/shared/pdf/logo-verkehrsverein-hoevelh.jpg
deleted file mode 100644
index ee9295c..0000000
Binary files a/pdf/src/test/resources/de/muehlencord/shared/pdf/logo-verkehrsverein-hoevelh.jpg and /dev/null differ
diff --git a/pdf/src/test/resources/de/muehlencord/shared/pdf/test/logo-verkehrsverein-hoevelh.jpg b/pdf/src/test/resources/de/muehlencord/shared/pdf/test/logo-verkehrsverein-hoevelh.jpg
deleted file mode 100644
index ee9295c..0000000
Binary files a/pdf/src/test/resources/de/muehlencord/shared/pdf/test/logo-verkehrsverein-hoevelh.jpg and /dev/null differ
diff --git a/pdf/src/test/resources/log4j.xml b/pdf/src/test/resources/log4j.xml
deleted file mode 100644
index 36d9a36..0000000
--- a/pdf/src/test/resources/log4j.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pom.xml b/pom.xml
index fedc3d1..04f2060 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,6 @@ limitations under the License.
network
util
jeeutil
- pdf
shiro-faces
poi-util
db
@@ -202,18 +201,7 @@ limitations under the License.
hibernate-core
5.3.10.Final
jar
-
-
-
- org.apache.pdfbox
- pdfbox
- 2.0.16
-
-
- org.freemarker
- freemarker
- 2.3.29
-
+
org.primefaces
primefaces