Skip to content

Commit

Permalink
danfickle#23: Use pdfbox-graphics2d to render the SVG. But the positi…
Browse files Browse the repository at this point in the history
…oning is not

right yet.
  • Loading branch information
rototor committed Feb 2, 2017
1 parent 22f4063 commit 01323ed
Show file tree
Hide file tree
Showing 9 changed files with 248 additions and 85 deletions.
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.openhtmltopdf.extend;

import java.util.List;

import org.w3c.dom.Element;

import com.openhtmltopdf.css.sheet.FontFaceRule;
import com.openhtmltopdf.layout.SharedContext;
import com.openhtmltopdf.render.RenderingContext;
import org.w3c.dom.Element;

import java.util.List;

public interface SVGDrawer {
public void drawSVG(Element svgElement, OutputDevice outputDevice, RenderingContext ctx, double x, double y, float dotsPerInch);
public void drawSVG(Element svgElement, OutputDevice outputDevice, RenderingContext ctx, double x, double y, double width, double height, double dotsPerPixel);

public void importFontFaceRules(List<FontFaceRule> fontFaces, SharedContext shared);

Expand Down
5 changes: 5 additions & 0 deletions openhtmltopdf-examples/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@
<artifactId>openhtmltopdf-rtl-support</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.openhtmltopdf</groupId>
<artifactId>openhtmltopdf-svg-support</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import com.openhtmltopdf.bidi.support.ICUBidiSplitter;
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder.TextDirection;
import com.openhtmltopdf.svgsupport.BatikSVGDrawer;
import com.openhtmltopdf.util.JDKXRLogger;
import com.openhtmltopdf.util.XRLog;
import com.openhtmltopdf.util.XRLogger;

import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.util.Charsets;

Expand Down Expand Up @@ -50,6 +50,11 @@ public static void main(String[] args) throws Exception {
runTestCase("font-family-built-in");
runTestCase("form-controls");

/*
* SVG samples
*/
runTestCase("svg-inline");

/* Add additional test cases here. */
}

Expand Down Expand Up @@ -105,43 +110,38 @@ public void log(String where, Level level, String msg) {
delegate.log(where, level, msg);
}
});


renderPDF(html, outputStream);

if (!warnings.isEmpty() && !allowWarnings) {
throw warnings.get(0);
}
}

private static void renderPDF(String html, OutputStream outputStream) throws Exception {
try {
PdfRendererBuilder builder = new PdfRendererBuilder();
builder.useUnicodeBidiSplitter(new ICUBidiSplitter.ICUBidiSplitterFactory());
builder.useUnicodeBidiReorderer(new ICUBidiReorderer());
builder.defaultTextDirection(TextDirection.LTR);
builder.useSVGDrawer(new BatikSVGDrawer());
builder.withHtmlContent(html, TestcaseRunner.class.getResource("/testcases/").toString());
builder.toStream(outputStream);
builder.run();
} finally {
outputStream.close();
}

if (!warnings.isEmpty() && !allowWarnings) {
throw warnings.get(0);
}
}

public static void runTestCase(String testCaseFile) throws Exception {
byte[] htmlBytes = IOUtils.toByteArray(TestcaseRunner.class
.getResourceAsStream("/testcases/" + testCaseFile + ".html"));
String html = new String(htmlBytes, Charsets.UTF_8);
String outDir = System.getProperty("OUT_DIRECTORY", ".");
String testCaseOutputFile = outDir + "/" + testCaseFile + ".pdf";
FileOutputStream outputStream = new FileOutputStream(testCaseOutputFile);

try {
PdfRendererBuilder builder = new PdfRendererBuilder();
builder.useUnicodeBidiSplitter(new ICUBidiSplitter.ICUBidiSplitterFactory());
builder.useUnicodeBidiReorderer(new ICUBidiReorderer());
builder.defaultTextDirection(TextDirection.LTR);
builder.withHtmlContent(html, TestcaseRunner.class.getResource("/testcases/").toString());
builder.toStream(outputStream);
builder.run();
} finally {
outputStream.close();
}

renderPDF(html, outputStream);
System.out.println("Wrote " + testCaseOutputFile);
}
}
143 changes: 143 additions & 0 deletions openhtmltopdf-examples/src/main/resources/testcases/svg-inline.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
<html>
<head>
<style>
svg {
border: 2px solid black;
}
</style>
</head>
<body>

<h1>Some inline SVG examples</h1>

Some examples how inline SVG is rendered.

<h2>JSON-Symbol</h2>

<!-- Taken from https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/ -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 102" width="200" height="200">
<radialGradient id="jsongrad" cx="65" cy="90" r="100" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#EEF"/><stop offset="1"/></radialGradient>
<path d="M61,02 A 49,49 0,0,0 39,98 C 9,79 10,24 45,25 C 72,24 65,75 50,75 C 93,79 91,21 62,02" id="jsonswirl" fill="url(#jsongrad)"/>
<use xlink:href="#jsonswirl" transform="rotate(180 50,50)"/>
</svg>

<h2>Barchart</h2>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- ========================================================================= -->
<!-- Illustrates how SVG can be used for high quality graphs. -->
<!-- -->
<!-- @author vincent.hardy@eng.sun.com -->
<!-- @author neeme.praks@one.lv -->
<!-- @version $Id$ -->
<!-- ========================================================================= -->

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="body" width="450" height="500" xml:space="preserve" viewBox="0 0 450 500">
<title>Bar Chart</title>

<g id="barChart" transform="translate(40, 100)" fill-rule="evenodd" clip-rule="evenodd" stroke="none" class="legend"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" style="text-anchor:start">

<g id="GridAndLegend" style="stroke:none;">
<g stroke="black">

<!-- "floor" and "wall" -->
<path fill="lightgray" stroke="darkgray" d="M 27,240 l 15,-15 v -224 l -15,15" />
<path fill="lightgray" stroke="darkgray" d="M 41,225 v -224 h 316 v 224" />
<path fill="darkgray" stroke="none" d="M 27,240 l 15,-15 h 316 l -15,15" />

<!-- axis lines -->
<path d="M 27,240 h 316"/>
<path d="M 27,240 v -224"/>

<!-- value axis major gridlines -->
<g style="fill:none;">
<path d="M 27,202 l 15,-15 h 316" />
<path d="M 27,165 l 15,-15 h 316" />
<path d="M 27,127 l 15,-15 h 316" />
<path d="M 27, 90 l 15,-15 h 316" />
<path d="M 27, 53 l 15,-15 h 316" />
</g>

<!-- category axis major ticks -->
<path d="M 27,245 v -5"/>
<path d="M 106,245 v -5"/>
<path d="M 185,245 v -5"/>
<path d="M 264,245 v -5"/>

<!-- value axis minor ticks -->
<path d="M 22,240 h 5"/>
<path d="M 22,202 h 5"/>
<path d="M 22,165 h 5"/>
<path d="M 22,127 h 5"/>
<path d="M 22, 90 h 5"/>
<path d="M 22, 53 h 5"/>
<path d="M 22, 15 h 5"/>
</g>

<text transform="matrix(1 0 0 1 54 256)">Shoe</text>
<text transform="matrix(1 0 0 1 142 256)">Car</text>
<text transform="matrix(1 0 0 1 211 256)">Travel</text>
<text transform="matrix(1 0 0 1 285 256)">Computer</text>

<text transform="matrix(1 0 0 1 13 247)"><tspan x="0" y="0">0</tspan></text>
<text transform="matrix(1 0 0 1 6 209)"><tspan x="0" y="0">10</tspan></text>
<text transform="matrix(1 0 0 1 6 171)"><tspan x="0" y="0">20</tspan></text>
<text transform="matrix(1 0 0 1 6 134)"><tspan x="0" y="0">30</tspan></text>
<text transform="matrix(1 0 0 1 6 96)"><tspan x="0" y="0">40</tspan></text>
<text transform="matrix(1 0 0 1 6 60)"><tspan x="0" y="0">50</tspan></text>
<text transform="matrix(1 0 0 1 6 22)"><tspan x="0" y="0">60</tspan></text>
</g>

<g id="ShoeBar">
<path style="fill:#8686E0;" d="M 86,240 v -37 l 15 -15 v 37 l -15,15 z"/>
<path style="fill:#5B5B97;" d="M 86,203 h -39 l 15 -15 h 39 l -15,15 z"/>
<path style="fill:#7575C3;" d="M 47,203 v 37 h 39 v -37 H 47 z"/>
</g>
<g id="CarBar">
<path style="fill:#8686E0;" d="M 165,240 v -74 l 15 -15 v 74 l -15,15 z"/>
<path style="fill:#5B5B97;" d="M 165,166 h -39 l 15 -15 h 39 l -15,15 z"/>
<path style="fill:#7575C3;" d="M 126,166 v 74 h 39 v -74 h -39 z"/>
</g>
<g id="TravelBar">
<path style="fill:#8686E0;" d="M 244,240 v -37 l 15 -15 v 37 l -15,15 z"/>
<path style="fill:#5B5B97;" d="M 244,203 h -39 l 15 -15 h 39 l -15,15 z"/>
<path style="fill:#7575C3;" d="M 205,203 v 37 h 39 v -37 h -39 z"/>
</g>
<g id="ComputerBar">
<path style="fill:#8686E0;" d="M 323,240 v -224 l 15 -15 v 224 l -15,15 z"/>
<path style="fill:#5B5B97;" d="M 323, 16 h -39 l 15 -15 h 39 l -15,15 z"/>
<path style="fill:#7575C3;" d="M 284, 16 v 224 h 39 v -224 h -39 z"/>
</g>

</g>

<!-- ============================================================= -->
<!-- Batik sample mark -->
<!-- ============================================================= -->
<!--
<use xlink:href="batikLogo.svg#Batik_Tag_Box" />
-->

</svg>

<b>End of SVGs</b>

</body>
</html>
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.openhtmltopdf.pdfboxout;

import java.awt.Point;

import org.w3c.dom.Element;

import com.openhtmltopdf.extend.SVGDrawer;
import com.openhtmltopdf.layout.LayoutContext;
import com.openhtmltopdf.render.BlockBox;
import com.openhtmltopdf.render.RenderingContext;
import org.w3c.dom.Element;

import java.awt.*;

public class PdfBoxSVGReplacedElement implements PdfBoxReplacedElement {
private final Element e;
Expand Down Expand Up @@ -80,6 +79,6 @@ public int getBaseline() {

@Override
public void paint(RenderingContext c, PdfBoxOutputDevice outputDevice, BlockBox box) {
svg.drawSVG(e, outputDevice, c, point.getX(), point.getY(), this.dotsPerPixel * 96f);
svg.drawSVG(e, outputDevice, c, point.getX(), point.getY(), getIntrinsicWidth(), getIntrinsicHeight(), dotsPerPixel);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ public void placeXForm(float x, float y, PDFormXObject xFormObject) {
try {
cs.saveGraphicsState();
AffineTransform tf = new AffineTransform();
tf.translate(x,y);
tf.translate(x,0);
cs.transform(new Matrix(tf));
cs.drawForm(xFormObject);
cs.restoreGraphicsState();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.openhtmltopdf.svgsupport;

import java.util.List;
import java.util.logging.Level;

import com.openhtmltopdf.css.sheet.FontFaceRule;
import com.openhtmltopdf.extend.OutputDevice;
import com.openhtmltopdf.extend.SVGDrawer;
import com.openhtmltopdf.layout.SharedContext;
import com.openhtmltopdf.render.RenderingContext;
import com.openhtmltopdf.svgsupport.PDFTranscoder.OpenHtmlFontResolver;
import com.openhtmltopdf.util.XRLog;
import org.apache.batik.anim.dom.SVGDOMImplementation;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
Expand All @@ -11,13 +15,8 @@
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import com.openhtmltopdf.css.sheet.FontFaceRule;
import com.openhtmltopdf.extend.OutputDevice;
import com.openhtmltopdf.extend.SVGDrawer;
import com.openhtmltopdf.layout.SharedContext;
import com.openhtmltopdf.render.RenderingContext;
import com.openhtmltopdf.svgsupport.PDFTranscoder.OpenHtmlFontResolver;
import com.openhtmltopdf.util.XRLog;
import java.util.List;
import java.util.logging.Level;

public class BatikSVGDrawer implements SVGDrawer {

Expand All @@ -32,14 +31,14 @@ public void importFontFaceRules(List<FontFaceRule> fontFaces, SharedContext shar
}

@Override
public void drawSVG(Element svgElement, OutputDevice outputDevice, RenderingContext ctx, double x, double y, float dotsPerInch) {
public void drawSVG(Element svgElement, OutputDevice outputDevice, RenderingContext ctx, double x, double y, double width, double height, double dotsPerPixel) {

if (this.fontResolver == null) {
XRLog.general(Level.INFO, "importFontFaceRules has not been called for this pdf transcoder");
this.fontResolver = new OpenHtmlFontResolver();
}

PDFTranscoder transcoder = new PDFTranscoder(outputDevice, ctx, x, y, this.fontResolver, dotsPerInch);
PDFTranscoder transcoder = new PDFTranscoder(outputDevice, ctx, x, y, width, height, this.fontResolver, dotsPerPixel);

try {
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
package com.openhtmltopdf.svgsupport;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.Image;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Stroke;
import com.openhtmltopdf.css.parser.FSRGBColor;
import com.openhtmltopdf.extend.OutputDevice;
import com.openhtmltopdf.render.RenderingContext;
import org.apache.batik.ext.awt.g2d.AbstractGraphics2D;
import org.apache.batik.ext.awt.g2d.GraphicContext;

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
Expand All @@ -22,13 +15,7 @@
import java.awt.image.renderable.RenderableImage;
import java.text.AttributedCharacterIterator;

import org.apache.batik.ext.awt.g2d.AbstractGraphics2D;
import org.apache.batik.ext.awt.g2d.GraphicContext;

import com.openhtmltopdf.css.parser.FSRGBColor;
import com.openhtmltopdf.extend.OutputDevice;
import com.openhtmltopdf.render.RenderingContext;

@Deprecated
public class PDFGraphics2DOutputDeviceAdapter extends AbstractGraphics2D {

private final RenderingContext ctx;
Expand Down
Loading

0 comments on commit 01323ed

Please sign in to comment.