From c90a47c619f32ff5058d5c6b20efc563aaaf02c9 Mon Sep 17 00:00:00 2001 From: "Matteo Franci a.k.a. Fugerit" Date: Sat, 3 Feb 2024 18:31:35 +0100 Subject: [PATCH 1/6] Added module openpdf-ext and openrtf-ext #111 --- fj-doc-mod-opencsv/README.md | 2 +- fj-doc-mod-opencsv/pom.xml | 2 +- fj-doc-mod-openpdf-ext/README.md | 22 + fj-doc-mod-openpdf-ext/pom.xml | 61 +++ .../doc/mod/openpdf/ext/HtmlTypeHandler.java | 52 ++ .../doc/mod/openpdf/ext/PdfTypeHandler.java | 70 +++ .../mod/openpdf/ext/helpers/CellParent.java | 21 + .../openpdf/ext/helpers/DocumentParent.java | 21 + .../ext/helpers/OpenPDFConfigHelper.java | 31 ++ .../ext/helpers/OpenPdfDocTableHelper.java | 198 ++++++++ .../ext/helpers/OpenPdfFontHelper.java | 81 ++++ .../openpdf/ext/helpers/OpenPdfHelper.java | 63 +++ .../ext/helpers/OpenPpfDocHandler.java | 459 ++++++++++++++++++ .../openpdf/ext/helpers/ParentElement.java | 9 + .../mod/openpdf/ext/helpers/PdfHelper.java | 143 ++++++ .../mod/openpdf/ext/helpers/PhraseParent.java | 21 + .../java/doc/mod/openpdf/ext/PocIndex.java | 99 ++++ .../doc/mod/openpdf/ext/TestDefaultDoc.java | 53 ++ .../java/doc/mod/openpdf/ext/TestDocBase.java | 42 ++ .../mod/openpdf/ext/TestOpenPdfHelper.java | 19 + .../doc/mod/openpdf/ext/TestPdfHelper.java | 40 ++ .../doc/mod/openpdf/ext/TestPhraseParent.java | 22 + .../java/doc/mod/openpdf/ext/TestSpec.java | 17 + .../resources/fm-test-mod-openpdf-config.xml | 18 + .../test/resources/font/TitilliumWeb-Bold.ttf | Bin 0 -> 53896 bytes .../font/TitilliumWeb-BoldItalic.ttf | Bin 0 -> 62924 bytes .../resources/font/TitilliumWeb-Italic.ttf | Bin 0 -> 65284 bytes .../resources/font/TitilliumWeb-Regular.ttf | Bin 0 -> 57392 bytes .../src/test/resources/log4j2.xml | 13 + .../src/test/resources/test/img_test_teal.jpg | Bin 0 -> 10632 bytes .../src/test/resources/xml/default_doc.xml | 58 +++ .../test/resources/xml/default_doc_alt.xml | 61 +++ .../test/resources/xml/default_doc_fail1.xml | 58 +++ .../src/test/resources/xml/test.xml | 44 ++ fj-doc-mod-openrtf-ext/README.md | 31 ++ fj-doc-mod-openrtf-ext/pom.xml | 66 +++ .../doc/mod/openrtf/ext/RtfTypeHandler.java | 58 +++ .../ext/helpers/OpenRtfDocHandler.java | 64 +++ .../doc/mod/openrtf/ext/TestDefaultDoc.java | 65 +++ .../java/doc/mod/openrtf/ext/TestDocBase.java | 42 ++ .../resources/fm-test-mod-openpdf-config.xml | 21 + .../test/resources/font/TitilliumWeb-Bold.ttf | Bin 0 -> 53896 bytes .../font/TitilliumWeb-BoldItalic.ttf | Bin 0 -> 62924 bytes .../resources/font/TitilliumWeb-Italic.ttf | Bin 0 -> 65284 bytes .../resources/font/TitilliumWeb-Regular.ttf | Bin 0 -> 57392 bytes .../src/test/resources/log4j2.xml | 13 + .../src/test/resources/test/img_test_teal.jpg | Bin 0 -> 10632 bytes .../src/test/resources/xml/default_doc.xml | 58 +++ .../test/resources/xml/default_doc_alt.xml | 61 +++ .../test/resources/xml/default_doc_fail1.xml | 58 +++ .../src/test/resources/xml/test.xml | 44 ++ pom.xml | 14 + 52 files changed, 2393 insertions(+), 2 deletions(-) create mode 100644 fj-doc-mod-openpdf-ext/README.md create mode 100644 fj-doc-mod-openpdf-ext/pom.xml create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/CellParent.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/DocumentParent.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfHelper.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PdfHelper.java create mode 100644 fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestOpenPdfHelper.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPdfHelper.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPhraseParent.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestSpec.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Bold.ttf create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-BoldItalic.ttf create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Italic.ttf create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Regular.ttf create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/log4j2.xml create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/test/img_test_teal.jpg create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_fail1.xml create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/xml/test.xml create mode 100644 fj-doc-mod-openrtf-ext/README.md create mode 100644 fj-doc-mod-openrtf-ext/pom.xml create mode 100644 fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java create mode 100644 fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java create mode 100644 fj-doc-mod-openrtf-ext/src/test/java/test/org/fugerit/java/doc/mod/openrtf/ext/TestDefaultDoc.java create mode 100644 fj-doc-mod-openrtf-ext/src/test/java/test/org/fugerit/java/doc/mod/openrtf/ext/TestDocBase.java create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/fm-test-mod-openpdf-config.xml create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Bold.ttf create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-BoldItalic.ttf create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Italic.ttf create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Regular.ttf create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/log4j2.xml create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/test/img_test_teal.jpg create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc.xml create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_alt.xml create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_fail1.xml create mode 100644 fj-doc-mod-openrtf-ext/src/test/resources/xml/test.xml diff --git a/fj-doc-mod-opencsv/README.md b/fj-doc-mod-opencsv/README.md index 5b86c390f..c1007af65 100644 --- a/fj-doc-mod-opencsv/README.md +++ b/fj-doc-mod-opencsv/README.md @@ -9,7 +9,7 @@ *Status* : Basic features implemented. (Sample JUnit [TestFreeMarker01](../fj-doc-sample/src/test/java/test/org/fugerit/java/doc/sample/freemarker/TestFreeMarker01.java) is now working). -For the intrinsic limitations of the CSV format, is possible to choose a sinlge table in the document and outputs it as CSV. +For the intrinsic limitations of the CSV format, is possible to choose a single table in the document and outputs it as CSV. *Since* : fj-doc 0.6 diff --git a/fj-doc-mod-opencsv/pom.xml b/fj-doc-mod-opencsv/pom.xml index ba12aaddb..1825adb60 100644 --- a/fj-doc-mod-opencsv/pom.xml +++ b/fj-doc-mod-opencsv/pom.xml @@ -11,7 +11,7 @@ fj-doc-mod-opencsv - Rendere for CSV using OpenCSV + Renderer for CSV using OpenCSV diff --git a/fj-doc-mod-openpdf-ext/README.md b/fj-doc-mod-openpdf-ext/README.md new file mode 100644 index 000000000..e0667abea --- /dev/null +++ b/fj-doc-mod-openpdf-ext/README.md @@ -0,0 +1,22 @@ +# Fugerit Document Generation Framework (fj-doc) + +## OpenPDF Renderer (PDF)(fj-doc-mod-openpdf-ext) + +[back to fj-doc index](../README.md) + +[![Maven Central](https://img.shields.io/maven-central/v/org.fugerit.java/fj-doc-mod-openpdf-ext.svg)](https://mvnrepository.com/artifact/org.fugerit.java/fj-doc-mod-openpdf-ext) +[![javadoc](https://javadoc.io/badge2/org.fugerit.java/fj-doc-mod-openpdf-ext/javadoc.svg)](https://javadoc.io/doc/org.fugerit.java/fj-doc-mod-openpdf-ext) + +Renderer for PDF format, based on [OpenPDF](https://github.com/LibrePDF/OpenPDF). + +*Status* : +Basic features implemented. (Sample JUnit [TestFreeMarker01](../fj-doc-sample/src/test/java/test/org/fugerit/java/doc/sample/freemarker/TestFreeMarker01.java) is now working). + +*Since* : fj-doc 3.4 + +*Native support* : +Disabled, native support will be added in a future release. openpdf-ext native support must be verified. + +*Quickstart* : +Basically this is only a type handler, see core library [fj-doc-base](../fj-doc-base/README.md). +NOTE: If you have any special need you can open a pull request or create your own handler based on this. \ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/pom.xml b/fj-doc-mod-openpdf-ext/pom.xml new file mode 100644 index 000000000..bbfb4de02 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + + fj-doc-mod-openpdf-ext + + + org.fugerit.java + fj-doc + 3.3.2-SNAPSHOT + + + fj-doc-mod-openpdf-ext + Renderer for PDF format, based on https://github.com/LibrePDF/OpenPDF + + + 1.3.39 + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + com.github.librepdf + openpdf + ${openpdf-version-version} + + + + org.fugerit.java + fj-core + + + + org.fugerit.java + fj-doc-base + + + + org.fugerit.java + fj-doc-freemarker + test + + + + + + https://www.fugerit.org + Fugerit + + + https://www.fugerit.org/perm/venus/ + + diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java new file mode 100644 index 000000000..867833a06 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java @@ -0,0 +1,52 @@ +package org.fugerit.java.doc.mod.openpdf.ext; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; + +import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.base.config.DocTypeHandlerDefault; +import org.fugerit.java.doc.base.model.DocBase; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPDFConfigHelper; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; + +import com.lowagie.text.Document; +import com.lowagie.text.html.HtmlWriter; +import org.w3c.dom.Element; + +public class HtmlTypeHandler extends DocTypeHandlerDefault { + + /** + * + */ + private static final long serialVersionUID = -3491991891783269389L; + + public static final DocTypeHandler HANDLER = new HtmlTypeHandler(); + + public HtmlTypeHandler() { + super( OpenPpfDocHandler.DOC_OUTPUT_HTML, OpenPpfDocHandler.MODULE ); + } + + @Override + public void handle(DocInput docInput, DocOutput docOutput) throws Exception { + DocBase docBase = docInput.getDoc(); + OutputStream outputStream = docOutput.getOs(); + Document document = new Document( ); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + HtmlWriter.getInstance( document, baos ); + OpenPpfDocHandler handler = new OpenPpfDocHandler( document, OpenPpfDocHandler.DOC_OUTPUT_HTML ); + handler.handleDoc( docBase ); + baos.writeTo( outputStream ); + baos.close(); + outputStream.close(); + } + + @Override + protected void handleConfigTag(Element config) throws ConfigException { + super.handleConfigTag(config); + OpenPDFConfigHelper.handleConfig( config, this.getType() ); + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java new file mode 100644 index 000000000..6806ad25b --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java @@ -0,0 +1,70 @@ +package org.fugerit.java.doc.mod.openpdf.ext; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; + +import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.base.config.DocTypeHandlerDefault; +import org.fugerit.java.doc.base.model.DocBase; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPDFConfigHelper; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; + +import com.lowagie.text.Document; +import com.lowagie.text.PageSize; +import com.lowagie.text.pdf.PdfWriter; +import org.w3c.dom.Element; + +public class PdfTypeHandler extends DocTypeHandlerDefault { + + /** + * + */ + private static final long serialVersionUID = 5459938865782356227L; + + public static final DocTypeHandler HANDLER = new PdfTypeHandler(); + + public PdfTypeHandler() { + super( OpenPpfDocHandler.DOC_OUTPUT_PDF, OpenPpfDocHandler.MODULE ); + } + + @Override + public void handle(DocInput docInput, DocOutput docOutput) throws Exception { + DocBase docBase = docInput.getDoc(); + OutputStream outputStream = docOutput.getOs(); + String[] margins = docBase.getInfo().getProperty( "margins", "20;20;20;20" ).split( ";" ); + Document document = new Document( PageSize.A4, Integer.parseInt( margins[0] ), + Integer.parseInt( margins[1] ), + Integer.parseInt( margins[2] ), + Integer.parseInt( margins[3] ) ); + // allocate buffer + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // create pdf writer + PdfWriter pdfWriter = PdfWriter.getInstance( document, baos ); + // create doc handler + OpenPpfDocHandler handler = new OpenPpfDocHandler( document, pdfWriter ); + if ( "true".equalsIgnoreCase( docBase.getInfo().getProperty( "set-total-page" ) ) ) { + handler.handleDoc( docBase ); + int totalPageCount = pdfWriter.getCurrentPageNumber()-1; + document = new Document( PageSize.A4, Integer.parseInt( margins[0] ), + Integer.parseInt( margins[1] ), + Integer.parseInt( margins[2] ), + Integer.parseInt( margins[3] ) ); + baos = new ByteArrayOutputStream(); + pdfWriter = PdfWriter.getInstance( document, baos ); + handler = new OpenPpfDocHandler(document, pdfWriter, totalPageCount ); + } + handler.handleDoc( docBase ); + baos.writeTo( outputStream ); + baos.close(); + outputStream.close(); + } + + @Override + protected void handleConfigTag(Element config) throws ConfigException { + super.handleConfigTag(config); + OpenPDFConfigHelper.handleConfig( config, this.getType() ); + } +} diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/CellParent.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/CellParent.java new file mode 100644 index 000000000..eff559c19 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/CellParent.java @@ -0,0 +1,21 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import com.lowagie.text.Cell; +import com.lowagie.text.Element; + +public class CellParent implements ParentElement { + + private Cell cell; + + public CellParent( Cell cell ) { + this.cell = cell; + } + + /* (non-Javadoc) + * @see org.fugerit.java.doc.mod.itext.ParentElement#add(com.lowagie.text.Element) + */ + public void add(Element element) { + this.cell.addElement( element ); + } + +} \ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/DocumentParent.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/DocumentParent.java new file mode 100644 index 000000000..cc5af99f7 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/DocumentParent.java @@ -0,0 +1,21 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import com.lowagie.text.Document; +import com.lowagie.text.Element; + +public class DocumentParent implements ParentElement { + + private Document document; + + public DocumentParent( Document document) { + this.document = document; + } + + /* (non-Javadoc) + * @see org.fugerit.java.doc.mod.itext.ParentElement#add(com.lowagie.text.Element) + */ + public void add(Element element) { + this.document.add( element ); + } + +} \ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java new file mode 100644 index 000000000..cbd64545e --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java @@ -0,0 +1,31 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import lombok.extern.slf4j.Slf4j; +import org.fugerit.java.core.cfg.ConfigException; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +@Slf4j +public class OpenPDFConfigHelper { + + private OpenPDFConfigHelper() {} + + public static final String TAG_NAME_FONT = "font"; + + public static final String ATT_NAME = "name"; + public static final String ATT_PATH = "path"; + + + public static void handleConfig( Element config, String type ) throws ConfigException { + log.info( "configure for type: {}", type ); + NodeList fontList = config.getElementsByTagName( TAG_NAME_FONT ); + for ( int k=0; k OpenPpfDocHandler.registerFont( name , path ) ); + } + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java new file mode 100644 index 000000000..d36e99f73 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java @@ -0,0 +1,198 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import java.awt.Color; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; + +import org.fugerit.java.doc.base.model.DocBarcode; +import org.fugerit.java.doc.base.model.DocBorders; +import org.fugerit.java.doc.base.model.DocCell; +import org.fugerit.java.doc.base.model.DocElement; +import org.fugerit.java.doc.base.model.DocImage; +import org.fugerit.java.doc.base.model.DocPara; +import org.fugerit.java.doc.base.model.DocPhrase; +import org.fugerit.java.doc.base.model.DocRow; +import org.fugerit.java.doc.base.model.DocTable; +import org.fugerit.java.doc.base.xml.DocModelUtils; + +import com.lowagie.text.Cell; +import com.lowagie.text.Chunk; +import com.lowagie.text.DocumentException; +import com.lowagie.text.Element; +import com.lowagie.text.Font; +import com.lowagie.text.Paragraph; +import com.lowagie.text.Table; +import com.lowagie.text.alignment.HorizontalAlignment; +import com.lowagie.text.alignment.VerticalAlignment; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class OpenPdfDocTableHelper { + + private OpenPdfDocTableHelper() {} + + private static void handleBorderColor( DocBorders docBorders, Cell cell ) { + if ( docBorders.getBorderColorBottom() != null ) { + cell.setBorderColorBottom( DocModelUtils.parseHtmlColor( docBorders.getBorderColorBottom() ) ); + } + if ( docBorders.getBorderColorTop() != null ) { + cell.setBorderColorTop( DocModelUtils.parseHtmlColor( docBorders.getBorderColorTop() ) ); + } + if ( docBorders.getBorderColorLeft() != null ) { + cell.setBorderColorLeft( DocModelUtils.parseHtmlColor( docBorders.getBorderColorLeft() ) ); + } + if ( docBorders.getBorderColorRight() != null ) { + cell.setBorderColorRight( DocModelUtils.parseHtmlColor( docBorders.getBorderColorRight() ) ); + } + } + + private static void handleBorderWidth( DocBorders docBorders, Cell cell ) { + if ( docBorders.getBorderWidthBottom() != -1 ) { + cell.setBorderWidthBottom( docBorders.getBorderWidthBottom() ); + } + if ( docBorders.getBorderWidthTop() != -1 ) { + cell.setBorderWidthTop( docBorders.getBorderWidthTop() ); + } + if ( docBorders.getBorderWidthLeft() != -1 ) { + cell.setBorderWidthLeft( docBorders.getBorderWidthLeft() ); + } + if ( docBorders.getBorderWidthRight() != -1 ) { + cell.setBorderWidthRight( docBorders.getBorderWidthRight() ); + } + } + + private static void handleBolders( DocCell docCell, Cell cell ) { + DocBorders docBorders = docCell.getDocBorders(); + if ( docBorders != null ) { + handleBorderColor(docBorders, cell); + handleBorderWidth(docBorders, cell); + } + } + + private static void handleAligns( DocCell docCell, Cell cell ) { + if ( docCell.getAlign() != DocPara.ALIGN_UNSET ) { + Optional ha = HorizontalAlignment.of( docCell.getAlign() ); + if ( ha.isPresent() ) { + cell.setHorizontalAlignment( ha.get() ); + } + } + if ( docCell.getValign() != DocPara.ALIGN_UNSET ) { + Optional va = VerticalAlignment.of( docCell.getAlign() ); + if ( va.isPresent() ) { + cell.setVerticalAlignment( va.get() ); + } + } + } + + private static List handleContent( Table table, CellParent cellParent, DocCell docCell, Cell cell, OpenPdfHelper docHelper ) throws DocumentException, IOException { + List fontList = new ArrayList<>(); + Iterator itCurrent = docCell.docElements(); + while ( itCurrent.hasNext() ) { + DocElement docElement = itCurrent.next(); + if ( docElement instanceof DocPara ) { + DocPara docPara = (DocPara)docElement; + OpenPpfDocHandler.setStyle( docCell , docPara ); + Paragraph paragraph = OpenPpfDocHandler.createPara( docPara, docHelper, fontList ); + cellParent.add( paragraph ); + } else if ( docElement instanceof DocPhrase ) { + DocPhrase docPhrase = (DocPhrase)docElement; + log.trace( "docCell -> {}, docPara : {}", docCell, cell ); + cellParent.add( OpenPpfDocHandler.createPhrase( docPhrase, docHelper, fontList ) ); + } else if ( docElement instanceof DocTable ) { + table.insertTable( createTable( (DocTable)docElement, docHelper ) ); + } else if ( docElement instanceof DocImage ) { + cellParent.add( OpenPpfDocHandler.createImage( (DocImage)docElement ) ); + } else if ( docElement instanceof DocBarcode ) { + cellParent.add( OpenPpfDocHandler.createBarcode( (DocBarcode)docElement, docHelper ) ); + } + } + return fontList; + } + + private static boolean handleCell( Table table, DocCell docCell, boolean startHeader, DocTable docTable, OpenPdfHelper docHelper ) throws DocumentException, IOException { + OpenPpfDocHandler.setStyle( docTable, docCell ); + Cell cell = new Cell(); + if ( docCell.isHeader() ) { + cell.setHeader( true ); + startHeader = true; + } else { + if ( startHeader ) { + startHeader = false; + table.endHeaders(); + } + } + cell.setColspan( docCell.getCSpan() ); + cell.setRowspan( docCell.getRSpan() ); + + handleBolders(docCell, cell); + + if ( docCell.getBackColor() != null ) { + cell.setBackgroundColor( DocModelUtils.parseHtmlColor( docCell.getBackColor() ) ); + } + + handleAligns(docCell, cell); + + CellParent cellParent = new CellParent( cell ); + + List fontList = handleContent(table, cellParent, docCell, cell, docHelper); + + table.addCell( cell ); + List listChunk = cell.getChunks(); + if ( listChunk.size() == fontList.size() ) { + for ( int k=0; k itRow = docTable.docElements(); + while ( itRow.hasNext() ) { + DocRow docRow = (DocRow)itRow.next(); + Iterator itCell = docRow.docElements(); + while ( itCell.hasNext() ) { + DocCell docCell = (DocCell)itCell.next(); + startHeader = handleCell(table, docCell, startHeader, docTable, docHelper); + } + } + + return table; + } + + +} diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java new file mode 100644 index 000000000..bd221e6f4 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java @@ -0,0 +1,81 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import java.awt.Color; +import java.io.IOException; + +import org.fugerit.java.core.cfg.ConfigRuntimeException; +import org.fugerit.java.doc.base.model.DocPara; +import org.fugerit.java.doc.base.xml.DocModelUtils; + +import com.lowagie.text.DocumentException; +import com.lowagie.text.Font; +import com.lowagie.text.pdf.BaseFont; + +public class OpenPdfFontHelper { + + private OpenPdfFontHelper() {} + + public static BaseFont createBaseFontSafe( String name, String encoding, boolean embedded) { + BaseFont result = null; + try { + result = BaseFont.createFont(name, encoding, embedded); + } catch (DocumentException | IOException e) { + throw new ConfigRuntimeException( e ); + } + return result; + } + + private static int handleFontStyle( int style, int fontStyle ) { + if ( fontStyle == DocPara.STYLE_BOLD ) { + style = Font.BOLD; + } else if ( fontStyle == DocPara.STYLE_UNDERLINE ) { + style = Font.UNDERLINE; + } else if ( fontStyle == DocPara.STYLE_ITALIC ) { + style = Font.ITALIC; + } else if ( fontStyle == DocPara.STYLE_BOLDITALIC ) { + style = Font.BOLDITALIC; + } + return style; + } + + protected static Font createFont( String fontName, String fontPath, int fontSize, int fontStyle, OpenPdfHelper docHelper, String color ) throws DocumentException, IOException { + Font font = null; + int size = fontSize; + int style = Font.NORMAL; + BaseFont bf = null; + int bfV = -1; + if ( size == -1 ) { + size = Integer.parseInt( docHelper.getDefFontSize() ); + } + style = handleFontStyle(style, fontStyle); + if ( fontName == null ) { + fontName = docHelper.getDefFontName(); + } + if ( "helvetica".equalsIgnoreCase( fontName ) ) { + bfV = Font.HELVETICA; + } else if ( "courier".equalsIgnoreCase( fontName ) ) { + bfV = Font.COURIER; + } else if ( "times-roman".equalsIgnoreCase( fontName ) ) { + bfV = Font.TIMES_ROMAN; + } else if ( "symbol".equalsIgnoreCase( fontName ) ) { + bfV = Font.SYMBOL; + } else { + bf = OpenPpfDocHandler.findFont( fontName ); + if ( bf == null) { + bf = BaseFont.createFont( fontPath, BaseFont.CP1252, true ); + OpenPpfDocHandler.registerFont( fontName, bf ); + } + } + Color c = Color.BLACK; + if ( color != null ) { + c = DocModelUtils.parseHtmlColor( color ); + } + if ( bfV == -1 ) { + font = new Font( bf, size, style, c ); + } else { + font = new Font( bfV, size, style, c ); + } + return font; + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfHelper.java new file mode 100644 index 000000000..b45b625f5 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfHelper.java @@ -0,0 +1,63 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import java.util.Properties; + +import com.lowagie.text.pdf.PdfWriter; + +public class OpenPdfHelper { + + public OpenPdfHelper() { + this.params = new Properties(); + } + + private String defFontName; + + private String defFontSize; + + private String defFontStyle; + + private Properties params; + + public Properties getParams() { + return params; + } + + public void setParams(Properties params) { + this.params = params; + } + + public String getDefFontName() { + return defFontName; + } + + public void setDefFontName(String defFontName) { + this.defFontName = defFontName; + } + + public String getDefFontSize() { + return defFontSize; + } + + public void setDefFontSize(String defFontSize) { + this.defFontSize = defFontSize; + } + + public String getDefFontStyle() { + return defFontStyle; + } + + public void setDefFontStyle(String defFontStyle) { + this.defFontStyle = defFontStyle; + } + + private PdfWriter pdfWriter; + + public PdfWriter getPdfWriter() { + return pdfWriter; + } + + public void setPdfWriter(PdfWriter pdfWriter) { + this.pdfWriter = pdfWriter; + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java new file mode 100644 index 000000000..695d37a6d --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java @@ -0,0 +1,459 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + + +import java.awt.Color; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +import org.fugerit.java.core.cfg.ConfigRuntimeException; +import org.fugerit.java.core.lang.helpers.StringUtils; +import org.fugerit.java.core.log.LogFacade; +import org.fugerit.java.core.util.regex.ParamFinder; +import org.fugerit.java.doc.base.config.DocConfig; +import org.fugerit.java.doc.base.helper.SourceResolverHelper; +import org.fugerit.java.doc.base.model.DocBarcode; +import org.fugerit.java.doc.base.model.DocBase; +import org.fugerit.java.doc.base.model.DocElement; +import org.fugerit.java.doc.base.model.DocFooter; +import org.fugerit.java.doc.base.model.DocHeader; +import org.fugerit.java.doc.base.model.DocHeaderFooter; +import org.fugerit.java.doc.base.model.DocImage; +import org.fugerit.java.doc.base.model.DocInfo; +import org.fugerit.java.doc.base.model.DocPageBreak; +import org.fugerit.java.doc.base.model.DocPara; +import org.fugerit.java.doc.base.model.DocPhrase; +import org.fugerit.java.doc.base.model.DocStyle; +import org.fugerit.java.doc.base.model.DocTable; +import org.fugerit.java.doc.base.xml.DocModelUtils; + +import com.lowagie.text.Anchor; +import com.lowagie.text.BadElementException; +import com.lowagie.text.Chunk; +import com.lowagie.text.Document; +import com.lowagie.text.DocumentException; +import com.lowagie.text.Element; +import com.lowagie.text.Font; +import com.lowagie.text.Header; +import com.lowagie.text.HeaderFooter; +import com.lowagie.text.Image; +import com.lowagie.text.Paragraph; +import com.lowagie.text.Phrase; +import com.lowagie.text.Rectangle; +import com.lowagie.text.html.HtmlTags; +import com.lowagie.text.pdf.Barcode; +import com.lowagie.text.pdf.Barcode128; +import com.lowagie.text.pdf.BarcodeEAN; +import com.lowagie.text.pdf.BaseFont; +import com.lowagie.text.pdf.PdfArray; +import com.lowagie.text.pdf.PdfDictionary; +import com.lowagie.text.pdf.PdfName; +import com.lowagie.text.pdf.PdfString; +import com.lowagie.text.pdf.PdfWriter; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class OpenPpfDocHandler { + + private static final ParamFinder PARAM_FINDER = ParamFinder.newFinder(); + + public static final String PARAM_PAGE_CURRENT = "currentPage"; + + public static final String PARAM_PAGE_TOTAL = "totalPage"; + + public static final String PARAM_PAGE_TOTAL_FINDER = ParamFinder.DEFAULT_PRE+PARAM_PAGE_TOTAL+ParamFinder.DEFAULT_POST; + + private static HashMap fonts = new HashMap<>(); + + public static void registerFont( String name, String path ) throws DocumentException, IOException { + BaseFont font = BaseFont.createFont( path, BaseFont.CP1252, true ); + registerFont( name, font ); + } + + public static void registerFont( String name, BaseFont font ) { + fonts.put( name , font ); + } + + public static BaseFont findFont( String name ) { + return fonts.get( name ); + } + + protected static void setStyle( DocStyle parent, DocStyle current ) { + if ( current.getBackColor() == null ) { + current.setBackColor( parent.getBackColor() ); + } + if ( current.getForeColor() == null ) { + current.setForeColor( parent.getForeColor() ); + } + } + + private PdfWriter pdfWriter; + + protected Document document; + + private String docType; + + public static final String MODULE = "itext"; + + public static final String DOC_OUTPUT_HTML = DocConfig.TYPE_HTML; + + public static final String DOC_OUTPUT_PDF = DocConfig.TYPE_PDF; + + public static final String DOC_OUTPUT_RTF = DocConfig.TYPE_RTF; + + public static final String DOC_DEFAULT_FONT_NAME = "default-font-name"; + public static final String DOC_DEFAULT_FONT_SIZE = "default-font-size"; + public static final String DOC_DEFAULT_FONT_STYLE = "default-font-style"; + + private int totalPageCount; + + + public OpenPpfDocHandler( Document document, PdfWriter pdfWriter ) { + this(document, pdfWriter, -1); + } + + public OpenPpfDocHandler( Document document, PdfWriter pdfWriter, int totalPageCount ) { + this( document, DOC_OUTPUT_PDF ); + this.pdfWriter = pdfWriter; + this.totalPageCount = totalPageCount; + } + + public OpenPpfDocHandler( Document document, String docType ) { + this.document = document; + this.docType = docType; + } + + private static int getAlign( int align ) { + int r = Element.ALIGN_LEFT; + if ( align == DocPara.ALIGN_RIGHT ) { + r = Element.ALIGN_RIGHT; + } else if ( align == DocPara.ALIGN_CENTER ) { + r = Element.ALIGN_CENTER; + } else if ( align == DocPara.ALIGN_JUSTIFY ) { + r = Element.ALIGN_JUSTIFIED; + } else if ( align == DocPara.ALIGN_JUSTIFY_ALL ) { + r = Element.ALIGN_JUSTIFIED_ALL; + } + return r; + } + + + protected static Image createImage( DocImage docImage ) { + Image image = null; + String url = docImage.getUrl(); + log.trace( "currently unsupported image param url {}", url ); + try { + byte[] data = SourceResolverHelper.resolveImage( docImage ); + image = Image.getInstance( data ); + if ( docImage.getScaling() != null ) { + image.scalePercent( docImage.getScaling().floatValue() ); + } + } catch (Exception e) { + throw new ConfigRuntimeException( e ); + } + return image; + } + + + public static String createText( Properties params, String text ) { + return PARAM_FINDER.substitute( text , params ); + } + + protected static Chunk createChunk( DocPhrase docPhrase, OpenPdfHelper docHelper ) throws DocumentException, IOException { + String text = createText( docHelper.getParams(), docPhrase.getText() ); + int style = docPhrase.getStyle(); + String fontName = docPhrase.getFontName(); + Font f = createFont(fontName, docPhrase.getSize(), style, docHelper, docPhrase.getForeColor() ); + return new Chunk( text, f ); + } + + protected static Phrase createPhrase( DocPhrase docPhrase, OpenPdfHelper docHelper, List fontMap ) throws DocumentException, IOException { + String text = createText( docHelper.getParams(), docPhrase.getText() ); + int style = docPhrase.getStyle(); + String fontName = docPhrase.getFontName(); + Font f = createFont(fontName, docPhrase.getSize(), style, docHelper, docPhrase.getForeColor() ); + Phrase p = null; + if ( StringUtils.isNotEmpty( docPhrase.getLink() ) ) { + Anchor a = new Anchor( text , f ); + a.setReference( docPhrase.getLink() ); + p = a; + } else if ( StringUtils.isNotEmpty( docPhrase.getAnchor() ) ) { + Anchor a = new Anchor( text , f ); + a.setName( docPhrase.getAnchor() ); + p = a; + } else { + p = new Phrase( text, f ); + } + if (fontMap != null) { + fontMap.add( f ); + } + return p; + } + + protected static Phrase createPhrase( DocPhrase docPhrase, OpenPdfHelper docHelper ) throws DocumentException, IOException { + return createPhrase(docPhrase, docHelper, null); + } + + protected static Paragraph createPara( DocPara docPara, OpenPdfHelper docHelper ) throws DocumentException, IOException { + return createPara(docPara, docHelper, null); + } + + protected static Paragraph createPara( DocPara docPara, OpenPdfHelper docHelper, List fontMap ) throws DocumentException, IOException { + int style = docPara.getStyle(); + String text = createText( docHelper.getParams(), docPara.getText() ); + String fontName = docPara.getFontName(); + Font f = createFont(fontName, docPara.getSize(), style, docHelper, docPara.getForeColor() ); + Phrase phrase = new Phrase( text, f ); + Paragraph p = new Paragraph( new Phrase( text, f ) ); + if ( docPara.getForeColor() != null ) { + Color c = DocModelUtils.parseHtmlColor( docPara.getForeColor() ); + Font f1 = new Font( f.getFamily(), f.getSize(), f.getStyle(), c ); + p = new Paragraph( new Phrase( text, f1 ) ); + } + if ( docPara.getAlign() != DocPara.ALIGN_UNSET ) { + p.setAlignment( getAlign( docPara.getAlign() ) ); + } + if ( docPara.getLeading() != null ) { + p.setLeading( docPara.getLeading().floatValue() ); + } + if ( docPara.getSpaceBefore() != null ) { + p.setSpacingBefore( docPara.getSpaceBefore().floatValue() ); + } + if ( docPara.getSpaceAfter() != null ) { + p.setSpacingAfter( docPara.getSpaceAfter().floatValue() ); + } + p.setFont( f ); + phrase.setFont( f ); + if ( fontMap != null ) { + fontMap.add( f ); + } + return p; + } + + protected static Image createBarcode( DocBarcode docBarcode, OpenPdfHelper helper ) throws BadElementException, IOException { + log.trace( "currently unused parameter helper : {}", helper ); + Barcode barcode = null; + if ( "128".equalsIgnoreCase( docBarcode.getType() ) ) { + barcode = new Barcode128(); + } else { + barcode = new BarcodeEAN(); + } + if ( docBarcode.getSize() != -1 ) { + barcode.setBarHeight( docBarcode.getSize() ); + } + barcode.setCode( docBarcode.getText() ); + barcode.setAltText( docBarcode.getText() ); + java.awt.Image awtImage = barcode.createAwtImage( Color.white, Color.black ); + return Image.getInstance( awtImage, null ); + } + + + + public static Font createFont( String fontName, int fontSize, int fontStyle, OpenPdfHelper docHelper, String color ) throws DocumentException, IOException { + return OpenPdfFontHelper.createFont(fontName, fontName, fontSize, fontStyle, docHelper, color); + } + + private void handleTypeSpecific( Properties info ) { + // per documenti tipo HTML + if ( DOC_OUTPUT_HTML.equalsIgnoreCase( this.docType ) ) { + String cssLink = info.getProperty( DocInfo.INFO_NAME_CSS_LINK ); + if ( cssLink != null ) { + this.document.add( new Header( HtmlTags.STYLESHEET, cssLink ) ); + } + } + // per documenti tipo word o pdf + if ( DOC_OUTPUT_PDF.equalsIgnoreCase( this.docType ) || DOC_OUTPUT_RTF.equalsIgnoreCase( this.docType ) ) { + Rectangle size = this.document.getPageSize(); + String pageOrient = info.getProperty( DocInfo.INFO_NAME_PAGE_ORIENT ); + if ( "horizontal".equalsIgnoreCase( pageOrient ) ) { + size = new Rectangle( size.getHeight(), size.getWidth() ); + this.document.setPageSize( size ); + } + if ( DOC_OUTPUT_PDF.equalsIgnoreCase( this.docType ) ) { + String pdfFormat = info.getProperty( DocInfo.INFO_NAME_PDF_FORMAT ); + if ( "pdf-a".equalsIgnoreCase( pdfFormat ) ) { + this.pdfWriter.setPDFXConformance(PdfWriter.PDFA1B); + PdfDictionary outi = new PdfDictionary( PdfName.OUTPUTINTENT ); + outi.put( PdfName.OUTPUTCONDITIONIDENTIFIER, new PdfString("sRGB IEC61966-2.1") ); + outi.put( PdfName.INFO, new PdfString("sRGB IEC61966-2.1") ); + outi.put( PdfName.S, PdfName.GTS_PDFA1 ); + this.pdfWriter.getExtraCatalog().put( PdfName.OUTPUTINTENTS, new PdfArray( outi ) ); + } + + } + } + } + + protected void handleHeaderExt( DocHeader docHeader, PdfHelper pdfHelper, OpenPdfHelper docHelper ) throws DocumentException { + log.trace( "docHelper : {}", docHelper ); + pdfHelper.setDocHeader( docHeader ); + } + + protected void handleFooterExt( DocFooter docFooter, PdfHelper pdfHelper, OpenPdfHelper docHelper ) throws DocumentException { + log.trace( "docHelper : {}", docHelper ); + pdfHelper.setDocFooter( docFooter ); + } + + private void handleHeader( DocBase docBase, PdfHelper pdfHelper, OpenPdfHelper docHelper) throws DocumentException, IOException { + DocHeader docHeader = docBase.getDocHeader(); + if ( docHeader != null && docHeader.isUseHeader() ) { + if ( docHeader.isBasic() ) { + HeaderFooter header = this.createHeaderFooter( docHeader, docHeader.getAlign(), docHelper ); + this.document.setHeader( header ); + } else { + this.handleHeaderExt(docHeader, pdfHelper, docHelper); + } + } + } + + private void handleFooter( DocBase docBase, PdfHelper pdfHelper, OpenPdfHelper docHelper) throws DocumentException, IOException { + DocFooter docFooter = docBase.getDocFooter(); + if ( docFooter != null && docFooter.isUseFooter() ) { + if ( docFooter.isBasic() ) { + HeaderFooter footer = this.createHeaderFooter( docFooter, docFooter.getAlign(), docHelper ); + this.document.setFooter( footer ); + } else { + this.handleFooterExt(docFooter, pdfHelper, docHelper); + } + } + } + + /* (non-Javadoc) + * @see org.fugerit.java.doc.base.DocHandler#handleDoc(org.fugerit.java.doc.base.DocBase) + */ + public void handleDoc(DocBase docBase) throws DocumentException, IOException { + Properties info = docBase.getInfo(); + + String defaultFontName = info.getProperty( DOC_DEFAULT_FONT_NAME, "helvetica" ); + String defaultFontSize = info.getProperty( DOC_DEFAULT_FONT_SIZE, "10" ); + String defaultFontStyle = info.getProperty( DOC_DEFAULT_FONT_STYLE, "normal" ); + OpenPdfHelper docHelper = new OpenPdfHelper(); + + if ( this.pdfWriter != null ) { + docHelper.setPdfWriter( this.pdfWriter ); + } + + docHelper.setDefFontName( defaultFontName ); + docHelper.setDefFontStyle( defaultFontStyle ); + docHelper.setDefFontSize( defaultFontSize ); + + if ( this.totalPageCount != -1 ) { + docHelper.getParams().setProperty( PARAM_PAGE_TOTAL , String.valueOf( this.totalPageCount ) ); + } + + this.handleTypeSpecific(info); + + // header / footer section + PdfHelper pdfHelper = new PdfHelper( docHelper ); + this.handleHeader(docBase, pdfHelper, docHelper); + this.handleFooter(docBase, pdfHelper, docHelper); + if ( DOC_OUTPUT_PDF.equals( this.docType ) ) { + this.pdfWriter.setPageEvent( pdfHelper ); + } + + this.document.open(); + + Iterator itDoc = docBase.getDocBody().docElements(); + handleElements(document, itDoc, docHelper); + + this.document.close(); + } + + public static void handleElementsSafe( Document document, Iterator itDoc, OpenPdfHelper docHelper ) { + try { + handleElements(document, itDoc, docHelper); + } catch (Exception e) { + throw new ConfigRuntimeException( e ); + } + } + + public static void handleElements( Document document, Iterator itDoc, OpenPdfHelper docHelper ) throws DocumentException, IOException { + while ( itDoc.hasNext() ) { + DocElement docElement = itDoc.next(); + getElement(document, docElement, true, docHelper ); + } + } + + public static Element getElement( Document document, DocElement docElement, boolean addElement, OpenPdfHelper docHelper ) throws DocumentException, IOException { + Element result = null; + DocumentParent documentParent = new DocumentParent( document ); + if ( docElement instanceof DocPhrase ) { + result = createPhrase( (DocPhrase)docElement, docHelper ); + if ( addElement ) { + documentParent.add( result ); + } + } else if ( docElement instanceof DocPara ) { + result = createPara( (DocPara)docElement, docHelper ); + if ( addElement ) { + documentParent.add( result ); + } + } else if ( docElement instanceof DocTable ) { + result = OpenPdfDocTableHelper.createTable( (DocTable)docElement, docHelper ); + if ( addElement ) { + document.add( result ); + } + } else if ( docElement instanceof DocImage ) { + result = createImage( (DocImage)docElement ); + if ( addElement ) { + documentParent.add( result ); + } + } else if ( docElement instanceof DocPageBreak ) { + document.newPage(); + } + return result; + } + + private void handleHeaderFooterElement( DocElement docElement, float leading, OpenPdfHelper docHelper , Phrase phrase ) throws DocumentException, IOException { + if ( docElement instanceof DocPhrase ) { + DocPhrase docPhrase = (DocPhrase) docElement; + Chunk ck = createChunk( docPhrase, docHelper ); + if( docPhrase.getLeading() != null && docPhrase.getLeading().floatValue() != leading ) { + leading = docPhrase.getLeading().floatValue(); + phrase.setLeading( leading ); + } + phrase.add( ck ); + } else if ( docElement instanceof DocPara ) { + DocPara docPara = (DocPara) docElement; + if ( docPara.getLeading() != null ) { + phrase.setLeading( docPara.getLeading().floatValue() ); + } + Font f = new Font( Font.HELVETICA, docPara.getSize() ); + if ( docPara.getForeColor() != null ) { + try { + f.setColor( DocModelUtils.parseHtmlColor( docPara.getForeColor() ) ); + } catch (Exception fe) { + LogFacade.getLog().warn( "Error setting fore color on footer : "+docPara.getForeColor(), fe ); + } + } + Chunk ck = new Chunk( docPara.getText(), f ); + phrase.add( ck ); + } else if ( docElement instanceof DocImage ) { + DocImage docImage = (DocImage)docElement; + Image img = createImage( docImage ); + Chunk ck = new Chunk( img, 0, 0, true ); + phrase.add( ck ); + } + } + + private HeaderFooter createHeaderFooter( DocHeaderFooter container, int align, OpenPdfHelper docHelper ) throws DocumentException, IOException { + Iterator it = container.docElements(); + Phrase phrase = new Phrase(); + float leading = (float)-1.0; + while ( it.hasNext() ) { + DocElement docElement = it.next(); + this.handleHeaderFooterElement(docElement, leading, docHelper, phrase); + } + HeaderFooter headerFooter = new HeaderFooter( phrase, container.isNumbered() ); + if ( align == DocPara.ALIGN_UNSET ) { + align = DocPara.ALIGN_CENTER; + } + headerFooter.setAlignment( getAlign( align ) ); + headerFooter.setBorder( container.getBorderWidth() ); + return headerFooter; + } + +} + diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java new file mode 100644 index 000000000..1860403ed --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java @@ -0,0 +1,9 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import com.lowagie.text.Element; + +public interface ParentElement { + + public void add( Element element ) throws Exception; + +} diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PdfHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PdfHelper.java new file mode 100644 index 000000000..3445e7eba --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PdfHelper.java @@ -0,0 +1,143 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import java.util.Iterator; + +import org.fugerit.java.core.cfg.ConfigRuntimeException; +import org.fugerit.java.doc.base.model.DocElement; +import org.fugerit.java.doc.base.model.DocFooter; +import org.fugerit.java.doc.base.model.DocHeader; +import org.fugerit.java.doc.base.model.DocPara; + +import com.lowagie.text.Document; +import com.lowagie.text.Element; +import com.lowagie.text.Rectangle; +import com.lowagie.text.pdf.BaseFont; +import com.lowagie.text.pdf.PdfContentByte; +import com.lowagie.text.pdf.PdfPageEventHelper; +import com.lowagie.text.pdf.PdfTemplate; +import com.lowagie.text.pdf.PdfWriter; + +/** + * This is the handler to use + * + * @author fugerit79 + * + */ +public class PdfHelper extends PdfPageEventHelper { + + public PdfHelper( OpenPdfHelper docHelper ) { + this.docHelper = docHelper; + this.docHeader = null; + this.docFooter = null; + } + + protected BaseFont baseFont; + private PdfTemplate totalPages; + private float footerTextSize = 8f; + private int pageNumberAlignment = Element.ALIGN_CENTER; + + private OpenPdfHelper docHelper; + + private int currentPageNumber; + + private DocHeader docHeader; + + private DocFooter docFooter; + + @Override + public void onStartPage(PdfWriter writer, Document document) { + this.currentPageNumber = writer.getPageNumber(); + this.docHelper.getParams().setProperty( OpenPpfDocHandler.PARAM_PAGE_CURRENT , String.valueOf( writer.getPageNumber() ) ); + if ( this.getDocHeader() != null ) { + OpenPpfDocHandler.handleElementsSafe( document, this.getDocHeader().docElements(), docHelper ); + } + } + + @Override + public void onOpenDocument(PdfWriter writer, Document document) { + totalPages = writer.getDirectContent().createTemplate(100, 100); + totalPages.setBoundingBox( new Rectangle(-20, -20, 100, 100) ); + this.baseFont = OpenPdfFontHelper.createBaseFontSafe(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED); + } + + @Override + public void onEndPage(PdfWriter writer, Document document) { + if ( this.getDocFooter() != null && !this.getDocFooter().isBasic() ) { + // allocate direct writer + PdfContentByte cb = writer.getDirectContent(); + // save writer state + cb.saveState(); + Iterator itElements = this.getDocFooter().docElements(); + int totalOffset = 20; + cb.beginText(); + cb.setFontAndSize(baseFont, footerTextSize); + while ( itElements.hasNext() ) { + DocElement current = itElements.next(); + if ( current instanceof DocPara ) { + DocPara para = (DocPara) current; + String text = OpenPpfDocHandler.createText( docHelper.getParams(), para.getText() ); + float textSize = baseFont.getWidthPoint(text, footerTextSize); + float textBase = document.bottom() - totalOffset; + int rowOffset = 10; + if( para.getAlign() == DocPara.ALIGN_CENTER ) { + cb.setTextMatrix((document.right() / 2), textBase); + cb.showText(text); + } else if( para.getAlign() == DocPara.ALIGN_LEFT ) { + cb.setTextMatrix(document.left(), textBase); + cb.showText(text); + } else { + float adjust = baseFont.getWidthPoint("0", footerTextSize); + cb.setTextMatrix(document.right() - textSize - adjust, textBase); + cb.showText(text); + } + + totalOffset+= rowOffset; + } else { + throw new ConfigRuntimeException( "Element not allowed in footer (accepted only DocPara) : "+current ); + } + + } + cb.endText(); + // restore writer state + cb.restoreState(); + } + } + + @Override + public void onCloseDocument(PdfWriter writer, Document document) { + totalPages.beginText(); + totalPages.setFontAndSize(baseFont, footerTextSize); + totalPages.setTextMatrix(0, 0); + totalPages.showText(String.valueOf( writer.getPageNumber() - 1) ); + totalPages.endText(); + } + + public void setPageNumberAlignment(int pageNumberAlignment) { + this.pageNumberAlignment = pageNumberAlignment; + } + + public DocHeader getDocHeader() { + return docHeader; + } + + public void setDocHeader(DocHeader docHeader) { + this.docHeader = docHeader; + } + + public DocFooter getDocFooter() { + return docFooter; + } + + public void setDocFooter(DocFooter docFooter) { + this.docFooter = docFooter; + } + + public int getPageNumberAlignment() { + return pageNumberAlignment; + } + + public int getCurrentPageNumber() { + return currentPageNumber; + } + +} \ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java new file mode 100644 index 000000000..42c42f771 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java @@ -0,0 +1,21 @@ +package org.fugerit.java.doc.mod.openpdf.ext.helpers; + +import com.lowagie.text.Element; +import com.lowagie.text.Phrase; + +public class PhraseParent implements ParentElement { + + private Phrase phrase; + + public PhraseParent( Phrase phrase ) { + this.phrase = phrase; + } + + /* (non-Javadoc) + * @see org.fugerit.java.doc.mod.itext.ParentElement#add(com.lowagie.text.Element) + */ + public void add(Element element) throws Exception { + this.phrase.add( element ); + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java new file mode 100644 index 000000000..bb1ed9509 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java @@ -0,0 +1,99 @@ +package test.org.fugerit.java.doc.mod.openpdf.ext; + +import java.awt.Color; +import java.io.FileOutputStream; + +import org.junit.Assert; +import org.junit.Test; + +import com.lowagie.text.Chunk; +import com.lowagie.text.Document; +import com.lowagie.text.Font; +import com.lowagie.text.List; +import com.lowagie.text.ListItem; +import com.lowagie.text.PageSize; +import com.lowagie.text.Paragraph; +import com.lowagie.text.pdf.PdfAction; +import com.lowagie.text.pdf.PdfContentByte; +import com.lowagie.text.pdf.PdfDestination; +import com.lowagie.text.pdf.PdfOutline; +import com.lowagie.text.pdf.PdfWriter; + +public class PocIndex { + + private static final String VERSION = "002"; + + @Test + public void testIndex001() throws Exception { + boolean ok = false; + + String dest = "target/test_index001.pdf"; + Document document = new Document(PageSize.A4.rotate()); + PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); + writer.setViewerPreferences( PdfWriter.DisplayDocTitle ); + document.addTitle( "Test title "+VERSION ); + writer.setPdfVersion(PdfWriter.VERSION_1_7); + + //TAGGED PDF + //Make document tagged + writer.setTagged(); + //=============== + //PDF/UA + //Set document metadata + writer.setViewerPreferences(PdfWriter.DisplayDocTitle); + //document.addLanguage("en-US"); + writer.createXmpMetadata(); + //===================== + document.open(); + + document.add(new Paragraph("Outline action example "+VERSION)); + + PdfContentByte cb = writer.getDirectContent(); + PdfOutline root = cb.getRootOutline(); + PdfOutline links = new PdfOutline(root, new PdfAction("http://www.lowagie.com/iText/links.html"), + "Useful links"); + links.setColor(new Color(0x00, 0x80, 0x80)); + links.setStyle(Font.BOLD); + new PdfOutline(links, new PdfAction("http://www.lowagie.com/iText"), "Bruno's iText site"); + new PdfOutline(links, new PdfAction("http://itextpdf.sourceforge.net/"), "Paulo's iText site"); + new PdfOutline(links, new PdfAction("http://sourceforge.net/projects/itext/"), "iText @ SourceForge"); + PdfOutline other = new PdfOutline(root, new PdfDestination(PdfDestination.FIT), "other actions", false); + other.setStyle(Font.ITALIC); + new PdfOutline(other, new PdfAction("remote.pdf", 1), "Go to yhe first page of a remote file"); + new PdfOutline(other, new PdfAction("remote.pdf", "test"), "Go to a local destination in a remote file"); + new PdfOutline(other, PdfAction.javaScript("app.alert('Hello');\r", writer), "Say Hello"); + + Font font = new Font( Font.HELVETICA ); + Paragraph p = new Paragraph(); + //PdfStructureElement ele = new PdfStructureElement( writer.getStructureTreeRoot(), PdfName.H1 ); + + + //PDF/UA + //Embed font + //================== + Chunk c = new Chunk("Test tag"); + + p.add(c); + document.add(p); + p = new Paragraph("\n\n\n\n\n\n\n\n\n\n\n\n", font); + document.add(p); + List list = new List(true); + list.add(new ListItem("quick", font)); + list.add(new ListItem("brown", font)); + list.add(new ListItem("fox", font)); + list.add(new ListItem("jumps", font)); + list.add(new ListItem("over", font)); + list.add(new ListItem("the", font)); + list.add(new ListItem("lazy", font)); + list.add(new ListItem("dog", font)); + document.add(list); + + document.close(); + + ok = true; + + Assert.assertTrue( ok ); + + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java new file mode 100644 index 000000000..b53519cf0 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java @@ -0,0 +1,53 @@ +package test.org.fugerit.java.doc.mod.openpdf.ext; + +import org.fugerit.java.doc.base.config.DocConfig; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; +import org.junit.Assert; +import org.junit.Test; + +import com.lowagie.text.pdf.BaseFont; + +public class TestDefaultDoc extends TestDocBase { + + private static final String CUSTOM_FONT = "TitilliumWeb"; + + private static final String DEFAULT_DOC = "default_doc"; + + private static final String DEFAULT_DOC_ALT = "default_doc_alt"; + + @Test + public void testOpenFailPDF() { + Assert.assertThrows( AssertionError.class , () -> this.testDocWorker( "default_doc_fail1" , DocConfig.TYPE_PDF ) ); + } + + @Test + public void testCustomFont() { + BaseFont font = OpenPpfDocHandler.findFont( CUSTOM_FONT ); + Assert.assertNotNull(font); + } + + @Test + public void testOpenPDF() { + boolean ok = this.testDocWorker( DEFAULT_DOC , DocConfig.TYPE_PDF ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenHTML() { + boolean ok = this.testDocWorker( DEFAULT_DOC , DocConfig.TYPE_HTML ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenAltPDF() { + boolean ok = this.testDocWorker( DEFAULT_DOC_ALT , DocConfig.TYPE_PDF ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenAltHTML() { + boolean ok = this.testDocWorker( DEFAULT_DOC_ALT , DocConfig.TYPE_HTML ); + Assert.assertTrue(ok); + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java new file mode 100644 index 000000000..f901cd263 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java @@ -0,0 +1,42 @@ +package test.org.fugerit.java.doc.mod.openpdf.ext; + +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; + +import org.fugerit.java.core.lang.helpers.ClassHelper; +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; + +import lombok.extern.slf4j.Slf4j; +import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfig; +import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfigFacade; + +@Slf4j +public class TestDocBase { + + private FreemarkerDocProcessConfig config = FreemarkerDocProcessConfigFacade.loadConfigSafe( "cl://fm-test-mod-openpdf-config.xml" ); + + protected boolean testDocWorker( String testCase, String type ) { + boolean ok = false; + String inputXml = "xml/"+testCase+".xml" ; + DocTypeHandler handler = this.config.getFacade().findHandler( type ); + File outputFile = new File( "target", testCase+"."+handler.getType() ); + log.info( "inputXml:{}, outputFile:{}", inputXml, outputFile ); + try ( InputStreamReader reader = new InputStreamReader( ClassHelper.loadFromDefaultClassLoader( inputXml ) ); + OutputStream os = new FileOutputStream( outputFile ) ) { + handler.handle( DocInput.newInput( handler.getType() , reader ) , DocOutput.newOutput(os) ); + ok = true; + } catch (Exception e) { + String message = "Error : "+e.getMessage(); + log.error( message , e ); + fail( message ); + } + return ok; + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestOpenPdfHelper.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestOpenPdfHelper.java new file mode 100644 index 000000000..01c17308f --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestOpenPdfHelper.java @@ -0,0 +1,19 @@ +package test.org.fugerit.java.doc.mod.openpdf.ext; + +import org.fugerit.java.doc.mod.openpdf.ext.helpers.PhraseParent; +import org.junit.Assert; +import org.junit.Test; + +import com.lowagie.text.Paragraph; +import com.lowagie.text.Phrase; + +public class TestOpenPdfHelper { + + @Test + public void test001() throws Exception { + PhraseParent parent = new PhraseParent( new Phrase() ); + parent.add( new Paragraph() ); + Assert.assertNotNull( parent ); + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPdfHelper.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPdfHelper.java new file mode 100644 index 000000000..a09918f73 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPdfHelper.java @@ -0,0 +1,40 @@ +package test.org.fugerit.java.doc.mod.openpdf.ext; + +import org.fugerit.java.core.cfg.ConfigRuntimeException; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPdfFontHelper; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.PdfHelper; +import org.junit.Assert; +import org.junit.Test; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class TestPdfHelper { + + @Test + public void testSetGet() { + PdfHelper helper = new PdfHelper( null ); + log.info( "getCurrentPageNumber -> {}", helper.getCurrentPageNumber() ); + int current = 10; + helper.setPageNumberAlignment(current); + log.info( "getPageNumberAlignment -> {}", helper.getPageNumberAlignment() ); + Assert.assertEquals( current , helper.getPageNumberAlignment() ); + } + + + @Test + public void testTandleElementSafe() { + Assert.assertThrows( ConfigRuntimeException.class , () -> OpenPpfDocHandler.handleElementsSafe(null, null, null) ); + } + + @Test + public void testCreateFontSafe() { + Assert.assertThrows( RuntimeException.class , () -> OpenPdfFontHelper.createBaseFontSafe(null, null, false) ); + } + + @Test + public void testCreateFontSafe1() { + Assert.assertThrows( ConfigRuntimeException.class , () -> OpenPdfFontHelper.createBaseFontSafe( "no", "no", false) ); + } +} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPhraseParent.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPhraseParent.java new file mode 100644 index 000000000..54ba74c9e --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestPhraseParent.java @@ -0,0 +1,22 @@ +package test.org.fugerit.java.doc.mod.openpdf.ext; + +import java.util.Properties; + +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPdfHelper; +import org.junit.Assert; +import org.junit.Test; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class TestPhraseParent { + + @Test + public void test001() throws Exception { + OpenPdfHelper helper = new OpenPdfHelper(); + helper.setParams( new Properties() ); + log.info( "helper.getDefFontStyle() -> {}", helper.getDefFontStyle() ); + Assert.assertNotNull( helper.getParams() ); + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestSpec.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestSpec.java new file mode 100644 index 000000000..8fc8ed2bc --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestSpec.java @@ -0,0 +1,17 @@ +package test.org.fugerit.java.doc.mod.openpdf.ext; + +import org.fugerit.java.doc.base.config.DocConfig; +import org.junit.Assert; +import org.junit.Test; + +public class TestSpec extends TestDocBase { + + private static final String DEFAULT_DOC = "test"; + + @Test + public void testOpenPDF() { + boolean ok = this.testDocWorker( DEFAULT_DOC , DocConfig.TYPE_PDF ); + Assert.assertTrue(ok); + } + +} diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml b/fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml new file mode 100644 index 000000000..9c35502f5 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Bold.ttf b/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b51a4d638774a8b5636e7cbef7e0a4d4b3ddf582 GIT binary patch literal 53896 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 z zWmev})p+_g&rrSBY8>}C<38`;U7uU;eb!apXzjIHN1xBl*7qoRqo?fib?>t7^Iq(r z&o|O{T5s`IYt8x*@n-97-fdl&`?mM@PPU@Qspcaej<@)7+u|+0oTr<*elItat~pWF z%fq|AqK&Ps{q1D^I=Qub0-dMl{L!A2HY;tGXO|JMNH&kDv6Y^`nfWvrn`WEnXeD?o1gXtLVH>t|0G#ovd>a|UaHufF<8rA3)-;Sx$DQ;S8>;3 zJl=#)ort$RGgyAxIh{Dd@2U7X4b8AHrR{UFbC1-z7UFu-alM5Zw7(OoGV>BR4KLm@ zDQ1z?Y<&!ApD~6wb57cyxK`8|bsV_G*)0T*<}01mwv=9;U_Rwk+L`@rpB*a#{r_zX z%>QNf5n7vV?QbWNU}))NTePsf&C_EGy0`*-Zi);#jx&73xMg54dfpEJnJ zn%^W8_e|ps%VK@Csvk^)g}4(o6qYroX+ypqWIMEdEEqd0?7a1f_y1e1?xa&_Y4(XV z_F9%RRoPQ%Y3FB#)@GmRL40y)4_bS3jvmwe%+cpLt{wmDBtw^@oj6IqGt5B8V+uZX zBHEH+5jr08)8BD?@dO<2cN_j2h&tQoJa!oVcOn=V?_mcH*Q3dB1X)eh$B_1$#}Mlh zX8nz8MV(Q{fm@v2LX;04X0?Skoy)3b($4H}c6R9MaWwk>Z_A=&M9ZaC#hQFQiNjnj zjSZjro!fYPkmF!WueOdz<)f7=MA#!L|f*< z9qI4zq@mNn(VP{t{w&vJwW!~9_22LMeUUTHJz}f{UDn39&abS7R=XEkd9!0>2_Kw_2tB0-fG{Ya~{ybKz8mrN&``+q}HK+d2wK~?F(yGIvpIY@NK2xk+ J6)Ps@{uh*&W)T1Y literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-BoldItalic.ttf b/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d0fe23bed28a03d76afc7e111a0f2b5635fef336 GIT binary patch literal 62924 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

p;>%*WBkH(Vr%x3@LFtA8K_ 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 E2f#0LCjbBd literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Italic.ttf b/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..266d5cb8107eccc483b806dcabc9ae86dff2d8fa GIT binary patch literal 65284 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 literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Regular.ttf b/fj-doc-mod-openpdf-ext/src/test/resources/font/TitilliumWeb-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a54ad4b93dea7fefe7b6f30ec7470eb7c8e41159 GIT binary patch literal 57392 zcmcG%2Ygh;`ae8#PO_WcHk(anOL`;O&1Tbk?*u{z2@pC75_++qAQo&FP*JgAMFrcn z_g=Brv-JHHfntqZ@|IF7MR zMm#@j&eE=BDf?{4@%KWHD9cQbY_?z4miOINH3jBcpJ{q2lt<}K-+)7AY&LmXpk5*U;7mUgXK z#=l^IXN?!0H}-Tb?Vj@PN4skh~8@%v)OI>WZ5Q>Oa8Vqo8hTS{vo%ypW>Een-+J2OL_c{^TH1R%u?)kx`KHlFN>JQ~*g&ua!%FYV@i7{^$>-s?om+k~q{!E8H z0)qyfL6)rgaE&?1ZVR{CbCb*(U9R$jBiv@qqaUt)GyBbbpB64CESY1l8$SP}a6v(F zPHaR(p217HC#1hq+J8}9ZEfAushMeM&Z-M9s;#T5o0c&>H5DzTxsFTMOHTr`MwZH0 zSe`W^T%$GQISlx#P1YEba`OlgI;$f&i0i|3;bV9y@M6AX`W=&MCtMw&X$Ul(o4K~e z`OUJ14ok$P>$Bdg%>CmHKZpjPFO&ZH>5wH1E zF>}e-$jJIizOVMW4+@Lgx%b}BYif5;$voc2S4z)NNp1lOw8@|bgTtV;@s;PN=A|IR6=;GYqBnX|@Mt^fLKx>L>mgZA_2j>B%!SM#y|sjbEDRhUIP*mC-v zh`g#}`EvYfbp6CPN-v0~xq%ybbd~dKKk2ck{yNN-WQ?tkbOZBadQ@#SM1&F@h2$B` zT8%zD!kQP7#0?#`C2Rh(cJ;afQ(fzAtxeJmW6E9Zp&ftYYp<_~%z1bFnajC-EkU*z ze>O|onFe{NB@}4kn_KR(yen<*Um}$*E4&2H)ZpH~rQOWHSSq(WN+l4i#T?9&K~^B* zU~c07c20fPnw41FSkWG>IpekYrOo?!Q^o7Kd5wwXxuM?WF`d(E7c@LTEta~D^X~zF z62?$e5X7~pBOYX^v6#nlM}#fUo|}xRPxFAo-qowm=JEmr(M)-wlwfc(2?%CnmvIu_mYVXRbo}6HBYBL2K#uvTB=$q^& zyUr%Nc?w_PeCCM>Pyg65VZyn^{3B=1TW?jLixOq7U-_>n5sl({lQz#rvr_?20Sh1} z>-cBRr^8xW-(9hA!aS32-}UVcRS9i+y**6YUi(q%^UGF6XiFl-U0D+D=jX>K5l6IQ z^t^#fJ!U53nC5y%DOW2G%|$a~xNH{apl0}ysdr6}iW+Y`xVGoJ3)YWohW1$15Oa`A2;|Z3i4>w{?3RbD3%cNvW5a+o@(3inh%J2B} zTx)T0u`|?Bl$TS-n~Dk-I`Vjh^R;a2!aTcl!=%pAikO&&$|vuyYc$5x6isk0U3<3O z78+c{S#M89URY=z;UX0<_5&BxI&)YZz%N?0StCMJOzW&=925Yu{`Da~xBlY|3)imN zd~Q>Fw07#;lJ;o%`r5X_uajQwUiE^IK8djm}vouWx<5^368Xl*l;WDLsYx76Tdy50c`zB`LR5a?d(ohyzZ()3P|F zEHG=Hxx6N$Gupema{e3_>yY9rs;1bDmYC|I$+@^V zDa#Cq^qt+D=!ngqwk$m_tjXV77m=43y~lapqx)aIOrDv$;-;dNU-PHla$3{p`xd8< zE95zW?>lq>0ls1SqOd3{H=nK3hCIE`6d2(Zy=Z>WqqjZjob;eym2ZZ99{2t4XKy+k zS$V534xc{%Vd@3R3&mJfw8W8ZI-AatY|`pvlN|Zf9Zxk|ogZ88UdS~Ir3d?)@4sJK z?%d4RV^lg(ie!;Mu_`hhu!t$Gr9T!Ehjd{D+W{72ahaRc`N#bEnHfDj3!J}k_P`_6 zb#ajyj=lGn7nMm5c228k&?jwNFqM~{D5y`$^$+LPA4}FdfK*lls{U1s9!u1ivm^|h z6_SP^W1!W+f1SUl+o9Jx=H9qO?r!U;3ruR*Hp^e1dB*xjHqOe3s0cf6ciXHMQy6+m zFgF8cKg(rE`4c&AA~tBt4F06f|RX*!ldY&zf`9%9T52%r(m!ruDVA zFRyLjaW&4nBk$#l_l0Z9^_!iqZw~rEX<2GjpfrV=uo3}QBuR4K*wVshHS+@J%hH3+ z*LYrkGqn#$+0A&KR!%(E*+Qd@-@{ywu($Dh0M=kTMl{r>3)gD2ny~uRW*%#(j;XJ) zG)j&AdnY8Dd{9`_B&8@NY}Bj+tAoxWYj198S$^N-m)@E7NFN%0%8Qpe_W)y7FQp8B z7iF-xq+%FCP5fQwc`ZB}KwROjlkkZ32GGTD8#-i>@d@p`_=OiPZV7sI;;TV;_+hD` zzge0s^4%&dZ73(k%7$Vn$WiEW?yGO!=KNWQGM7usP-a>G<)9B5h3OatEp{R-PptiB z4TE?Wf{D7d{j0W)!{hk-tDLW{TEnetpWeKQTQ9lTdCzTk@um0eSLtgk+Vf?hisTKF z!h}e)kxZJ-dB^^i{xg?2`}SQ{-L&u9Z>0x&&itoX}vhC6bxUch9>A`tRZcKIli~Ck{i}N#JFdOUk57N^t z9>ZYPhsR6$a8;FP7GySvGcT z)5H%TwS--qpA#C@Hsi5i?+PG@le8*vK&Wzf3~Fc~KlWa;)LT>2e}&Xb&$MGqa`6mC zM9A_WK_Q_bzy9V4oz3h2v$o~!opo*eOK1Fw1q)ViF`tO1Whpgt8z=>AjUQ}(=z(Z1Lxo`1VzC+oo=dTh(^Sw)4*0CMac5|4u|%i?X1u7>S4+rF8P5ef!6M@WG^e?;HQ&hamKid5ZHU=UzU>d6sr}CInkkY5vf-@FwV9iw?+K$^kLicROAB^|*Ng}jXaqRP0`Wt)!Q zdf6rIk5)a68~)B;c&BqO)ilpFTMBdSp>_-ad>+5sIbnJw?zmi18~d;HCEd}1zN0?Y ze%JhZE4HyYWOkXgys#v^f;;=1pRe?hr8j@J zIE$vd-x;BG-sp|K+fd^r=mltmLk1OGJlwtVhvaeD)D|hXCv}z-OkE|<$XYpN7Iy~7 zCBEZ6ndn;@w1&s^5nPaN`73}cm?S#vC+v#cKr4g6E`ceO@la(YH1Jm%Tbfdeqw~6! z6;`~FP*4{hUhZfvwn%UFTg@5a(Rti*Zs2GAYlC#YzI=Q@*Sr-Z#ETZ*0Gy%J^F&23 zv4;@X(weaOanR0L%dd-*mXBL9^_}jyUe3Q4@30nauHvO~QOL&gx%SMp1>@TfO>b_W z3=jpMXplapeiO$bg#$!Ttk-5u9JlH3Xeui!ZtCXw4P&n04>()+0~MKzTC}B7c1=bF zrXt|c^B)0E0vijdiufQ2&iDh#mGlf_xI>>TWDHORZO@3k(k=~@fvtC#xH4l+X~x``h_Iw*COCH#-B4p~SYk40?dx)L*V+GFF)`I<)LBEbLK6D+ z`pI79lBsHDlUGLInBd|`H(YN|&6pqW9htxzt=8368}+dse?G*hfUD99rza6xkIpK@ z`M0K~_Qtt2O{tY-MLOxN<4H>{g2ba)&|)Ax56ZH?Nl&1sn4z>DkrZ9u)YQa}IRm8b zNt2l5I^Z&iXMBl2It07ZCYSP1JlW7#IXAvFqcM>G%NaR+x~(v?Oxle?DpYR>8WvE6 zLIVI+pR5Hut(SG)a#!b$Ht8+rWUtr0cK-AYCLU+4faMyLz!!o9+gi|yQj^TZ7!35! zK%1(8PGUdhdHuJh#-_R%iKc}q=ypnlsaB^8Y)Y;)R)vM~W0p)?_?X2PD<}Z%na*^c z{ z1cMOb3^Z@C3B~jW#|lmQp?lJT^KWmgjhI>Gs3R0FVB2)N`#ho zk@`T;Sp#>e(u+RNp%3DKs=jg3th8y7QT$kSv98(292n@l0#9dxSKNk{p<&dCmD*!} z4XGJKN^Iz>rPli!=bTYGA>M2Gijv&@jq_VdrpHRX{PAW>+?f1b^+8yg6DN&{&AYNT z$h#aWQ_f;szwi!e8wn*H8^rfbDgDOmIV5QizR-b(}C<#`!sz01fl1nv$wa)nQ>Y6)c&HF5}+LlS>&_Yq5g|G#FoNR|?F&RwJ5X4{9rk9pvXmcv1 z?oO?>puno_oX0D3q_Xwpg<)YOWh?RvyehoLOr=K&u9p4>jqt#_*S1WTL zlposKcu>CkN;YGnlI{!qh31Dr!`H`Lm6#hE z>R*}{w?k*Khx(O0Uup;lD7BZE14@LZquy1{b^)J?ZUDMNgU+JcCA8)I81&`NZ2mU2 z)9u>FpOor|dc5sf9K8V#9l9KA^*mz6gh^8?lCwhOHfv*1QTqnDIBncY@0kbZd#_sS zD;I04_LON$e5KW>u^rVOk#-ABg1V+*34q?yq{vD_;WCEvC);P3_wL=*64>E!+>+|r#Ess9x!;30Fr9bf? z=QkC)>WW)#si@Wg>UL1jETx#bPxV+Bs|> z!bwFixQEDs_ERkI#Gkk(Jf35%$<5;Y=B3LDOYUmONPN0{T)cLvV}0TN*0hj}XKa(A zohMAz3*x=QZRbiw!5Om>jfEGM8>{aK@Gc9UlR3szTASP$Xl%P7(98Laqa`USP+L@= zKwWnola_LC>1Bm(Xyvsb1=OF@AT6DWfB3zK-6Snel_d zNd-fP!1V4_JHOnq-Fe@}C(b(S@ve$odqrZrpI1_iA<9zgm3Y(ce_emW*VpqipV_?m znJvx@O}92_WxFPGagH`O02s>S-Mm@)8%D;20n(GS3-u96J&LreC8e--P}a@z)k{gn zK*#i~S(789`lOmA_P-~@r3SP_=%nlm{WUoOLDAN6Axd{yoO*bmaH*uoJm;mh-hWnhbRUU%UG`Hg)9oz-T}(aI_rwU zo`M2HtfRzQToe;oN+`pB{_B>fw-C<0U(Cm5OimB%TfAdlWDH4QuAii37{|RNxyaZT z1#z9Utf+|kcoE;jZ*%Y9!<4}@=c$lf)OJ=|+gTA-Ye#M_|LLsO*0WlV=8m`7#^<7> zgC)T#@h|Xy>@+buh&sfq(1KelwuvXP?<(bq)n}bmefHUpR}*gH`9b!hY!o|em@uI7 zvS7%B0y>!6etc)LEvHi|%0463RCW$O=$MpaPV_AZm}bg}FA=5RXTPH~t=UkB3r(@A z6wghE9*9(ERNvNx$&rRd>A7KE1vAE0R0Kt4PWLL3jT3AUKBmMjA1U9b(;gjW);h4Y zrrG7BjA9e8YJCdM3Hh9~D0Xlg8lF%RPG}{*0xR)(2~9&* z;?S?8cL!Hu?8>BM>`8$o(ktO3<^%{MlwZ4|N;_`hqH(;TUh3=L#;fPuyr80g8``aA zU$LD~*<-|r2UmA|1!XXPPje+R(ldZS4IW&9Ij*)?!5Mm|L}&TRvp@CE1Ypjy;|$ zoYY=(Vbui})r@J1i)$JqHPzR*TysrMdiv~Su`jB^T=~I0R}z!$2EEokmWzzvgK4sC zT7T0zBxPZxz)*KZs8Ac~>FjpwVZ4QO1ULsKE^Q|e))x2X{ zO>IMycVSG78}@#Uv?jX$!ui>G@4huV7XnspznuG#h5v7F|9a;{1(xBqr-mEC@VHrprqPGv#KyNQCC%wI_XuRcHz~#kk zCxKGcdHZwdBZlg|FZkH-38{?Sx^JE{*Nz?6pVcB`?bZ&h<)V+Hht%@s+)A1aq^ByD zcMC{pKRE~q>aZCgf)1_bxh)l2CUlJVgy+@^E@+2X;;!pjQ5R^$vo41jY63`ErBH4t zQr6IFt@;gt5y^p}y4gNEtqteZd)D}OvD^;8JPs>TD9Ka|vW^%Eiw+B|0XB%_a0A&d0Y0Bm8T+U(M>IbY zUll_pi7Dxc8K$^Wd0hVV`2H>o(Dkvi@(+=LVpWEZPexQMXb8I&xkP#d{0fko>=qcM zz|hqXhhmUl{YPQj=Td|7c2dgoDg8gL`Qm^wOz6$)N$dxSY5UG$Q zhjJ=Xf(|oE7&Kb2FMi)3|2lWZFbjn|eaaw9o8Wurz8OQT6_w#U*+?rIvF#I}RfSSL zEDl7e9##kEtAb92=|R4QNc7Ljf<8UV{#{U~QnrjJ(_MBq+9kU5Y*(R6&*GciRH@Wp za8slL`z8T9(TQg*DxG*%bBmx7r4H!xAdo?3`wmob5d9z2m{7l4u2W~F(pA6sxEGu1*UH`??-ts2VI(CL`jSW$F zXUlymRm%#ng4U!q&{`nbxgkRc^*`)OP_`!u6O*1q3Y#^&`qyoJ=h+&6<+o3<Kf6Ob1tZDc=gfBEaC7yOXJ`2H$W%Q834f;GjhpUbK_0fx7?C_(@oho-^^dX zS-r}>=|);F3S5^+)8#SXkTJB^@fI6TVrGzE#l91!T&4*z=#ng$mi=$DU+DVivr=}h{QG_SRgq`6e)0Hi()kxVA1>s7 z==z`8#4F34eo)NN&Jh+J(3_yP;Wiz>o;+aJsQ{4;we9>U*51?90WE@dppG;U*3ddG zCbAlUW4A(8!{Ja@-+^i*g_wrcG)It-lN});HKdq!?)KA^t)WOFJh$Nm^v_gSt-m5kYVk z_IJ{)>i^a>?d@qv?FQ2($Fv@6v0m;>tS?C0l$F>TZQE>@Ox+#T&GrII*qG?@@}ha2 z{$6GN_O6W5?50$6VoO4915u!`^3@TO z2IF)#C+xXS0|9@Twq$MyJ{341J>g%#fvj-6(*Y5&-nOBsq3LvR?6~9-vLLu2IUpdh z|20V5s}MMbDp#HksHgPv0}aW6Vb)ar0{@7lfY7Yd!FT7_c)#r2tT^9n8-w(z(9Fv! z&7}V|INiFQ(?LhNpwq!~zru6fkbEy7NoN4=uZ-Proy6%NG8a!OE}E=28ncYX(?Pa- za&htG;u}q4P57^lsPrpr0%qub03X@+z~nKVAzYJwNin8^+tX|p20w2rDdS*Og;~u+ z^IUo$cGVFpCQb|Z& zP)ggb62E}dX+Ba_a6`kHYYRJC8#?v+8n{1yZ%` zDxY&5M*BahT3})AK?!w*Mv?i%0_b@~B@8(s4L&gck-o;h*NB#cH>IithKD;;^}-F_ z0L7G0GxCYMmaJdAqGxVJQwZU^6y3Ks**1CpkYNhjLJ2&3mcVK0V@1~Y< zW6KR;`Qhg3vChjA#$PgS6WGi5Gs?Zr(OfzR46Abg@LEUWcSr-*jzsXtwlY02tjw!}ptu34e|Vd2`Ww=c zgD7!i-FfOfVr!s%ewbg0T8WBPjkOk(yr$r-{1=;eR6}-l!ynz{#zo{^I>dqrzeXw((@xX#?PE5o?c zXMt{k^}b6t`1FJ=jaf1K{B;%MAL!8Y`5NcCN#7?quO-`-u>69y#9l|yI1jb`$|TPX zwf`Pd8Nm=6u(U<>4;oq{X?}w^Rhccc*j7g<>E8J3O?rK!kxa_l%Dy5RBbzd&f!nH_ z$ah{!H0FlzQ$R?*>7&$_s7hO&RXV>NWGus~oi4~sR(t-k=sEcvk5aQ+S2hINlPdoi zR_$8%s0+I@FeqjFZa#&VvZVAvCe>Jd%Dbchdgho=hhvBE;Yph$yzRcY`qNnm6# zI-S(z&2^^}wjP4P$=!pUq6fgLXAj6f%V859;kKdL&^}v(mDkD>FY1(QJiEl@v@}yu zeLXB$O3#i+pJBcxvK-Kluni_F#14yTwu8hsOkEPaWq1dRXch8*a<|Fvgcm_aVpP=h z^olxo#!YHiB^zhewzq!YG--QhVrY6x25*r&ujrIp__X86+KMDUUtRmm$kK((XKhtWtG}t{|P5Ou(u+dkv!>u(>VD8S~ULLB=a8( zVODKsW3Dxd9LSsDN$yj7kaV{5bdj1u-?4R75%=9sov)Q15gz5_`DYcLf2p3bwCZny z795aF|AHrAKtze!v@XUH5^_4XK&d=l0jNAaJ=Q1WR8E4D;)jl%xv)jRNLq0n~-?&*ep<)2`i zmdw$y{Y&F$K)*x2bt=STZ5|<0x=7lAa9_GFay*f(RZ0 zo;bCTKQsAOiq+Huwzyh#LCc9!fvh#Ei)dv8`e;RcOVS7iB%9eIC5m(Hq5ky_9S!|C|51YJK?YZtP*oa{7PtW`9my zZOIarB<}=%68;1~o&xQtv1s3V%>L2h(xl05RscP&f~yZzTvh$=xEjJO{<7bHrUwi8 zKVprW2l<)kn4&Q8OYW}zA5L;@a z)$ms%MC8~52mbi|{}?7Bc%#$`=}P!dc*bCIh0P3vVmfCklD20^rs{v7Y6Imf;e$b| z1=;dwzc(0dqN+NF1f9ewykKbT316trb?mbxI%z~`WE8ED39FcpaYUr30U`atjT9t0 zetfeMF6z9IpR8Doe-%zI0+XLS>nscb>03o4jNw#)MWy%m0>LweUt{b>=B(U)s0rSY5?FrVRJMp0Ta)u4k&gBWJpK&;l>lqPG~V7!*| zivtIE+>od(Mdo@JdI)cdCQ+lMN%5dWOgkThra^k7|4Qi>)h{3yG?OIn_rN=zZf)v@ z>VV?C{bFsL}W|M|cxlZElN1$W)d!hGGfYB%zw1^r1$a!8t;>?yy6CdE&JR~Kzl23GgKF4;J z(}f~}S7o4n=*n###gX%K z4Ft8T<22y#<)%A|vy*8j=cc zpv&EY|6ruO9Iom%6kC_7+ZeIB0U}kmF*FSD3{|Z$G#c;-Bmy;uBC_ z+1NO#ZdP6C9Ai^@YFS)ELfnyyj$iQud;f#d!|vKfT9u&b_O!O;VkH`BP^uA{Yy~pXWCxQc?r_MM$0{|_ zH|;f#Rckn?CGG`G*;OCJ`lYrp9Nr<4yeHh;b6p$Rfwk^c&h1~fL&XSaV0b^sm5Q{f zBl_TCmpZQe?b5s}hQlwPXF1n&zU5pYg&yZ$Nq-F1KD-BHr53tcPv{q2k+=QW6?uOf z1@#3Nr(cwY5BLr6FZW2#VTFUIr?-hV?;_6I?W%0@hHVQL8yp}b_c-TFw_USr#g4X8 zeglrXF*v{FvmF>Acx17a~tf4~Q1-0Jj*j+*t;=d7siG-Pg6Lcurmf17u^ zz3l2DK9hSDRc#^fk7?QI8@O(5PX0pS_c3|O)VC*%>zL96>L;#|51vXVQoxf_2jS3t zCIt=>fVXT2R6;l@#CtMn;sIw>&DM+fgf-jPyDEmsEUw56cI3s6c#%aN#X<# z?$#ocZL`~y|iMU z>Qs;yRH;QoGh-uv;+d(TQ^hntK!bjYxaOBtsYmJ4wdfORdQa0Q#g=i3ZXHo1 z&r|m78X<%t3J<#F+b|Ns4*#b;6V08fb8oBmlT-9haq6SHFQ;JksgpdR2=E#bzAl2=ud0{f|K+CN-G61Q z$8tsAc#5%}pvp9-qT=gR`R1>Vwc6aN#=1qFl&2hPvgb&M(@$38^q~hHHBw(5N&*yO zH!OI+Y7pIsxEmJA-@nZx0#8I-NE{jtt%$eBUKdu9P*q|R$M|@wXi`t}xkJSYohR@Z z_65R%JSv#g-#Q4x+DJ@ZKTO18!fH1CSAjTaD&XqP8`t;~3&wk~6BdW0Og^4+VdX(2J;^FnduR^4MrlC!&@ia5|le%48U18z86-V0$MZf}A=WB9iyq9uNbN zwR!9vg0|X&W016oW-!X5 zjRw^yTw>(Z!b4@IBpF36sTiju2uxQb`7Fvs&})+c(vAw6Hwx- zb>XB!(^Xj%N14h9W18D-O+EDn9v$)|=);0YPpbG`(O+?H8AMnL8y$9h*&YNOfm6@;F%=@k&rQ|UdH9wo-5Yc*tM`CIc)Pj%d`aUYg&=m1Vrigl8-#&aJJLWz z&HV_+@rbDL7Or-Za{8KE1LS%B8d06c8Ek)$KobK5LDTU7-VkA`nj*LIJ7->$CjO8f4SBi=4LuGZlJ!b(-H894ps z233cX3_I$h(tSjg-tOoloP_|EERGXXr9?VV%)+CpT9Pt@d2ww*S(&3fHa~=CrZir0 zg`>MoBb9sG%J`o0yxEJjQkhp@b2;|#B6``237-@kSqMG8A?}R)!{o`v)3ArxsPbZO#Y0ivB|H=G~v}L;()S_v8N>i$Xj4|7$$T1;E2!j7i~oLV*`6L|o(yU_gnBL=?hb zh>R4D?M;6c9a#n3{FMkv*;~Pw;<5cDprBJ#Qb0AQ_1Vsr6$kr2cif&tlyQ3JZN zyC&!}=mb!icKt%1@u$1w-(mTv8vQ8H)&ug@r#cK2`(m_1=a=CWZO?WFr$5CWsyoE1 znyeM8PH~c1>jCNGQ=MgoJqz?bbmAzzJwWt^{Gw>zavW7YOJ|P)%1hj*k77>+sOao7 z;pr=S@3B`HI00=N3V%K15HvvX_RwR{xa)hVog1*mYB0l;RZOQ^YLz96yMDwIQOXml zUS^TPBC)E{9*>@AL`=+w1ih!W)YBnK8Zi1{r!!9KV%G{A3`Gd&$2Ce_VvPus;@Dwv z$|qLm;k+iygO5m4h6sC{Jpl=4KGxJA;>`p8N?-{Z?yZVRY2o^kI@NoqvRoIY#o7F> zBhp+R4|^h!Ah<-rCQzzc~Dqj-CEX5RbfwB<`(VH;|SMD zDNK?`W1mQe1nc1AZqF;?I9p7w(b7RTdUFz=e_d?zn7p)rqVfN(u!h7|o9%PTcJU}W zNzP9$3-&8I?beoma6oz6=Iaxtgp?mo>H4cMumOJXeQ$AIK57g*Qxk;?c zX{`9Kt;*`WbswkVvCTfs(j2eM^b0-c{I5m7t|rs-y&hX~MS>~xDumvJ{4%jSBGkIi zZ1>!wCWAB)dGJI_uJfSn?)l6$?@W)4a49GYmg0tc_ep0uxAHYd)UEJK6lg;pH;9%5 ze!?IzjiCsHL~%MF?TZG^hsAM(h(S0tQn+owkdtFyE~?thLlsn9G6EHaT38PhS3|^$ zem13P504qydl9__xX6YSLF?jh8_cP}@ifZRDo||pfI?wBBds+2kKs_bcQ+&A^nvh! zUB#u~0v@}HbJUXyP8Gj{qJx{7ME9&0I~pkmEx_foZmN+nev>LPjQ6b zq<_YGbWWwVbiU2`3eR^g=S~lr0=J~oEWw?9iJshZ)iH|Cj2p)ChHW0TtEfBXoWSp< zh@&C?Gn`eje@l5h6Wp8jBc@8)-}1~#aBJN0O7plQe{(WYxntwsvU`=cw&>vNb#F#n zx%9#(pP-B#clN7yV6U;`4*yo%sdoLF%>Y%P9S6$H@C^x!NKYpYj@o#gC_~-_xMxA) zbtpPhtr!*HIXgef+oc!X>x?+DOSI5UtsMOX|L|0VYX?td%ao_6C75{}SKx{Fkd}#u z0H@jYAb$d~2G(kGw2BGWsCSizE$)X-T=KP7V&s`qX2Y3=+2emT{t2> zP_$1lAXRnTGwvR|8;Aa39woVckjLPSO0-W_G)CzRUL#@jq7XU(S9ZT%iC*gDeyb80 z4$KiJv^4)xKupXkY{-5lfwCh#kh$#E=h~iGN)!t z?|*FY%}dUH^_5F_|59qE=j)fyOPpNDj*8RR+~*dG0}I_}72=61R>v8?lVmH0a$4Kd zIML9l9?iyGMquP^X*=O58OO1GE{-IN6(^2iJoWs2F3Cp0Q$+kLY2otJfL?v^s-mJ* z#dk;LN5|wvOYb)~Kh)H`BPVCg*s(MMk^CUe9g4upgi#)H$lI+02fOiu14p@`L=xWO z^ao1N%19Ah7+~dvI2QGojod4vqpg0AZ}pCkov|n@GsN4GI#ya5thqnGA$ax@KRMU; z45HOI{ythZV$8_@4r`G(sY5-1lujJiMpzLerkRlzHm}IGqNv=M5#(hx7jyZHl=xWb z`k?u_#Wzjq@R9Pg=S^A=0?6X|2kbjQhB*R?)dMzr{96la=1Cuywj2vQ3}utdB2-)j zLiYsySs0yLh@(RAsu>&{5CO7Ch9i3(_6T%tSIm+0?C-MEix(xwCeNRn5St(yJBtH@ zO6HtVqz}n|HZw6GAo-!hF@XVN(4T1Z$0_Sqmp<(1Pe7_AjdT;Kqv-W^(*Olyd zl!nUIL0F{s1Suq7J^ksA2S+>n5hozyoInj=1~nRnQsdnN)Hrv57zu{$>}Na=T6By~ zix-Wg#q^=1h>=52PNFA*5-B3_6qGo1fD+S#2Ptvda6+Ux;`$pq2Dm_pq_-kUOd?9$ zsS+Z*Ix(&sZK`yb_os9iJ)8~?o{9`XF_8nk0Ue4cic`?xW2d0Q@DXH4a|=H9T-r^R z8_X>_PhFgfPp6CGXng#Q=T_yk1$tK(!X4ww0~W8EFk7Csr^y#g{UFCHIS%_a-8NO8 zGk(?Lz_Mb_`MQ$T%k-t8t&>VZ%$X&V+QQ28%U6{IRY2V-v1zpU{q{RgfBS9c2cN(5&gaD4GF`vIzIFrc zfanx{aViizo=_JZLrokXrn52R+;_*)Stn*WVq-SEm{jT5mxtHKy;$({IlH!P+f{Kx z_SnjT+Q)4d^!9AE?Xu+-R06szcoQ7Mc|#FYH>M>WIiT$Cv*3|}HgH&>PG!N|Z|#{q zU#?g-yS~QY)i}l27HRN`U-*3c<@F6a>!pwHb#8j7@14E~pKWU+0{lzDjLuc@9hZ-z z=s7#;J|S&)drRU~WjZXuCVs+Mbi)NVd>Flzrxi%k`u9jN{XbHF<6Sebd;E#kY;R}< z@Dcg}e%4#fwftD!E%LaN`{Z%e)hGAS(;0YLlKv}rKSmHQ=-~KkvitH3{-JXn4$*h< zEzUH0DTegl>Imn<4(Fbznr^3`V)Gb-#G^t&BMuiA z8zTIIWM4n}ws!CM$+>xXxs%85wb_d@x$fQ=ep}}sr3s6oYr@QQR}Ft( z4j}skX>f5w2I+6z`WsLUFRrSYEGO5SE9%lML2^=4f@bbGpK>p2xm0uJG>u&DUDAy4 zD`%bjM}9f91{PF1LT`Z6l1H8%ezh(kH#DFuFMg+TdbmC2>Li>e?(qu`DoyamdEyrT zlDtQUoGs2-x$8@u_Ms<94A{rUmzHNr$qvj*NBMuMiwoCXZGG*V%98wZZ?NH2WYd13yRsiA(tdQUE|6Hs=(6J0*VGyq@Nr)mJzZG2|#! zhf+Tblu8tDGV>;L!A_JCB~Yq-UeguTJDb;_h!@LaKk^fhiM&Cpq^o5do|jrnB4km6 z1r{J1#Srnk=lb1ohp+SdJACKN_Ng%>&6%BONaPJwRTULTQBmhdML{N+*fjN@*Wd=hbpmmXrjFX?s%np+!1>R^-cuap-9EV_o_O0gm^z)2X>2l0HdNs zB5sIt+ZJK9{@;1%e*avbbmC`{X0t-`Lr@2&p z2Pa;pDTk`Xc(8a0C%v)f7Q_Si(@F<6D*PA38+&B`!8i7#xNc!5lxNT%@Few}Jg*GA zlPAixn-`#M@KW8Mzcb*aQ@k@^#%bRf0BMKU$-!bR`13ad>>9m|_R}QuhfECF5OPn*JE4K0>7fmwi$k}C-W2*!=o_J5gaw3^hRqARH0-gkV>+X* zP`65VweB(9p>VHoQ+P%A`tT>h`}LLj9r}Mpq(`iaxIf~sA;eH+SY^1#u-ou=!&{Nw zk)@GyBQK8pd*qK%(NWn^OQLo}JsI_Fv_9GzJvDlL^mWmn#`wl`#%zjtC&m?<8apj^ zYwUxupT-5o6~@hv+a33EJd2NuZ;J1WzdQbw_~T>Z$4ncuVa&cUUl_}bYmJ|p{7hY@ z%T3>!1I%{wH1m1pJIx2oN6f!ibe0@TtL03~d6vs84_Mx_981tAWF}N3OioyoaBjkm zg!>X+P53r3Br!X2a^m{LTNB?%JeCxbRFTw|v?uAkWS(qI?n}Nt`HAGOQsk8El#Z0G zDNm&QlA4jaEcO1>f2W!8nVPmL?Ygvw(+;KU(p%Dd(s!mmmwqfGIpd6str-tze3@y; zEYDn+d12;VnXhFY&GN}g%BsqmmvuqbLs{RCtr@#)>`U3c*)7@UW^9m*?D?b0FszYmBwRI^TM^^-)`dt--d#_Ob1k+_2p8+}_*`xfkZ{%)KRd zf9?ypALSmkGkdH()n019%zmSNzx`?ZXZGWH(Ro#Qoq3z`?#X*C?~}X}js!=s;|#}E z$2E?Z9RJNv%WuwKn}2uy3;CbqpD552#17dDy3`|iBy9WEA5A!`)%-IALv+oSR&uU^6 z4zo!U(Cz}(DH&Ojv>ACSQV`MtRv_KNI@xhZ3nmsO6(B#vI^}xY+k>BZlrbrQ#MxGqpY3(3|-B4c(cW3 zR>U^}_c1IJ_bcc-e*X#A7a=)#B>F=s0PhFLW)px93vgY{wP+6~oAC|Ij(W_98_ zje}>RahQa9OMxrke6%FPCQ9QV#(>5_O~C&P7>6X}A0i!=5?I>67|=L)rfjxGe8)J@ zShy371C5u+(Qh&Cl>dtHp!^te(4e4$Q{_aTWoVE34_YA{5saheCp>;9S|)lrRSr5A z{kfL~BliQ2-$FkL*GG_liTrEi|G*doA$QT7AiBi7knsJ0lrQE+Jm<(u{%OpJc1O#j@jHzp;c{3mU(X8UDFXgZ(0UckSL8-DkEXdt^na>c@Ee*N zn4f$<@=zAcXR|m#A2dcpCx4c2R_=>Ajd?|LT8yK6ZexClIqsPgZ&JsZ=$dFt+KG8j z{d2=h@Bl8%sqc|~R1zD;&> z(rYoR#CX}jH|^}7n4c>_<7=Upo)7+TkeMZ4%;kTuUg-l?C09Y0mFEE@lAlPmtEKDzBx04Ql|_jt=f#BZ$9(w}QV#(U}#rK6x#5ZlJ#| zqbtTMoqqBB$FE^B-a&IYy@N)&NScg$O-jyZqAz%fBlekt1xS7zsG+lIQY$1#bBi<{g=RxZ!Z^;hMwMhbs=}AI?6U{Q1exfB*dF&)@lc`sY&)oposa zp}s@Q4=p~l;L!9#<%d!aC4KUo-vPhZ1i~viWQQTY<4kVRIm_7@>E`#-{*Q3cAX{$H->mStE1-bMWb6b6GcAijrOU zZ7y;n=6E+-f={=2YB}noUzK~EXk|9O_n=K9%JkrOBkRL6D@9E`xaz|%y^ugdC-U1*2u?#4HQzK3Pu`*=LHR6IS{C#rS1c&;1yDqPLQvlCE? z;3Ie!qQ0egY7*|v#@pAsQQu1Z-i7CL@GN1%3dy6BHQ||7T#YQPl+7GgdgOENR*b`* zoQPJbrwh@89>C(+ZaeyA1m|?9uw(;*1$b_Sz)%nRR&DJL?fg;L2b=J+dX)maBT!GX|$<- zMm)a&S5&%zH6w2W1=6#gH8&5bAp`eD!wzA{h#t5h8``cLnl50c3-!@x&c0G;D)u$$ECaJT3$W9?wt^CJK@WMLoP5mpLQqdJD`BOq z3@bzh=5!VIJ2mKK9pwK8)`&UKjQQD$p0@*U9T>?8m>Cl>GbXbsY$}_^ro&!6lbwMz zrVCc8TiE$*GkcQlWZ$qY>{50yyPn<2_OOc}37m%&>nGT1wy~?&R`xtBAOB^$vC{s+ zjzPw|ncc%)WiPXPF>-U*<)ES0F@CSG*I>bVgT2Y#V&8%S-@{Jr9kvgn@gH^t`;fiQ zKEQbVn|;qNWQ#Cbi!mFPfWmIXn4O7nq*=BSqqz!na1`gwt^-$F&o;6R>=AYoI~yzF zIqY0WKtHg@xXit{H`j12R{4JB))0;~<58uqoD9R&XhK=M= zJetQ~zxO+jMKokQAH$8@#Le8o6L=y|;>kRPr}8wO&Q7q8pjFT0S$r(Q`*XOJ+ptpF z*%9^y&%>&mk5#h}nxJA{f)%=qmtzgBYCU2WpcyoLRNmEueG z6>sHjyq%BZ9e6$W1m4Lf@=4GpP2p4dG(MfrKw#?`d=~HGv-uqMIG>Amip_&8_BCYZ z+xP<5-WT!3d|yo-dyqZEUSyltbL;}Pm%YTEVo$Rt_&NMszKNg5&*z)@7JdQW z$}fbT>tdXnzKvhXFXNZOgY9D1upim2>`HbWyPaLewnIPmD5QwL@$GyE z-wEy5)%+U1i(kvH!`n!AYghIx%+9XJ)>bU-nzOvON86?3nu^)WyH|BRrR4rqa~3Y2vvTRYCEaWM=L}x^Rn6^P(KTmIch3sHIRlrP>N#DgS~FM4s?ko@ z3T=(rV7J;}jnZJZ$oy&sO8a#WTxx4nFuIjoQ=`<_Ei(VQK|uWH4_^D#4OHMaf8a8p zZcgvgrCkcJ0rNe+_}34X^@_rl`Fb6OGFmX>~Sk#iN_aBvx1E!O4h2B z>QPFydOR4=X4yE1YN;Y08)h9Cl@q>8r?;E`KnJ}k&?!qNYx_nls z7n%u5@f9NTnm{A8f<~xQ8KITR2z9ExS*iA>Q|Zl0k$HD6U)VF>dnNr1?DXtQ;7ZSL z+D>&OSE?g9X%I61)gISVJg(OcUTdZ*eOxCpzo`SH=(le0vVx#c9_Sjl)K=7ppR`@w zBKL3WThi6HK)LQ6ybc)ef#85X&o2`^zpU{1qM0;*c^4-7Y9*T_D%GqOneU{z3%i$h z_bu%6UG2UihLKZKQK{sW*-BnzSMq9yW{OhLT9GNg*5<2uLBP81<-L6?mvt{+*tUMwe?_0RWeI3{bKGZYtt$X481uNX&0(utq3=|S|FYK8o>h=e_8n|Au zy4QUjxMIQb?twc30{5+ed4RzEg&=TWD-aBP6A-w+2?*R@ylPf1@Abi8F6r*;TjcM7 z<&ZO1cK5AV*xNI=cXdzJoUUbl-92+Lgv#Yo_hpzs%v|E1!24Xf8`QmK&XTUB?s9?4 zx|VnMEa{%NLfjPJmJ>?oYw&E$y2agSUb!8jejj)skbdZP-wqPr25yo_g=HFh&|tBP z!)q19KZ$=3(n}&F zmsFk(d1WkQ6_Ql)AfXgNHYtN#QU$4_9TLZ6TEDSEd#uj_kMJ*boWN0EGYPvq&C5^v z&dbj$TNABGux`mYYTcrp>AMG?yRskj{W4`!YGl^eey^o&$cWE~4_uS>RQf;ZYHUd0 zrm-Oz6USDLy*X=Ua6)!g=npxyS-W)C>7ChECV!W*Kkc0CqlW#dH)mw0orBMp8Q~e( z8QD4E$=_v_XRH~!B0Dy#Jj$HCAo~5B7qVW7mEz~dFN$Ad-5!72m=x=-F{QAC41BV_ zPT7?8weq3XE!mdZ)JTG2@RK!D`Q+4ErYB@&U+M8VnzBFpsPaiWCov`QwZzYpGz81w zC#zifBR|nE-2c z>VrtHrGB0kl$MYYpH`SQJ#9Jib8s@tjcHG%eF=PqQ%ZBDUqU&R@l0bwa>Ct-+RK=j zvBsT%{S`yf%^ADL-VDsnL~ll>HQ8C&3vz06UZ9c6dc~cnr&P0Og=$0%^yEMyTpR_i zL`jrB3M#Q$y{udCcLM%yx9+k&Vl&%bz~|lE>bz*snL*4z(xn7q76xN~q!GIzKkS3b zuyd-$t|S$^i8~PM(+-kz?dKgbV%469k(0>8@8kAm* zS<=eqV1|&4Y=X3V7Usoep!WpO`*zHao%p0cCcT=cqHb^K4gHXkT)*RuE6|i9Wv@lL z4(WQN-6;PQ$~=SgGVZ^M^g7a;NS`4cLOP7}h3j{&Me;@RM+!t5oGq)ix!}C=rSB<~6H|KJ?@$_P*?X8vGtw1Dw6 z3Z8ux`D@5uNB#!#H<7=E{B5Lnk={r85b0y2ej%)n&)g5WKk@+Nfyjf9hv1noq;Mp}AMr?}Xrx%A1lLbI2`L3B z4JiXD3n?3PV#WPp*B`tTsSI_MqpnK))`olIkj5iTz`cq1eG(GJ1$1!|bGO{}8=HmH z3cs6wz)SDn&`Ef)5{y+XY!h{uC-ul1fwvCi6YzZ^?wyNgHzA#ebUxB%q%BAnfX42? zb9W-$g|rvxZlrs#KJSCZ6yl9 zb_D^oQO=C^sK+@y^GBaKJ)A*V?3w9lH{>uq zavmq+adMp`*GY1nB-hEVjb`Vq*zP)6xyk*LbL=}8&W8({ySgrftJYoU-qly?+#Hb=h6=^9)OF3G~(Nd0S`=6=`rAW)*318+H}3t3jJN>}t?x4!at(n!~OJ&E{yfhh}?d zHb=8Ln$6K{j%IV%HBGy{7&cAAy;wF)%e|O3P1C(JeTsRbV=!(5jgMj6D8`Lq+$hG4 zV%#(f$YIQZrgxNd41WmGNILE`(_LrM|z+_m?Zh5V31N3C)mB z#IHi?qpnl(Q(bpjOL>tZEP{hYG@Nok^z9zHJcFPMNjh98dEaGJmFN=6tYe&KwUPdIWwIgAz z9SMtgS;Wg?*QUyX0UFwYN>N3&w3b+d1=a~09b}oWe(##5bJRM=C>jqC2z7akKpSS&m zG`ij`mfnYhAJ43|y|#G|+fCRm%{D#VpZ%W6=WoHx3)tP;>G?t|z6dL~vbk2)H6wO3 z*zOFwjZ7=DtOmvwGoMn|&Fc6Jd=_qjTj4giUHxBG-;uMb88Ki+444rEX2gIQF<=S1 zTgL7dYk5TK88Ki+444rEX2gIQF<^$T?@KeNN0pI9J*JFI>Q}yd5}t-<;WzfZ05AEx z9d<$%UWOj%g?`9Gg)FKf@Cx$l1~Ov{;Xy|EyHSyON@SiAnZw`qr5VqK%E)@QIxaGt z_uH0z@~tzx$SB`9+Vw#zia!K5H1DCKd+6w%u0M`d#*V+!@ptiVKa?4d(a=*g)JH>4 z(a?^}Yq0-c!6|U6%z3li=Z$j0Gx^cCD9?d&dFuDr{@0?>zkxr1i|PEm&E34r5HB-C zYrP`<5Y6@SGDEyfL8Kq%hwJIs<9g)>;X~^Cl=1z*#iufyNKH{hG_E%-Kk$GP8y@4@%s2XMEn?;azyd)>pjPyIjC z#vj@LckpBQ3H%i9hrieEpTh(2AUveq55ptQ`=$CHRsMtWG3DdRC$#fd&il3UN##?@ zrQSGCS3 zBkFoWI&U+?+YIqGRaVt23#hWJUf!n4x_Z0TD34Me-5lXby;Xx2f|s1)e5y@nM<4u*_gsW-u%>7?v3fi+44irq0t;d73IuQ)Q`nmO9AOx?W2IxPv&cGQ^j1tqZ|{{QTRgAHU zBC8l<6-8Dt#wv>9N`-c^b>}E0g?6AI)WH&dNLG#WM3t zc<9S%$yI1D%dZq@aW}tGNd3w+$`6S2*W%B0qW$$G_CagPB76BTDc$T^pMlT9EpRK` z2DiiKwBbvx{bjfVz5;SD+RpPSeSAtEpVG&t^zkWud`cgm(#I0AEFsGhvMeFX60$7e z^{gPq=N0~>z!I`7AA_2|X;KpC$D3C&TS0MeEUAYj^{}KIOX@!$LmB2b`uL4uexr|- zMU%= zNa2ah`FOsCExygsZ*M-p;%3r(<6?0;@{Mco_*&AxF14hvk~%A?vywV1sk4$gE2*=R zx>>TsELmcfEHO)#$Uz=p9S7$bhs!G-a-E0a33Wv-@oQz|6Hh54r+7vgdBvgfi9No{ zK_3k8n#&<_iIvL8ConC|Db^?>uXq)_8aBX*u(A0BO;wGto}jI&S-HflTw+!(F)Npt zl}pUZC1&ONX{;nKd4Sf2S1IT6lLu&N zSdQ`lO%0o+d%!H+1J-h^B)PTnkE5+UUZ-5oGoDI2XX4R$IM5o?)!Oqk3I9-|u|&=h z8cX4ethr8_kMiu$M=4G@5lEZ+Nse_g1ZUsCb*m6Zi2g)v_~Juj5C-2`_N+)Z#d!O?#F?8nW1+Dd3Dp{0a|5`oV*KQcmz7 zkpV(uwq&`II58_Cj zqKOhslxU(v6D67` z(!>rPw$8)WdDuD+TjycxJZznZtshcL;aLx_nG)|=r=1e-S*M{A?-`srP)l`Msvky6 z2afKC@M)n|jx&F8Je&Y0!N%r;wDce??VzO{v@{`SpOCXp$b?EfTAij!JX-K2;mM|H z>_OhEPHVx9j@EY2+74Q)&{~Do_R!iMTH8ZwRrd;xCiyev+2@%FFatv?yJ#flIL2sX zhDNG1QlXJ5Uesu$N+T88DC5QuiSHuu84{l%@fi}IA@La!pCR!X60hP#6)&oIQN@cY zE|f^TiVIa-sNzBu7pk~WCG8oKo+0HKQjU4#m_v^F<0>vxNZIe>eclc`Aqy`#G!&XRA^@z8+f%9vW#I_#;`17Se7v?Mipo~ z<|hj@9`ln0T95h30?o(#CtjID(#I49OM%r1%h}cyUw@R{%epyDp zETdnR(J#yBmt{oE%8OS8S;n~0$+*$UI8KhXM<=5!DstHZtID;rj1h6HB!=b1ue{im zZ;wz$SzBlRGG^!s<}dFyYp|Ffoy5Q*mW|1+&T~H?yyn|+^{Z@gqx(=N!`VK+72fUh z2b9|AbT2QPdPOY(_@T0W7Ii_ zL3>>(aizqSB0dlELlu6g!VgvSIYwiHuAcBYgIW+Vc-W}rvgVVSI!wb1{5DGM%4S|C zTigt~GL8zPf`D?~Q`dvGqC*St@@Wxh7ew|48}Zhd@6 zA9wRwJ(=GZ-4}9kF!OKi`$M<{E``hBa<~Fo-0W*}vky0WaWjvbeeDrIFK!ODM*sul zm?cN6K;ag+6>fvun>*!o`OKfge~148{}cWK{ulfud>+04UxdSr68^Wo{T2Kl_`mQ~ zefxio|7-2}n*Mzq{sz7Q--K_$x8XbVc+mX_=lm_)1NXvxj`^YT@Eq^M@je{y!|}d! zB=HMnYc!F?^By*m#q%C^lEw2Ld1k)N^L(4<`8Lnk%;{7|3# zd4MnKlS2>iM}6|>0Y0fuE{@&GHck&%E-Z_WIn~*v7X4b)aUT>2K*vcA* zvHdwrpD?nD8Qz_kz6;ZfnTtfvtr&j;jU7HK97%JOM;sejTx4(+o@%4tg`Ny&$(%a* zz&U0a&V}=PvDehw);?c(IaM zqveqUpD9M3D@%`&#};<>Hod$+k0K8?_mTSh7%Rr;L&nYTl#LZ9`JIH{8Q074%%|0N zyKF7;+=pyG33Ua$PHeDsgZ>wiS~QRPkA`vx;BE9iNhk;po; zp&P7cIo8PJbyl&QVZGWLtjX_|d3IZk-z`JxcGtYyn*8O~-LJ65=rnAV{8K{2f%rZvR0hM3k6&l+M`gFVFD!L#h4$R4WfA}iNS z4Y8*o_B6zv1{>NgrZm{m6g!#{`x6XFFeJ%5XaDo?B5Z>lunTs>AQWI2iZBM_Faa@h zJgH1z3L3B9dv)d_l+hDhit{Z&!5#>kWMxQ?h zH<86^S}tL3opuYf6LSTlH1cxlZ?3ifdK$Vxq`F;gH(}vgN59-YI`7Em9XV_aFvY^( zMTaFvkK*qTkLX%fU*3d6ck(88u_tT3uzC|uvBmW+GIHKZlb85~ORQpuR^H@#tJF80 z`i1ZVcl(V@>u$qQ>YT!g*I>m;qyM#$BlET4b>!dsk5ri#8!-4FVR0TcHS{5(^opS6^A;}W_}D>;_Oxo zTIJ{^uD7J^2f{;aCY94jpMm-%r5Nl;Swcg>Ejh#Bev#fO9dgmS6IbQqYKdh~B z&L$r5B6nK0>RCPTQ91XE&@N zn@#@CwRf3T#cH!_jSD`V%KL1RJFzY6jby!stY4Gb%v4*}p}&Ya6-SL*AF{Oheevx3 zEcGdxuJBts9r+@^mF2T`ll|k)*ylR?UFSt-PP*2;nLlm*im%xnI_cWj+=<&eaXX9G zyK#Cq?(W3hEZ$~uHjAsf@pKQ4{s>3!!_Ob#=Y1G(ch?u2-y`c9UA%G&KJKs62 zZ>N3Q(tJ!m?mt97evtMf`fyY8TeIz0Wbc#Y9G26uhmI|XCnVnD^$1A~s5$({5a|S` z_o}JPHvFeS-^7edNP7ZP>SPs6DYNPd&8>7q)U{rwZPexH8AlH|I_@`Ycl1v8#_>>G zDrSy0_qk5l;`K82wv@ds5p|at6HS<(D4U;{!1EnxGe3`;6&>OimidL#661~uNL;eeh*kIbh5&Vb*8Dtj~m5pNY&*;eL2Xy}xkG!^&UTeiELBXW=*6@dCW$^LE$? zS$G)^TsbqOj=eAfqfmk}?1L)QpsxMX5Wh_Je0%c-6LRs8czW3NCL+QE#u7a!Wy9TcH{q^ucbIu=v535gn?)r%GM&-xgkDHI19UUUU&|xrV zi>-_3ZYy6;hwNZdyTXIsP9Gt+$eLSTZ8E&aAtaV;%c>){z1^92^OpC}$Gv(x;w}=7JEN|}agCPDMx41{ z{Uhq{b@o&{w#4j3u(Il|`^wbrpRv+l$Tec+?1PT_8M)LQ^`!B0%uqgL%>1{m`TMRJ zt6xvk`#o y5qvcm21K*JkoM-PrMa5l7g@y~cAtH->x8xb1FZvU`lf?luOxS3dD5 z2DE0eC-pnnJ0pHtD@QufxvNnruHQ8h zixpUr6NEp`sXx{&l+==t)uFP6`5D6+M;tmUIWQxcpN&KdLh7Tg-sj3asin5Eo>=A9 zk@!A6YUN3hy9_(JS6gFTw%Zw5(oaZ#ex5Ypx4kQUyT17_9lcCPu}*V`qju8Kh@L%7 zN7Hol6dgUmk32|rTgh$(*`1-+yX2~|4(pd>cqSQcB*Qn6;iDs`c7@yLfW9Hnx0VJn&*2(^~D*Bwe2bG zs%h7rbiLykM#p&a0xfFA_{dHp<6dRlr;K})hq@OT_aWmRWZZw8TP0bMPxQ$r`qF!dt(B1#IYmWIQIS*h z$tn6$=?#+9OR26;(%ywD^gn0&FG=9@dVIJQ_OZ(S*AT1QV`ck+E7ymeD{7k~s+b?D zXlq4VE811@>+P7+a5vPI2aFay!3f+HH4EBr#F!W{CPs^i(PCn>m>4Z4WF?uwO2eZZ(NF)B=q3KOHk#HcVaDopftxlv(aRG1hQ zCVJiPjzYgX3jOXV^t+?b?~X#hJJMA%l2tR3RWp)R8C}KbG45T?&8s}&I=_ae;2C(% z_s_$Nunl&=F4zrw)R}`m7=S_h3NQ>s7=v+`fC?r}DifH32JDBX%)JX1!%|o-&a8x0 zum+6MjWQFX%)}^jpBa&TT^ry;@XHOeYE?68)vnXvbT|{vN@qplHzF~^-I@csNL}xA z&ZX&$NX&*zw&#K3w;?U9mT9$4t3$L}r`0;G1{VftwN9&bTCLNnXQ{#2V9g7y#u|b_ zT8(uCle9WXtFhuZ=IleOWo#`Q=a-H1%f|U-LjgB(&{9wPPVmLr`0m{m$AQ`t`vz?BC$dw zR);*NzUSdZ*akab7wm>T>dZkO48Wj$1sH}RjKMfeK!xQ^DifH32JD9>UU$J_SPIMC zTUZIJU=6IbZyg*1v0^0dMw-8APB+bSG;7UqpLR62 zH@7t>nq_?W9j|6xJ(F_>sbRvqulX{qr!Tddz4mv(adT&MK8es?B5$U-AK#AnYVOnO zi9;Pi<{53;-}z3j_UUI)8-C5 z;@3aprJi={Us*jNwdhUfl}cxXwsv&n*_><^mvh$EIZuD~VO46;t$pP2SItM84|{*Jy=TaCvL0wY z-uzzkyJpxjo}TqRa+_-Yy7`^Cdh93Zxz}9(50FheLR^>(+HnG2D6CKNlbDM+BtY>}A`i18G%^!Q_*ZuJKt-96tBLDHM-ah7DZ>ISZ z-sKm{ZJi_1dct1jF@V*Dzpm~n(^GAjHh3lHRcU>`nYx0Y&-Q`3Fw2ZiYaBl>>dfu^=YFD*8IdOZRf}KijQ3*ZdiG@;9IrFlJI?TF zb9@f_q1mrN$x7IHFM6u$XV~*BXXm&+@4)n9>No05zfo?E&i8O?uccmX#y6dqe^|ef z+Ev)r!>;^t^CzvVm>uwH{z>ycHb2Fx@*(%%^%8gHaj)6mk^4eF->SvE=uGqDof;ypy`Zn@b$+MSx1`nluDVh$)N17`|J(9PZTYy@nfk4WQuC~#Q!D9| zQxBAW7yO=kwd;8>_Tal*hnymdJ1CE`ucV&v1?hJSV_Iv=oMW);nbe02g}*;Mljhnm z`^kSv#pb29yS?K{66^dzJ)Wz#)F|duqprPjC4{PoBHiv-E!GnG+vP zpE>by&z#tpdD=53wq%}(Cr^0(geOmA%IT9QmZi^Fi6_o1?fQ%O?>p_++^0?2u&J~A zfbv*vUHFP8*(|mz?gw?AH5i{(+Bf&i!3+{co{@ zu!NlEW2x)3aFTK%mf2oTo-0VSg^g)BcTVfvm0H(9Tr-|()WItEGUh|0&8`LBKo+MR z5=YV1T73*{pD~L#b6wh>xK`8|bsYSPvpWbG9p~s)ZKt!#6U_FW$~s$r=gyAjSN_Yr zPQ>6AKcWS#*W9NQwETq5?gL8y>|x%X<7uZ0;=MTiyQsa@+Kzp}n`O>f4l54mMX^mzs?~>ue>fH$LjO3u6@!hx_mnyuhs7sj#4f} z>;8M(gKr_)(!wU?LM%$R+uyiW)ERXg{ED+X2pNSGTeTg_F5Q8~xD(ocTW5!@u9~OYgX?^yd%_QPIjI|i zuRP52&%!Fw*l^=V{?ot99Q*G*ZY^`dCqI4TCu1hhH%t5t&)bR~QQI;-d9!D${xI`+ z*OIjUE>e;CCj(Ah%*sf1{-j8QO&pmn6b4CxbPkoC>kcajZ z(m&IK;9guO+Oi(LlWvC=BL=Kbb?{$3+qKKnO+W7HpXmC8$QkD@n{7dtH89uOYSqxH zZ;@-Pn*Ss-&mH|@`w698^bybEeTO@1AI{w1Sy6wQ`ET)b)!7>T4?%ae;~A;{*|p|9 XCsnH!M?balzj!b5tkplUC-eUSNwFir literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/log4j2.xml b/fj-doc-mod-openpdf-ext/src/test/resources/log4j2.xml new file mode 100644 index 000000000..51b9129fc --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/test/img_test_teal.jpg b/fj-doc-mod-openpdf-ext/src/test/resources/test/img_test_teal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8213e15966822a84443ec9fe182cfbf32c7b75f GIT binary patch literal 10632 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 F{$IWY;d%f7 literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml new file mode 100644 index 000000000..c60ac3737 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml @@ -0,0 +1,58 @@ + + + + + + 10;10;10;30 + excel-table=print + + Basic example + fj doc venus sample source xml + fugerit79 + en + + true + /css/test.css + + header test + + + test + ${r"${currentPage}"} / ${r"${pageCount}"} + test + + + + Test times roman + Courier + Symbol + Symbol + Test default font + + + Name + Surname + Title + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml new file mode 100644 index 000000000..1908770f3 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml @@ -0,0 +1,61 @@ + + + + + + 10;10;10;30 + excel-table=print + + Basic example + fj doc venus sample source xml + fugerit79 + en + + horizontal +

+ header test +
+
+ ${r"${currentPage}"} / ${r"${pageCount}"} +
+ + + + My sample title + + + Name + Surname + Title + + + + + + + + + + + + + + + +
+ + 1 + 2 + +
+ + + + + + + + \ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_fail1.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_fail1.xml new file mode 100644 index 000000000..f8335b706 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_fail1.xml @@ -0,0 +1,58 @@ + + + + + + 10;10;10;30 + excel-table=print + + Basic example + fj doc venus sample source xml + fugerit79 + en + + true + /css/test.css + + header test + + + test + ${r"${currentPage}"} / ${r"${pageCount}"} + + + + + Test times roman + Courier + Symbol + Symbol + Test default font + + + Name + Surname + Title + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/test.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/test.xml new file mode 100644 index 000000000..f8d34b0a1 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/test.xml @@ -0,0 +1,44 @@ + + + + + + TitilliumWeb + 10 + 50;50;20;20 + 1 + Test doc + Fugerit + Venus + en + + + + + + + + + + + +
+
+ + + ${currentPage} / ${pageCount} + + + + Bookmark 1 + + +
+ + MAIN TITLE + Secondary title + +
\ No newline at end of file diff --git a/fj-doc-mod-openrtf-ext/README.md b/fj-doc-mod-openrtf-ext/README.md new file mode 100644 index 000000000..4b72a7d1d --- /dev/null +++ b/fj-doc-mod-openrtf-ext/README.md @@ -0,0 +1,31 @@ +# Fugerit Document Generation Framework (fj-doc) + +## Openrtf Renderer (rtf)(fj-doc-mod-openrtf-ext) + +[back to fj-doc index](../README.md) + +[![Maven Central](https://img.shields.io/maven-central/v/org.fugerit.java/fj-doc-mod-openrtf-ext.svg)](https://mvnrepository.com/artifact/org.fugerit.java/fj-doc-mod-openrtf-ext) +[![javadoc](https://javadoc.io/badge2/org.fugerit.java/fj-doc-mod-openrtf-ext/javadoc.svg)](https://javadoc.io/doc/org.fugerit.java/fj-doc-mod-openrtf-ext) + +Renderer for rtf format, based on [OpenRTF](https://github.com/Librertf/OpenRTF). + +*Status* : +Basic features implemented. (Sample JUnit [TestFreeMarker01](../fj-doc-sample/src/test/java/test/org/fugerit/java/doc/sample/freemarker/TestFreeMarker01.java) is now working). + +*Since* : fj-doc 3.4 + +*Native support* : +Disabled, native support will be added in a future release. openrtf-ext native support must be verified. + +*Quickstart* : +Basically this is only a type handler, see core library [fj-doc-base](../fj-doc-base/README.md). +NOTE: If you have any special need you can open a pull request or create your own handler based on this. + +Depends on renderer : + +``` + + org.fugerit.java + fj-doc-mod-openpdf-ext + +``` diff --git a/fj-doc-mod-openrtf-ext/pom.xml b/fj-doc-mod-openrtf-ext/pom.xml new file mode 100644 index 000000000..bbc405707 --- /dev/null +++ b/fj-doc-mod-openrtf-ext/pom.xml @@ -0,0 +1,66 @@ + + 4.0.0 + + fj-doc-mod-openrtf-ext + + + org.fugerit.java + fj-doc + 3.3.2-SNAPSHOT + + + fj-doc-mod-openrtf-ext + Renderer for RTF format, based on https://github.com/LibrePDF/OpenRTF + + + 1.2.1 + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + com.github.librepdf + openrtf + ${openrtf-version-version} + + + + org.fugerit.java + fj-core + + + + org.fugerit.java + fj-doc-base + + + + org.fugerit.java + fj-doc-mod-openpdf-ext + + + + org.fugerit.java + fj-doc-freemarker + test + + + + + + https://www.fugerit.org + Fugerit + + + https://www.fugerit.org/perm/venus/ + + diff --git a/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java new file mode 100644 index 000000000..56243f34f --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java @@ -0,0 +1,58 @@ +package org.fugerit.java.doc.mod.openrtf.ext; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; + +import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.base.config.DocTypeHandlerDefault; +import org.fugerit.java.doc.base.model.DocBase; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPDFConfigHelper; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; +import org.fugerit.java.doc.mod.openrtf.ext.helpers.OpenRtfDocHandler; +import org.w3c.dom.Element; + +import com.lowagie.text.Document; +import com.lowagie.text.PageSize; +import com.lowagie.text.rtf.RtfWriter2; + +public class RtfTypeHandler extends DocTypeHandlerDefault { + + /** + * + */ + private static final long serialVersionUID = 7532380038613171305L; + + public static final DocTypeHandler HANDLER = new RtfTypeHandler(); + + public RtfTypeHandler() { + super( OpenPpfDocHandler.DOC_OUTPUT_RTF, OpenPpfDocHandler.MODULE ); + } + + @Override + public void handle(DocInput docInput, DocOutput docOutput) throws Exception { + DocBase docBase = docInput.getDoc(); + OutputStream outputStream = docOutput.getOs(); + String[] margins = docBase.getInfo().getProperty( "margins", "20;20;20;20" ).split( ";" ); + Document document = new Document( PageSize.A4, Integer.parseInt( margins[0] ), + Integer.parseInt( margins[1] ), + Integer.parseInt( margins[2] ), + Integer.parseInt( margins[3] ) ); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + RtfWriter2 rtfWriter2 = RtfWriter2.getInstance( document, baos ); + OpenPpfDocHandler handler = new OpenRtfDocHandler( document, rtfWriter2 ); + handler.handleDoc( docBase ); + baos.writeTo( outputStream ); + baos.close(); + outputStream.close(); + } + + @Override + protected void handleConfigTag(Element config) throws ConfigException { + super.handleConfigTag(config); + OpenPDFConfigHelper.handleConfig( config, this.getType() ); + } + +} diff --git a/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java new file mode 100644 index 000000000..e10d4806c --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java @@ -0,0 +1,64 @@ +package org.fugerit.java.doc.mod.openrtf.ext.helpers; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.fugerit.java.core.function.SafeFunction; +import org.fugerit.java.doc.base.model.DocElement; +import org.fugerit.java.doc.base.model.DocFooter; +import org.fugerit.java.doc.base.model.DocHeader; +import org.fugerit.java.doc.base.model.DocHeaderFooter; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPdfHelper; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; +import org.fugerit.java.doc.mod.openpdf.ext.helpers.PdfHelper; + +import com.lowagie.text.Document; +import com.lowagie.text.DocumentException; +import com.lowagie.text.Element; +import com.lowagie.text.rtf.RtfWriter2; +import com.lowagie.text.rtf.headerfooter.RtfHeaderFooter; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class OpenRtfDocHandler extends OpenPpfDocHandler { + + public OpenRtfDocHandler( Document document, RtfWriter2 rtfWriter2 ) { + super( document, DOC_OUTPUT_RTF ); + log.trace( "currently unused parameter rtfWriter2 {}", rtfWriter2 ); + } + + @Override + protected void handleHeaderExt( DocHeader docHeader, PdfHelper pdfHelper, OpenPdfHelper docHelper ) throws DocumentException { + this.document.setHeader( new RtfHeaderFooter( createRtfHeaderFooter( docHeader , this.document, true, docHelper ) ) ); + } + + @Override + protected void handleFooterExt( DocFooter docFooter, PdfHelper pdfHelper, OpenPdfHelper docHelper ) throws DocumentException { + this.document.setFooter( new RtfHeaderFooter( createRtfHeaderFooter( docFooter , this.document, false, docHelper ) ) ); + } + + private static RtfHeaderFooter createRtfHeaderFooter( DocHeaderFooter docHeaderFooter, Document document, boolean header, OpenPdfHelper docHelper ) throws DocumentException { + List list = new ArrayList<>(); + Iterator itDoc = docHeaderFooter.docElements(); + while ( itDoc.hasNext() ) { + list.add( itDoc.next() ); + } + Element[] e = new Element[ list.size() ]; + SafeFunction.apply( () -> { + for ( int k=0; k this.testDocWorker( "default_doc_fail1" , DocConfig.TYPE_PDF ) ); + } + + @Test + public void testCustomFont() { + BaseFont font = OpenPpfDocHandler.findFont( CUSTOM_FONT ); + Assert.assertNotNull(font); + } + + @Test + public void testOpenPDF() { + boolean ok = this.testDocWorker( DEFAULT_DOC , DocConfig.TYPE_PDF ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenHTML() { + boolean ok = this.testDocWorker( DEFAULT_DOC , DocConfig.TYPE_HTML ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenRTF() { + boolean ok = this.testDocWorker( DEFAULT_DOC , DocConfig.TYPE_RTF ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenAltPDF() { + boolean ok = this.testDocWorker( DEFAULT_DOC_ALT , DocConfig.TYPE_PDF ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenAltHTML() { + boolean ok = this.testDocWorker( DEFAULT_DOC_ALT , DocConfig.TYPE_HTML ); + Assert.assertTrue(ok); + } + + @Test + public void testOpenAltRTF() { + boolean ok = this.testDocWorker( DEFAULT_DOC_ALT , DocConfig.TYPE_RTF ); + Assert.assertTrue(ok); + } + +} diff --git a/fj-doc-mod-openrtf-ext/src/test/java/test/org/fugerit/java/doc/mod/openrtf/ext/TestDocBase.java b/fj-doc-mod-openrtf-ext/src/test/java/test/org/fugerit/java/doc/mod/openrtf/ext/TestDocBase.java new file mode 100644 index 000000000..0cd4ca1a1 --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/test/java/test/org/fugerit/java/doc/mod/openrtf/ext/TestDocBase.java @@ -0,0 +1,42 @@ +package test.org.fugerit.java.doc.mod.openrtf.ext; + +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; + +import org.fugerit.java.core.lang.helpers.ClassHelper; +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; + +import lombok.extern.slf4j.Slf4j; +import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfig; +import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfigFacade; + +@Slf4j +public class TestDocBase { + + private FreemarkerDocProcessConfig config = FreemarkerDocProcessConfigFacade.loadConfigSafe( "cl://fm-test-mod-openpdf-config.xml" ); + + protected boolean testDocWorker( String testCase, String type ) { + boolean ok = false; + String inputXml = "xml/"+testCase+".xml" ; + DocTypeHandler handler = this.config.getFacade().findHandler( type ); + File outputFile = new File( "target", testCase+"."+handler.getType() ); + log.info( "inputXml:{}, outputFile:{}", inputXml, outputFile ); + try ( InputStreamReader reader = new InputStreamReader( ClassHelper.loadFromDefaultClassLoader( inputXml ) ); + OutputStream os = new FileOutputStream( outputFile ) ) { + handler.handle( DocInput.newInput( handler.getType() , reader ) , DocOutput.newOutput(os) ); + ok = true; + } catch (Exception e) { + String message = "Error : "+e.getMessage(); + log.error( message , e ); + fail( message ); + } + return ok; + } + +} diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/fm-test-mod-openpdf-config.xml b/fj-doc-mod-openrtf-ext/src/test/resources/fm-test-mod-openpdf-config.xml new file mode 100644 index 000000000..aa6bb74f9 --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/test/resources/fm-test-mod-openpdf-config.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Bold.ttf b/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b51a4d638774a8b5636e7cbef7e0a4d4b3ddf582 GIT binary patch literal 53896 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 z zWmev})p+_g&rrSBY8>}C<38`;U7uU;eb!apXzjIHN1xBl*7qoRqo?fib?>t7^Iq(r z&o|O{T5s`IYt8x*@n-97-fdl&`?mM@PPU@Qspcaej<@)7+u|+0oTr<*elItat~pWF z%fq|AqK&Ps{q1D^I=Qub0-dMl{L!A2HY;tGXO|JMNH&kDv6Y^`nfWvrn`WEnXeD?o1gXtLVH>t|0G#ovd>a|UaHufF<8rA3)-;Sx$DQ;S8>;3 zJl=#)ort$RGgyAxIh{Dd@2U7X4b8AHrR{UFbC1-z7UFu-alM5Zw7(OoGV>BR4KLm@ zDQ1z?Y<&!ApD~6wb57cyxK`8|bsV_G*)0T*<}01mwv=9;U_Rwk+L`@rpB*a#{r_zX z%>QNf5n7vV?QbWNU}))NTePsf&C_EGy0`*-Zi);#jx&73xMg54dfpEJnJ zn%^W8_e|ps%VK@Csvk^)g}4(o6qYroX+ypqWIMEdEEqd0?7a1f_y1e1?xa&_Y4(XV z_F9%RRoPQ%Y3FB#)@GmRL40y)4_bS3jvmwe%+cpLt{wmDBtw^@oj6IqGt5B8V+uZX zBHEH+5jr08)8BD?@dO<2cN_j2h&tQoJa!oVcOn=V?_mcH*Q3dB1X)eh$B_1$#}Mlh zX8nz8MV(Q{fm@v2LX;04X0?Skoy)3b($4H}c6R9MaWwk>Z_A=&M9ZaC#hQFQiNjnj zjSZjro!fYPkmF!WueOdz<)f7=MA#!L|f*< z9qI4zq@mNn(VP{t{w&vJwW!~9_22LMeUUTHJz}f{UDn39&abS7R=XEkd9!0>2_Kw_2tB0-fG{Ya~{ybKz8mrN&``+q}HK+d2wK~?F(yGIvpIY@NK2xk+ J6)Ps@{uh*&W)T1Y literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-BoldItalic.ttf b/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d0fe23bed28a03d76afc7e111a0f2b5635fef336 GIT binary patch literal 62924 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

p;>%*WBkH(Vr%x3@LFtA8K_ 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 E2f#0LCjbBd literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Italic.ttf b/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..266d5cb8107eccc483b806dcabc9ae86dff2d8fa GIT binary patch literal 65284 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 literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Regular.ttf b/fj-doc-mod-openrtf-ext/src/test/resources/font/TitilliumWeb-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a54ad4b93dea7fefe7b6f30ec7470eb7c8e41159 GIT binary patch literal 57392 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 XCsnH!M?balzj!b5tkplUC-eUSNwFir literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/log4j2.xml b/fj-doc-mod-openrtf-ext/src/test/resources/log4j2.xml new file mode 100644 index 000000000..51b9129fc --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/test/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/test/img_test_teal.jpg b/fj-doc-mod-openrtf-ext/src/test/resources/test/img_test_teal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8213e15966822a84443ec9fe182cfbf32c7b75f GIT binary patch literal 10632 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 F{$IWY;d%f7 literal 0 HcmV?d00001 diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc.xml b/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc.xml new file mode 100644 index 000000000..c60ac3737 --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc.xml @@ -0,0 +1,58 @@ + + + + + + 10;10;10;30 + excel-table=print + + Basic example + fj doc venus sample source xml + fugerit79 + en + + true + /css/test.css + + header test + + + test + ${r"${currentPage}"} / ${r"${pageCount}"} + test + + + + Test times roman + Courier + Symbol + Symbol + Test default font + + + Name + Surname + Title + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_alt.xml b/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_alt.xml new file mode 100644 index 000000000..1908770f3 --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_alt.xml @@ -0,0 +1,61 @@ + + + + + + 10;10;10;30 + excel-table=print + + Basic example + fj doc venus sample source xml + fugerit79 + en + + horizontal +

+ header test +
+
+ ${r"${currentPage}"} / ${r"${pageCount}"} +
+ + + + My sample title + + + Name + Surname + Title + + + + + + + + + + + + + + + +
+ + 1 + 2 + +
+ + + + + + + + \ No newline at end of file diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_fail1.xml b/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_fail1.xml new file mode 100644 index 000000000..f8335b706 --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/test/resources/xml/default_doc_fail1.xml @@ -0,0 +1,58 @@ + + + + + + 10;10;10;30 + excel-table=print + + Basic example + fj doc venus sample source xml + fugerit79 + en + + true + /css/test.css + + header test + + + test + ${r"${currentPage}"} / ${r"${pageCount}"} + + + + + Test times roman + Courier + Symbol + Symbol + Test default font + + + Name + Surname + Title + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/fj-doc-mod-openrtf-ext/src/test/resources/xml/test.xml b/fj-doc-mod-openrtf-ext/src/test/resources/xml/test.xml new file mode 100644 index 000000000..f8d34b0a1 --- /dev/null +++ b/fj-doc-mod-openrtf-ext/src/test/resources/xml/test.xml @@ -0,0 +1,44 @@ + + + + + + TitilliumWeb + 10 + 50;50;20;20 + 1 + Test doc + Fugerit + Venus + en + + + + + + + + + + + +
+
+ + + ${currentPage} / ${pageCount} + + + + Bookmark 1 + + +
+ + MAIN TITLE + Secondary title + +
\ No newline at end of file diff --git a/pom.xml b/pom.xml index b883e64d3..342c96c8c 100644 --- a/pom.xml +++ b/pom.xml @@ -98,6 +98,8 @@ fj-doc-mod-poi fj-doc-mod-fop fj-doc-mod-opencsv + fj-doc-mod-openpdf-ext + fj-doc-mod-openrtf-ext fj-doc-val-core fj-doc-val-pdfbox fj-doc-val-poi @@ -166,6 +168,18 @@ ${fj-doc-version} + + org.fugerit.java + fj-doc-mod-openpdf-ext + ${fj-doc-version} + + + + org.fugerit.java + fj-doc-mod-openrtf-ext + ${fj-doc-version} + + org.fugerit.java fj-doc-lib-simpletable From 525cf7fdd90b87a5b4c881bd209e23e5f6e16cdf Mon Sep 17 00:00:00 2001 From: "Matteo Franci a.k.a. Fugerit" Date: Sat, 3 Feb 2024 21:13:42 +0100 Subject: [PATCH 2/6] Fix sonar issue #111 --- .../doc/mod/openpdf/ext/HtmlTypeHandler.java | 5 +- .../doc/mod/openpdf/ext/PdfTypeHandler.java | 3 +- .../ext/helpers/OpenPpfDocHandler.java | 32 +++--- .../openpdf/ext/helpers/ParentElement.java | 4 +- .../mod/openpdf/ext/helpers/PhraseParent.java | 4 +- .../java/doc/mod/openpdf/ext/PocIndex.java | 99 ------------------- .../doc/mod/openpdf/ext/TestDefaultDoc.java | 8 ++ .../resources/fm-test-mod-openpdf-config.xml | 1 + .../src/test/resources/xml/default_doc.xml | 15 +-- .../test/resources/xml/default_doc_pdfa.xml | 16 +++ .../doc/mod/openrtf/ext/RtfTypeHandler.java | 3 +- .../ext/helpers/OpenRtfDocHandler.java | 5 +- 12 files changed, 62 insertions(+), 133 deletions(-) delete mode 100644 fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_pdfa.xml diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java index 867833a06..fb60b9c8e 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java @@ -4,6 +4,7 @@ import java.io.OutputStream; import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.doc.base.config.DocConfig; import org.fugerit.java.doc.base.config.DocInput; import org.fugerit.java.doc.base.config.DocOutput; import org.fugerit.java.doc.base.config.DocTypeHandler; @@ -26,7 +27,7 @@ public class HtmlTypeHandler extends DocTypeHandlerDefault { public static final DocTypeHandler HANDLER = new HtmlTypeHandler(); public HtmlTypeHandler() { - super( OpenPpfDocHandler.DOC_OUTPUT_HTML, OpenPpfDocHandler.MODULE ); + super( DocConfig.TYPE_HTML, OpenPpfDocHandler.MODULE ); } @Override @@ -36,7 +37,7 @@ public void handle(DocInput docInput, DocOutput docOutput) throws Exception { Document document = new Document( ); ByteArrayOutputStream baos = new ByteArrayOutputStream(); HtmlWriter.getInstance( document, baos ); - OpenPpfDocHandler handler = new OpenPpfDocHandler( document, OpenPpfDocHandler.DOC_OUTPUT_HTML ); + OpenPpfDocHandler handler = new OpenPpfDocHandler( document, DocConfig.TYPE_HTML ); handler.handleDoc( docBase ); baos.writeTo( outputStream ); baos.close(); diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java index 6806ad25b..4a3f29d5e 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java @@ -4,6 +4,7 @@ import java.io.OutputStream; import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.doc.base.config.DocConfig; import org.fugerit.java.doc.base.config.DocInput; import org.fugerit.java.doc.base.config.DocOutput; import org.fugerit.java.doc.base.config.DocTypeHandler; @@ -27,7 +28,7 @@ public class PdfTypeHandler extends DocTypeHandlerDefault { public static final DocTypeHandler HANDLER = new PdfTypeHandler(); public PdfTypeHandler() { - super( OpenPpfDocHandler.DOC_OUTPUT_PDF, OpenPpfDocHandler.MODULE ); + super( DocConfig.TYPE_PDF, OpenPpfDocHandler.MODULE ); } @Override diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java index 695d37a6d..7868b8928 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java @@ -9,6 +9,7 @@ import java.util.Properties; import org.fugerit.java.core.cfg.ConfigRuntimeException; +import org.fugerit.java.core.function.SafeFunction; import org.fugerit.java.core.lang.helpers.StringUtils; import org.fugerit.java.core.log.LogFacade; import org.fugerit.java.core.util.regex.ParamFinder; @@ -96,13 +97,7 @@ protected static void setStyle( DocStyle parent, DocStyle current ) { private String docType; - public static final String MODULE = "itext"; - - public static final String DOC_OUTPUT_HTML = DocConfig.TYPE_HTML; - - public static final String DOC_OUTPUT_PDF = DocConfig.TYPE_PDF; - - public static final String DOC_OUTPUT_RTF = DocConfig.TYPE_RTF; + public static final String MODULE = "openpdf-ext"; public static final String DOC_DEFAULT_FONT_NAME = "default-font-name"; public static final String DOC_DEFAULT_FONT_SIZE = "default-font-size"; @@ -116,7 +111,7 @@ public OpenPpfDocHandler( Document document, PdfWriter pdfWriter ) { } public OpenPpfDocHandler( Document document, PdfWriter pdfWriter, int totalPageCount ) { - this( document, DOC_OUTPUT_PDF ); + this( document, DocConfig.TYPE_PDF ); this.pdfWriter = pdfWriter; this.totalPageCount = totalPageCount; } @@ -142,19 +137,16 @@ private static int getAlign( int align ) { protected static Image createImage( DocImage docImage ) { - Image image = null; String url = docImage.getUrl(); log.trace( "currently unsupported image param url {}", url ); - try { + return SafeFunction.get( () -> { byte[] data = SourceResolverHelper.resolveImage( docImage ); - image = Image.getInstance( data ); + Image image = Image.getInstance( data ); if ( docImage.getScaling() != null ) { image.scalePercent( docImage.getScaling().floatValue() ); } - } catch (Exception e) { - throw new ConfigRuntimeException( e ); - } - return image; + return image; + } ); } @@ -258,23 +250,23 @@ public static Font createFont( String fontName, int fontSize, int fontStyle, Ope private void handleTypeSpecific( Properties info ) { // per documenti tipo HTML - if ( DOC_OUTPUT_HTML.equalsIgnoreCase( this.docType ) ) { + if ( DocConfig.TYPE_HTML.equalsIgnoreCase( this.docType ) ) { String cssLink = info.getProperty( DocInfo.INFO_NAME_CSS_LINK ); if ( cssLink != null ) { this.document.add( new Header( HtmlTags.STYLESHEET, cssLink ) ); } } // per documenti tipo word o pdf - if ( DOC_OUTPUT_PDF.equalsIgnoreCase( this.docType ) || DOC_OUTPUT_RTF.equalsIgnoreCase( this.docType ) ) { + if ( DocConfig.TYPE_PDF.equalsIgnoreCase( this.docType ) || DocConfig.TYPE_RTF.equalsIgnoreCase( this.docType ) ) { Rectangle size = this.document.getPageSize(); String pageOrient = info.getProperty( DocInfo.INFO_NAME_PAGE_ORIENT ); if ( "horizontal".equalsIgnoreCase( pageOrient ) ) { size = new Rectangle( size.getHeight(), size.getWidth() ); this.document.setPageSize( size ); } - if ( DOC_OUTPUT_PDF.equalsIgnoreCase( this.docType ) ) { + if ( DocConfig.TYPE_PDF.equalsIgnoreCase( this.docType ) ) { String pdfFormat = info.getProperty( DocInfo.INFO_NAME_PDF_FORMAT ); - if ( "pdf-a".equalsIgnoreCase( pdfFormat ) ) { + if ( DocConfig.FORMAT_PDF_A_1B.equalsIgnoreCase( pdfFormat ) ) { this.pdfWriter.setPDFXConformance(PdfWriter.PDFA1B); PdfDictionary outi = new PdfDictionary( PdfName.OUTPUTINTENT ); outi.put( PdfName.OUTPUTCONDITIONIDENTIFIER, new PdfString("sRGB IEC61966-2.1") ); @@ -350,7 +342,7 @@ public void handleDoc(DocBase docBase) throws DocumentException, IOException { PdfHelper pdfHelper = new PdfHelper( docHelper ); this.handleHeader(docBase, pdfHelper, docHelper); this.handleFooter(docBase, pdfHelper, docHelper); - if ( DOC_OUTPUT_PDF.equals( this.docType ) ) { + if ( DocConfig.TYPE_PDF.equals( this.docType ) ) { this.pdfWriter.setPageEvent( pdfHelper ); } diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java index 1860403ed..37075a867 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/ParentElement.java @@ -1,9 +1,11 @@ package org.fugerit.java.doc.mod.openpdf.ext.helpers; +import org.fugerit.java.doc.base.config.DocException; + import com.lowagie.text.Element; public interface ParentElement { - public void add( Element element ) throws Exception; + public void add( Element element ) throws DocException; } diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java index 42c42f771..6aa5f2505 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/PhraseParent.java @@ -1,5 +1,7 @@ package org.fugerit.java.doc.mod.openpdf.ext.helpers; +import org.fugerit.java.doc.base.config.DocException; + import com.lowagie.text.Element; import com.lowagie.text.Phrase; @@ -14,7 +16,7 @@ public PhraseParent( Phrase phrase ) { /* (non-Javadoc) * @see org.fugerit.java.doc.mod.itext.ParentElement#add(com.lowagie.text.Element) */ - public void add(Element element) throws Exception { + public void add(Element element) throws DocException { this.phrase.add( element ); } diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java deleted file mode 100644 index bb1ed9509..000000000 --- a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/PocIndex.java +++ /dev/null @@ -1,99 +0,0 @@ -package test.org.fugerit.java.doc.mod.openpdf.ext; - -import java.awt.Color; -import java.io.FileOutputStream; - -import org.junit.Assert; -import org.junit.Test; - -import com.lowagie.text.Chunk; -import com.lowagie.text.Document; -import com.lowagie.text.Font; -import com.lowagie.text.List; -import com.lowagie.text.ListItem; -import com.lowagie.text.PageSize; -import com.lowagie.text.Paragraph; -import com.lowagie.text.pdf.PdfAction; -import com.lowagie.text.pdf.PdfContentByte; -import com.lowagie.text.pdf.PdfDestination; -import com.lowagie.text.pdf.PdfOutline; -import com.lowagie.text.pdf.PdfWriter; - -public class PocIndex { - - private static final String VERSION = "002"; - - @Test - public void testIndex001() throws Exception { - boolean ok = false; - - String dest = "target/test_index001.pdf"; - Document document = new Document(PageSize.A4.rotate()); - PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); - writer.setViewerPreferences( PdfWriter.DisplayDocTitle ); - document.addTitle( "Test title "+VERSION ); - writer.setPdfVersion(PdfWriter.VERSION_1_7); - - //TAGGED PDF - //Make document tagged - writer.setTagged(); - //=============== - //PDF/UA - //Set document metadata - writer.setViewerPreferences(PdfWriter.DisplayDocTitle); - //document.addLanguage("en-US"); - writer.createXmpMetadata(); - //===================== - document.open(); - - document.add(new Paragraph("Outline action example "+VERSION)); - - PdfContentByte cb = writer.getDirectContent(); - PdfOutline root = cb.getRootOutline(); - PdfOutline links = new PdfOutline(root, new PdfAction("http://www.lowagie.com/iText/links.html"), - "Useful links"); - links.setColor(new Color(0x00, 0x80, 0x80)); - links.setStyle(Font.BOLD); - new PdfOutline(links, new PdfAction("http://www.lowagie.com/iText"), "Bruno's iText site"); - new PdfOutline(links, new PdfAction("http://itextpdf.sourceforge.net/"), "Paulo's iText site"); - new PdfOutline(links, new PdfAction("http://sourceforge.net/projects/itext/"), "iText @ SourceForge"); - PdfOutline other = new PdfOutline(root, new PdfDestination(PdfDestination.FIT), "other actions", false); - other.setStyle(Font.ITALIC); - new PdfOutline(other, new PdfAction("remote.pdf", 1), "Go to yhe first page of a remote file"); - new PdfOutline(other, new PdfAction("remote.pdf", "test"), "Go to a local destination in a remote file"); - new PdfOutline(other, PdfAction.javaScript("app.alert('Hello');\r", writer), "Say Hello"); - - Font font = new Font( Font.HELVETICA ); - Paragraph p = new Paragraph(); - //PdfStructureElement ele = new PdfStructureElement( writer.getStructureTreeRoot(), PdfName.H1 ); - - - //PDF/UA - //Embed font - //================== - Chunk c = new Chunk("Test tag"); - - p.add(c); - document.add(p); - p = new Paragraph("\n\n\n\n\n\n\n\n\n\n\n\n", font); - document.add(p); - List list = new List(true); - list.add(new ListItem("quick", font)); - list.add(new ListItem("brown", font)); - list.add(new ListItem("fox", font)); - list.add(new ListItem("jumps", font)); - list.add(new ListItem("over", font)); - list.add(new ListItem("the", font)); - list.add(new ListItem("lazy", font)); - list.add(new ListItem("dog", font)); - document.add(list); - - document.close(); - - ok = true; - - Assert.assertTrue( ok ); - - } - -} diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java index b53519cf0..e5d770700 100644 --- a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java @@ -15,6 +15,8 @@ public class TestDefaultDoc extends TestDocBase { private static final String DEFAULT_DOC_ALT = "default_doc_alt"; + private static final String DEFAULT_DOC_PDFA = "default_doc_pdfa"; + @Test public void testOpenFailPDF() { Assert.assertThrows( AssertionError.class , () -> this.testDocWorker( "default_doc_fail1" , DocConfig.TYPE_PDF ) ); @@ -50,4 +52,10 @@ public void testOpenAltHTML() { Assert.assertTrue(ok); } + @Test + public void testOpenPDFA() { + // still working on font embedding + Assert.assertThrows( AssertionError.class , () -> this.testDocWorker( DEFAULT_DOC_PDFA , DocConfig.TYPE_PDF )); + } + } diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml b/fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml index 9c35502f5..708a173a1 100644 --- a/fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml +++ b/fj-doc-mod-openpdf-ext/src/test/resources/fm-test-mod-openpdf-config.xml @@ -8,6 +8,7 @@ + diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml index c60ac3737..ee7845c41 100644 --- a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml @@ -26,16 +26,17 @@ - Test times roman - Courier - Symbol - Symbol - Test default font + + Test times roman + Courier + Symbol + Symbol + Test default font Name - Surname - Title + Surname + Title diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_pdfa.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_pdfa.xml new file mode 100644 index 000000000..06d6f5f60 --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_pdfa.xml @@ -0,0 +1,16 @@ + + + + + + TitilliumWeb + PDF/A-1b + + + Test PDFA + + + \ No newline at end of file diff --git a/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java index 56243f34f..e527e8fb8 100644 --- a/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java +++ b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java @@ -4,6 +4,7 @@ import java.io.OutputStream; import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.doc.base.config.DocConfig; import org.fugerit.java.doc.base.config.DocInput; import org.fugerit.java.doc.base.config.DocOutput; import org.fugerit.java.doc.base.config.DocTypeHandler; @@ -28,7 +29,7 @@ public class RtfTypeHandler extends DocTypeHandlerDefault { public static final DocTypeHandler HANDLER = new RtfTypeHandler(); public RtfTypeHandler() { - super( OpenPpfDocHandler.DOC_OUTPUT_RTF, OpenPpfDocHandler.MODULE ); + super( DocConfig.TYPE_RTF, OpenRtfDocHandler.MODULE ); } @Override diff --git a/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java index e10d4806c..37a20f985 100644 --- a/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java +++ b/fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/helpers/OpenRtfDocHandler.java @@ -5,6 +5,7 @@ import java.util.List; import org.fugerit.java.core.function.SafeFunction; +import org.fugerit.java.doc.base.config.DocConfig; import org.fugerit.java.doc.base.model.DocElement; import org.fugerit.java.doc.base.model.DocFooter; import org.fugerit.java.doc.base.model.DocHeader; @@ -24,8 +25,10 @@ @Slf4j public class OpenRtfDocHandler extends OpenPpfDocHandler { + public static final String MODULE = "openrtf-ext"; + public OpenRtfDocHandler( Document document, RtfWriter2 rtfWriter2 ) { - super( document, DOC_OUTPUT_RTF ); + super( document, DocConfig.TYPE_RTF ); log.trace( "currently unused parameter rtfWriter2 {}", rtfWriter2 ); } From 516a858997df67ddc87b3e8d081b6582a1ee954e Mon Sep 17 00:00:00 2001 From: "Matteo Franci a.k.a. Fugerit" Date: Sun, 4 Feb 2024 19:47:43 +0100 Subject: [PATCH 3/6] Setup new openpdf/openrtf modules #111 --- fj-doc-playground-quarkus/pom.xml | 5 ----- .../playground-config/fm-playground-doc-process.xml | 4 ++-- fj-doc-sample/pom.xml | 9 ++++++--- .../test/org/fugerit/java/doc/sample/dev/TestItext2.java | 2 +- pom.xml | 2 -- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/fj-doc-playground-quarkus/pom.xml b/fj-doc-playground-quarkus/pom.xml index 0f904a2cc..2b84af201 100644 --- a/fj-doc-playground-quarkus/pom.xml +++ b/fj-doc-playground-quarkus/pom.xml @@ -82,11 +82,6 @@ - - org.fugerit.java - fj-doc-mod-openpdf - ${fj-doc-mod-openpdf-version} - diff --git a/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml b/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml index 1dd4c4b56..dfff8f56a 100644 --- a/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml +++ b/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml @@ -5,12 +5,12 @@ xsi:schemaLocation="https://freemarkerdocprocess.fugerit.org https://www.fugerit.org/data/java/doc/xsd/freemarker-doc-process-1-0.xsd" > - + - + diff --git a/fj-doc-sample/pom.xml b/fj-doc-sample/pom.xml index 43ef209e3..9a20dc1f6 100644 --- a/fj-doc-sample/pom.xml +++ b/fj-doc-sample/pom.xml @@ -74,9 +74,12 @@ org.fugerit.java - fj-doc-mod-openpdf - ${fj-doc-mod-openpdf-version} - test + fj-doc-mod-openpdf-ext + + + + org.fugerit.java + fj-doc-mod-openrtf-ext diff --git a/fj-doc-sample/src/test/java/test/org/fugerit/java/doc/sample/dev/TestItext2.java b/fj-doc-sample/src/test/java/test/org/fugerit/java/doc/sample/dev/TestItext2.java index cb6b78325..57c2ca724 100644 --- a/fj-doc-sample/src/test/java/test/org/fugerit/java/doc/sample/dev/TestItext2.java +++ b/fj-doc-sample/src/test/java/test/org/fugerit/java/doc/sample/dev/TestItext2.java @@ -13,7 +13,7 @@ import org.fugerit.java.doc.base.config.DocTypeHandler; import org.fugerit.java.doc.base.facade.DocFacade; import org.fugerit.java.doc.base.model.DocBase; -import org.fugerit.java.doc.mod.openpdf.PdfTypeHandler; +import org.fugerit.java.doc.mod.openpdf.ext.PdfTypeHandler; import org.junit.Assert; import org.junit.Test; diff --git a/pom.xml b/pom.xml index 342c96c8c..a23a3bbe9 100644 --- a/pom.xml +++ b/pom.xml @@ -31,8 +31,6 @@ 4.0.1 ${poi-version} - - 1.3.0 From e5afbb16fcb840f0925c4cda021668606364d63e Mon Sep 17 00:00:00 2001 From: "Matteo Franci a.k.a. Fugerit" Date: Sun, 4 Feb 2024 20:07:22 +0100 Subject: [PATCH 4/6] Updated readme #111 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index f9135ee2e..e472eb7c8 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,8 @@ There are five kinds of components (each components README.md contains module st * [Apache POI Module (fj-doc-mod-poi)](fj-doc-mod-poi/README.md) ([XLS](fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/XlsPoiTypeHandler.java)/[XLSX](fj-doc-mod-poi/src/main/java/org/fugerit/java/doc/mod/poi/XlsPoiTypeHandler.java)) * [Apache FOP Module (fj-doc-mod-fop)](fj-doc-mod-fop/README.md) ([PDF](fj-doc-mod-fop/src/main/java/org/fugerit/java/doc/mod/fop/PdfFopTypeHandler.java)/[FO](fj-doc-mod-fop/src/main/java/org/fugerit/java/doc/mod/fop/FreeMarkerFopTypeHandler.java)) * [OpenCSV Module (fj-doc-mod-opencsv)](fj-doc-mod-opencsv/README.md) ([CSV](fj-doc-mod-opencsv/src/main/java/org/fugerit/java/doc/mod/opencsv/OpenCSVTypeHandler.java)) +* [OpenPDF EXT Module (fj-doc-mod-openpdf-ext)](fj-doc-mod-openpdf-ext/README.md) ([PDF](fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java)/[HTML](fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java)) +* [OpenRTF EXT Module (fj-doc-mod-openrtf-ext)](fj-doc-mod-openrtf-ext/README.md) ([RTF](fj-doc-mod-openrtf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java)) ### 3. Available type handlers : @@ -102,6 +104,10 @@ There are five kinds of components (each components README.md contains module st * [PDF](fj-doc-mod-fop/src/main/java/org/fugerit/java/doc/mod/fop/PdfFopTypeHandler.java) - (fj-doc-mod-fop) - output as PDF using Apache FOP * [FO](fj-doc-mod-fop/src/main/java/org/fugerit/java/doc/mod/fop/FreeMarkerFopTypeHandler.java) - (fj-doc-mod-fop) - output as FO using Apache FOP * [CSV](fj-doc-mod-opencsv/src/main/java/org/fugerit/java/doc/mod/opencsv/OpenCSVTypeHandler.java) - (fj-doc-mod-opencsv) - output as CSV using OpenCSV +* [PDF](fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java) - (fj-doc-mod-openpdf-ext) - output as PDF using OpenPDF +* [HTML](fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java) - (fj-doc-mod-openpdf-ext) - output as HTML using OpenPDF +* [RTF](fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openrtf/ext/RtfTypeHandler.java) - (fj-doc-mod-openrtf-ext) - output as RTF using OpenRTF + ### 4. Bundled libraries : * [Simple table (fj-doc-lib-singletable)](fj-doc-lib-simpletable/README.md) - offers a simple API for creating a document made of a table. From 9601d45b3e68ad4869177582dddd7ac524d66658 Mon Sep 17 00:00:00 2001 From: "Matteo Franci a.k.a. Fugerit" Date: Sun, 4 Feb 2024 20:58:23 +0100 Subject: [PATCH 5/6] Fix valign handling #111 --- .../java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java | 2 +- .../java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java index d36e99f73..9e0620451 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfDocTableHelper.java @@ -81,7 +81,7 @@ private static void handleAligns( DocCell docCell, Cell cell ) { } } if ( docCell.getValign() != DocPara.ALIGN_UNSET ) { - Optional va = VerticalAlignment.of( docCell.getAlign() ); + Optional va = VerticalAlignment.of( docCell.getValign() ); if ( va.isPresent() ) { cell.setVerticalAlignment( va.get() ); } diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java index 7868b8928..c8fcd9b62 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java @@ -243,7 +243,7 @@ protected static Image createBarcode( DocBarcode docBarcode, OpenPdfHelper helpe } - + public static Font createFont( String fontName, int fontSize, int fontStyle, OpenPdfHelper docHelper, String color ) throws DocumentException, IOException { return OpenPdfFontHelper.createFont(fontName, fontName, fontSize, fontStyle, docHelper, color); } From 37fd1c9aa459419cf1e7deb1d59f4655c253037b Mon Sep 17 00:00:00 2001 From: "Matteo Franci a.k.a. Fugerit" Date: Sun, 4 Feb 2024 23:13:36 +0100 Subject: [PATCH 6/6] Increase test coverage #111 --- .../doc/mod/openpdf/ext/HtmlTypeHandler.java | 2 +- .../doc/mod/openpdf/ext/PdfTypeHandler.java | 2 +- .../ext/helpers/OpenPDFConfigHelper.java | 3 ++- .../openpdf/ext/helpers/OpenPdfFontHelper.java | 3 +-- .../openpdf/ext/helpers/OpenPpfDocHandler.java | 10 +++------- .../doc/mod/openpdf/ext/TestDefaultDoc.java | 8 ++++++++ .../java/doc/mod/openpdf/ext/TestDocBase.java | 4 ++-- .../src/test/resources/xml/default_doc.xml | 10 +++++----- .../src/test/resources/xml/default_doc_alt.xml | 14 ++++++++++---- .../test/resources/xml/default_doc_simple.xml | 17 +++++++++++++++++ 10 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_simple.xml diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java index fb60b9c8e..57da45c8c 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/HtmlTypeHandler.java @@ -12,10 +12,10 @@ import org.fugerit.java.doc.base.model.DocBase; import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPDFConfigHelper; import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; +import org.w3c.dom.Element; import com.lowagie.text.Document; import com.lowagie.text.html.HtmlWriter; -import org.w3c.dom.Element; public class HtmlTypeHandler extends DocTypeHandlerDefault { diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java index 4a3f29d5e..4264c2ee3 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/PdfTypeHandler.java @@ -12,11 +12,11 @@ import org.fugerit.java.doc.base.model.DocBase; import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPDFConfigHelper; import org.fugerit.java.doc.mod.openpdf.ext.helpers.OpenPpfDocHandler; +import org.w3c.dom.Element; import com.lowagie.text.Document; import com.lowagie.text.PageSize; import com.lowagie.text.pdf.PdfWriter; -import org.w3c.dom.Element; public class PdfTypeHandler extends DocTypeHandlerDefault { diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java index cbd64545e..d7af531d4 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPDFConfigHelper.java @@ -1,10 +1,11 @@ package org.fugerit.java.doc.mod.openpdf.ext.helpers; -import lombok.extern.slf4j.Slf4j; import org.fugerit.java.core.cfg.ConfigException; import org.w3c.dom.Element; import org.w3c.dom.NodeList; +import lombok.extern.slf4j.Slf4j; + @Slf4j public class OpenPDFConfigHelper { diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java index bd221e6f4..0744dd2a5 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPdfFontHelper.java @@ -62,8 +62,7 @@ protected static Font createFont( String fontName, String fontPath, int fontSize } else { bf = OpenPpfDocHandler.findFont( fontName ); if ( bf == null) { - bf = BaseFont.createFont( fontPath, BaseFont.CP1252, true ); - OpenPpfDocHandler.registerFont( fontName, bf ); + bf = OpenPpfDocHandler.registerFont( fontName , fontPath ); } } Color c = Color.BLACK; diff --git a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java index c8fcd9b62..908afdcea 100644 --- a/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java +++ b/fj-doc-mod-openpdf-ext/src/main/java/org/fugerit/java/doc/mod/openpdf/ext/helpers/OpenPpfDocHandler.java @@ -11,7 +11,6 @@ import org.fugerit.java.core.cfg.ConfigRuntimeException; import org.fugerit.java.core.function.SafeFunction; import org.fugerit.java.core.lang.helpers.StringUtils; -import org.fugerit.java.core.log.LogFacade; import org.fugerit.java.core.util.regex.ParamFinder; import org.fugerit.java.doc.base.config.DocConfig; import org.fugerit.java.doc.base.helper.SourceResolverHelper; @@ -69,9 +68,10 @@ public class OpenPpfDocHandler { private static HashMap fonts = new HashMap<>(); - public static void registerFont( String name, String path ) throws DocumentException, IOException { + public static BaseFont registerFont( String name, String path ) throws DocumentException, IOException { BaseFont font = BaseFont.createFont( path, BaseFont.CP1252, true ); registerFont( name, font ); + return font; } public static void registerFont( String name, BaseFont font ) { @@ -414,11 +414,7 @@ private void handleHeaderFooterElement( DocElement docElement, float leading, Op } Font f = new Font( Font.HELVETICA, docPara.getSize() ); if ( docPara.getForeColor() != null ) { - try { - f.setColor( DocModelUtils.parseHtmlColor( docPara.getForeColor() ) ); - } catch (Exception fe) { - LogFacade.getLog().warn( "Error setting fore color on footer : "+docPara.getForeColor(), fe ); - } + SafeFunction.applySilent( () -> f.setColor( DocModelUtils.parseHtmlColor( docPara.getForeColor() ) ) ); } Chunk ck = new Chunk( docPara.getText(), f ); phrase.add( ck ); diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java index e5d770700..7b36f597a 100644 --- a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDefaultDoc.java @@ -15,6 +15,8 @@ public class TestDefaultDoc extends TestDocBase { private static final String DEFAULT_DOC_ALT = "default_doc_alt"; + private static final String DEFAULT_DOC_SIMPLE = "default_doc_simple"; + private static final String DEFAULT_DOC_PDFA = "default_doc_pdfa"; @Test @@ -52,6 +54,12 @@ public void testOpenAltHTML() { Assert.assertTrue(ok); } + @Test + public void testOpenSimple() { + boolean ok = this.testDocWorker( DEFAULT_DOC_SIMPLE , DocConfig.TYPE_PDF ); + Assert.assertTrue(ok); + } + @Test public void testOpenPDFA() { // still working on font embedding diff --git a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java index f901cd263..73397eb60 100644 --- a/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java +++ b/fj-doc-mod-openpdf-ext/src/test/java/test/org/fugerit/java/doc/mod/openpdf/ext/TestDocBase.java @@ -11,11 +11,11 @@ import org.fugerit.java.doc.base.config.DocInput; import org.fugerit.java.doc.base.config.DocOutput; import org.fugerit.java.doc.base.config.DocTypeHandler; - -import lombok.extern.slf4j.Slf4j; import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfig; import org.fugerit.java.doc.freemarker.process.FreemarkerDocProcessConfigFacade; +import lombok.extern.slf4j.Slf4j; + @Slf4j public class TestDocBase { diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml index ee7845c41..7e293e90b 100644 --- a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc.xml @@ -2,7 +2,7 @@ + xsi:schemaLocation="http://javacoredoc.fugerit.org https://www.fugerit.org/data/java/doc/xsd/doc-2-1.xsd" > @@ -32,16 +32,16 @@ Symbol Symbol Test default font -
+
Name Surname Title - - - + + + diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml index 1908770f3..21765c2a1 100644 --- a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_alt.xml @@ -52,10 +52,16 @@
- + + + + + + - - - + + + + \ No newline at end of file diff --git a/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_simple.xml b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_simple.xml new file mode 100644 index 000000000..6e058f19b --- /dev/null +++ b/fj-doc-mod-openpdf-ext/src/test/resources/xml/default_doc_simple.xml @@ -0,0 +1,17 @@ + + + + + TitilliumWeb +
+ +
+
+ + Test PDFA + + +
\ No newline at end of file