我们正在使用Batik,以便我们可以使用java Graphics2D(实际上是SVGGraphics2D)创建SVG文档。除缩放/调整大小外,一切都很好。
我们希望将EMU用于所有渲染的坐标。 (There are 914,400 EMUs/inch)。
关键代码是:
// set the userspace to scale to EMUs. All calls pass EMUs for coordinates and this maps it to the pixels.
public static final int EPI = 914400;
int dpi = getDPI(); // returns 600
AffineTransform scaleToEmus = AffineTransform.getScaleInstance(dpi / (float) EPI, dpi / (float) EPI);
graphics.transform(scaleToEmus);
// size (extent) of the SVG object.
svgGraphics.setSVGCanvasSize(new Dimension(width, height));
这会导致一些问题。最终,这会在<svg>
元素上设置width和height属性。
<svg width="1466850" height="1200150" …
构造函数还应用仿射变换,该仿射变换将EMU缩放到像素。 SVG XML将包含类似
的内容<g transform="matrix(0.0007,0,0,0.0007,0,0)" …
问题是转换不适用于<svg>
的宽度和高度。它可以通过在构造函数
svgGraphics.setSVGCanvasSize(new Dimension((int)Math.ceil(width * graphics.getTransform().getScaleX()), (int)Math.ceil(height * graphics.getTransform().getScaleY())));
但是,这并不适用于所有情况。例如,如果DPI = 600,宽度= 1466850(emu),则scaleX变为6.561679765582085E-4,缩放宽度变为963.但svg将包含矩阵(0.0007,...),这会导致形状不适合画布。这是一个产生矩阵元素的人围绕该值,以便6.561679765582085E-4 =&gt; 0.0007
解决方案可能是找出舍入算法并使用它来缩放画布大小。但我不喜欢调整数字以查看通过我特定用例的内容。
这个问题的建议方法是什么?
更新:答案是否可以通过定义viewBox来进行缩放?