-
-
Notifications
You must be signed in to change notification settings - Fork 155
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of github.com:ZUGFeRD/mustangproject
# Conflicts: # library/src/test/java/org/mustangproject/ZUGFeRD/ZF2PushTest.java
- Loading branch information
Showing
17 changed files
with
1,033 additions
and
569 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
148 changes: 148 additions & 0 deletions
148
library/src/main/java/org/mustangproject/ZUGFeRD/ValidationLogVisualizer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
package org.mustangproject.ZUGFeRD; | ||
|
||
import org.apache.fop.apps.*; | ||
import org.apache.fop.apps.io.ResourceResolverFactory; | ||
import org.apache.fop.configuration.Configuration; | ||
import org.apache.fop.configuration.ConfigurationException; | ||
import org.apache.fop.configuration.DefaultConfigurationBuilder; | ||
import org.apache.xmlgraphics.util.MimeConstants; | ||
import org.mustangproject.ClasspathResolverURIAdapter; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
import javax.xml.transform.*; | ||
import javax.xml.transform.sax.SAXResult; | ||
import javax.xml.transform.stream.StreamResult; | ||
import javax.xml.transform.stream.StreamSource; | ||
import java.io.*; | ||
import java.nio.charset.StandardCharsets; | ||
|
||
public class ValidationLogVisualizer { | ||
public enum Language { | ||
EN, | ||
FR, | ||
DE | ||
} | ||
|
||
static final ClassLoader CLASS_LOADER = ValidationLogVisualizer.class.getClassLoader(); | ||
private static final String RESOURCE_PATH = ""; | ||
private static final Logger LOGGER = LoggerFactory.getLogger(ValidationLogVisualizer.class); | ||
|
||
private TransformerFactory mFactory = null; | ||
private Templates mXsltPDFTemplate = null; | ||
|
||
|
||
public ValidationLogVisualizer() { | ||
mFactory = new net.sf.saxon.TransformerFactoryImpl(); | ||
// fact = TransformerFactory.newInstance(); | ||
mFactory.setURIResolver(new ValidationLogVisualizer.ClasspathResourceURIResolver()); | ||
} | ||
|
||
protected void applyXSLTToPDF(final String xmlContent, final OutputStream PDFOutstream) | ||
throws TransformerException { | ||
Transformer transformer = mXsltPDFTemplate.newTransformer(); | ||
|
||
transformer.transform(new StreamSource(new StringReader(xmlContent)), new StreamResult(PDFOutstream)); | ||
} | ||
|
||
protected String toFOP(final String xmlContent) | ||
throws TransformerException { | ||
|
||
try { | ||
if (mXsltPDFTemplate == null) { | ||
mXsltPDFTemplate = mFactory.newTemplates( | ||
new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/result-pdf.xsl"))); | ||
} | ||
} catch (TransformerConfigurationException ex) { | ||
LOGGER.error("Failed to init XSLT templates", ex); | ||
} | ||
|
||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ||
|
||
try { | ||
|
||
applyXSLTToPDF(xmlContent, baos); | ||
|
||
} catch (Exception e1) { | ||
LOGGER.error("Failed to create PDF", e1); | ||
} | ||
|
||
return baos.toString(StandardCharsets.UTF_8); | ||
} | ||
|
||
public void toPDF(String xmlLogfileContent, String pdfFilename) { | ||
|
||
// the writing part | ||
|
||
String result = null; | ||
|
||
/* remove file endings so that tests can also pass after checking | ||
out from git with arbitrary options (which may include CSRF changes) | ||
*/ | ||
try { | ||
result = this.toFOP(xmlLogfileContent); | ||
} catch ( TransformerException e) { | ||
LOGGER.error("Failed to apply FOP", e); | ||
} | ||
DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder(); | ||
|
||
Configuration cfg = null; | ||
try { | ||
cfg = cfgBuilder.build(CLASS_LOADER.getResourceAsStream("fop-config.xconf")); | ||
} catch (ConfigurationException e) { | ||
throw new RuntimeException(e); | ||
} | ||
|
||
FopFactoryBuilder builder = new FopFactoryBuilder(new File(".").toURI(), new ClasspathResolverURIAdapter()).setConfiguration(cfg); | ||
// Step 1: Construct a FopFactory by specifying a reference to the configuration file | ||
// (reuse if you plan to render multiple documents!) | ||
|
||
FopFactory fopFactory = builder.build(); | ||
|
||
fopFactory.getFontManager().setResourceResolver( | ||
ResourceResolverFactory.createInternalResourceResolver( | ||
new File(".").toURI(), | ||
new ClasspathResolverURIAdapter())); | ||
|
||
FOUserAgent userAgent = fopFactory.newFOUserAgent(); | ||
|
||
userAgent.getRendererOptions().put("pdf-a-mode", "PDF/A-3b"); | ||
|
||
// Step 2: Set up output stream. | ||
// Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams). | ||
|
||
try (OutputStream out = new BufferedOutputStream(new FileOutputStream(pdfFilename))) { | ||
|
||
// Step 3: Construct fop with desired output format | ||
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, userAgent, out); | ||
|
||
// Step 4: Setup JAXP using identity transformer | ||
TransformerFactory factory = TransformerFactory.newInstance(); | ||
Transformer transformer = factory.newTransformer(); // identity transformer | ||
|
||
// Step 5: Setup input and output for XSLT transformation | ||
// Setup input stream | ||
Source src = new StreamSource(new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8))); | ||
|
||
// Resulting SAX events (the generated FO) must be piped through to FOP | ||
Result res = new SAXResult(fop.getDefaultHandler()); | ||
|
||
// Step 6: Start XSLT transformation and FOP processing | ||
transformer.transform(src, res); | ||
|
||
} catch (FOPException | IOException | TransformerException e) { | ||
LOGGER.error("Failed to create PDF", e); | ||
} | ||
} | ||
|
||
private static class ClasspathResourceURIResolver implements URIResolver { | ||
ClasspathResourceURIResolver() { | ||
// Do nothing, just prevents synthetic access warning. | ||
} | ||
|
||
@Override | ||
public Source resolve(String href, String base) throws TransformerException { | ||
return new StreamSource(CLASS_LOADER.getResourceAsStream(RESOURCE_PATH + "stylesheets/" + href)); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,57 @@ | ||
<fop version="1.0"> | ||
|
||
<!-- Strict user configuration --> | ||
<strict-configuration>true</strict-configuration> | ||
|
||
<!-- Strict FO validation --> | ||
<strict-validation>true</strict-validation> | ||
|
||
<!-- Base URL for resolving relative URLs --> | ||
|
||
<!-- Font Base URL for resolving relative font URLs --> | ||
|
||
<!-- Source resolution in dpi (dots/pixels per inch) for determining the size of pixels in SVG and bitmap images, default: 72dpi --> | ||
<source-resolution>96</source-resolution> | ||
<!-- Target resolution in dpi (dots/pixels per inch) for specifying the target resolution for generated bitmaps, default: 72dpi --> | ||
<target-resolution>96</target-resolution> | ||
|
||
<!-- default page-height and page-width, in case | ||
value is specified as auto --> | ||
<default-page-settings height="297mm" width="210mm"/><!-- DIN A/4 --> | ||
|
||
<!-- etc. etc..... --> | ||
|
||
<renderers> | ||
<renderer mime="application/pdf"> | ||
<fonts><!-- https://xmlgraphics.apache.org/fop/1.1/fonts.html auto-embed --> | ||
<auto-detect/> | ||
<font kerning="no" embed-url="classpath:FreeSans.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSerifPro" style="normal" weight="normal" /> | ||
<font-triplet name="Times-Bold" style="normal" weight="normal" /> | ||
</font> | ||
</fonts> | ||
<output-profile>classpath:AdobeCompat-v2.icc</output-profile> | ||
</renderer> | ||
</renderers> | ||
|
||
</fop> | ||
<fop version="1.0"> | ||
|
||
<!-- Strict user configuration --> | ||
<strict-configuration>true</strict-configuration> | ||
|
||
<!-- Strict FO validation --> | ||
<strict-validation>true</strict-validation> | ||
|
||
<!-- Base URL for resolving relative URLs --> | ||
|
||
<!-- Font Base URL for resolving relative font URLs --> | ||
|
||
<!-- Source resolution in dpi (dots/pixels per inch) for determining the size of pixels in SVG and bitmap images, default: 72dpi --> | ||
<source-resolution>96</source-resolution> | ||
<!-- Target resolution in dpi (dots/pixels per inch) for specifying the target resolution for generated bitmaps, default: 72dpi --> | ||
<target-resolution>96</target-resolution> | ||
|
||
<!-- default page-height and page-width, in case | ||
value is specified as auto --> | ||
<default-page-settings height="297mm" width="210mm"/><!-- DIN A/4 --> | ||
|
||
<!-- etc. etc..... --> | ||
|
||
<renderers> | ||
<renderer mime="application/pdf"> | ||
<fonts> | ||
<!-- https://xmlgraphics.apache.org/fop/1.1/fonts.html auto-embed --> | ||
<auto-detect/> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSansPro-Regular.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSansPro" style="normal" weight="400"/> | ||
</font> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSansPro-It.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSansPro" style="italic" weight="400"/> | ||
</font> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSansPro-Bold.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSansPro" style="normal" weight="700"/> | ||
</font> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSansPro-BoldIt.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSansPro" style="italic" weight="700"/> | ||
</font> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSerifPro-Regular.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSerifPro" style="normal" weight="400"/> | ||
</font> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSerifPro-It.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSerifPro" style="italic" weight="400"/> | ||
</font> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSerifPro-Bold.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSerifPro" style="normal" weight="700"/> | ||
</font> | ||
<font kerning="yes" embed-url="classpath:fonts/SourceSerifPro-BoldIt.ttf" embedding-mode="subset"> | ||
<font-triplet name="SourceSerifPro" style="italic" weight="700"/> | ||
</font> | ||
</fonts> | ||
<output-profile>classpath:AdobeCompat-v2.icc</output-profile> | ||
</renderer> | ||
</renderers> | ||
</fop> |
Oops, something went wrong.