SVG用于打印带刻度

时间:2017-09-06 13:46:31

标签: javascript svg viewport viewbox

我有一个SVG文件代表我的浏览器中的一个单位,我需要以特定的比例打印输出。我正在使用SVG.js来操纵SVG内容,但我无法找到正确的视口视图框设置的组合以满足我的需求。

我所知道的是SVG源文件大小。 通过x和y坐标,我计算了一个距离,以找到正确的“屏幕比例”,以匹配计划中1厘米的像素数。

对于打印,我需要尊重“特定比例”,例如1/50。 所以我尝试使用“屏幕比例”和SVG文件大小来获得真正的平面大小。然后我在总尺寸上应用了1/50(0.02)比例。然后我尝试在72dpi的分辨率下猜测一些像素。

这是我的代码:

var svgNode = SVG(planNode);

var totalWidthCm = (svgNode.width().replace('px', '') * screenScale * printScaleVal);
var totalHeightCm = (svgNode.height().replace('px', '') * screenScale * printScaleVal);
var totalWidthPx = totalWidthCm * 0.393701 * 72;
var totalHeightPx = totalHeightCm * 0.393701 * 72;

svgNode.height(totalHeightPx + 'px');
svgNode.width(totalWidthPx  + 'px');

svgNode.viewbox('0', '0', '1000', '600');

SVG输出:

<svg xmlns:cc="http://creativecommons.org/ns#" xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg" version="1.1" width="495.79113386880005px" height="387.87611496479997px"
     preserveAspectRatio="xMinYMin slice" id="plan" xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:svgjs="http://svgjs.com/svgjs" viewBox="0 0 496 388">
     .....
</svg>

事实上,我不知道如何设置视口和视图框以显示完整或切片的缩放容纳SVG,以便以A4或A3格式打印它。

哦亲爱的SVG专家,希望我的瓶子能找到你:D

2 个答案:

答案 0 :(得分:2)

您不能依赖于屏幕上X像素的内容在打印时将为X像素的事实。您需要打印一些样本并测量打印的SVG以计算比例。它在浏览器和打印机之间会有所不同。

首先将SVG设置为在屏幕上以1:1渲染。为此,请将width="496"height="388"设置为与viewBox匹配。

打印并测量已知尺寸。比如一面墙。

所以,让我们说你的计划上的2米墙在打印时是53毫米。那么您的实际长度与打印长度比例因子是

2m = 53mm printed
worldToPrinterScaleFactor = 53 / 2000

要打印房间的1:1比例副本,您需要将SVG缩放(乘以)1 / worldToPrinterScaleFactor

要打印房间的半尺寸副本,您需要将SVG缩放(乘以)0.5 / worldToPrinterScaleFactor

但如果你想以1/50打印......

printScale = 1 / 50

然后您需要通过以下方式扩展您的SVG:

printScale / worldToPrinterScaleFactor

所以你的JS应该是这样的:

var printScale = 1 / 50;

var worldToPrinterScaleFactor = 53 / 2000;
var svgScale = printScale / worldToPrinterScaleFactor;

var svgNode = document.getElementById("plan");
var viewBox = svgNode.viewBox.baseVal;

svgNode.width.baseVal.value = svgScale * viewBox.width;
svgNode.height.baseVal.value = svgScale * viewBox.height;

答案 1 :(得分:1)

您应该以打印尺寸设置宽度和高度参数,例如毫米。然后还应该使用完全相同的宽度,高度参数定义视图框,以在打印输出上获得确切的尺寸。

在您的情况下(从像素到cms的转换约为1/50):

<svg xmlns:cc="http://creativecommons.org/ns#" xmlns:svg="http://www.w3.org/2000/svg"
     xmlns="http://www.w3.org/2000/svg" version="1.1" width="100mm"   height="80mm"
     preserveAspectRatio="xMinYMin slice" id="plan" xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:svgjs="http://svgjs.com/svgjs" viewBox="0 0 100 80">
     .....
</svg>

这将按比例提供所需的打印输出;前提是将打印机设置为使用正确的纸张尺寸以100%的比例(而不是“适合页面”)。

缩放比例可以作为Paul解释的不同要求的附加系数添加。