我在使用 @page 规则以及使用 MS Edge 和 Google Chrome 的“另存为 PDF”打印功能时遇到一些问题。这是我的问题:
我有一个 SVG 文件,正在尝试使用浏览器将其转换为 PDF(由于某种原因,我无法使用 svg2pdf 或 cairosvg 等库)。因此,我在浏览器中打开文件并尝试打印它(即使用选项“另存为 PDF”)。由于页面尺寸不是 A4,我使用 @page size css 属性指定页面尺寸。然而,即使在将 SVG 的确切长度指定为页面大小并将页边距设置为 0 后,PDF 中仍然有两页。
如果我增加 svg 标签的宽度或高度属性,并让 @page 大小保持原始尺寸,我就可以使用“另存为 PDF”选项,其中 PDF 仅具有单页。我无法理解这种行为。我不知道这是浏览器的错误还是这种行为是正确的行为,并且我对@page 规则的理解不正确。
<!DOCTYPE html>
<html>
<head>
<style>
@page {
margin: 0px;
size: 1152px 1599.84px;
}
</style>
</head>
<body>
<svg width='1152' height='1599.84' xmlns='http://www.w3.org/2000/svg'><text fill="green" stroke="None" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-dasharray="none" stroke-dashoffset="0" stroke-miterlimit="4" transform="translate(876.02, 1207.8899999999999) scale(1, 1) skewX(0) skewY(0)" fill-rule="nonzero" paint-first="fill" font-size="60" font-weight="normal" font-family="Segoe UI Symbol" font-style="normal" line-height="1.16" text-align="left">✓</text></svg>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<style>
@page {
margin: 0px;
size: 1152px 1599.84px;
}
</style>
</head>
<body>
<svg width='1160' height='1599.84' xmlns='http://www.w3.org/2000/svg'><text fill="green" stroke="None" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-dasharray="none" stroke-dashoffset="0" stroke-miterlimit="4" transform="translate(876.02, 1207.8899999999999) scale(1, 1) skewX(0) skewY(0)" fill-rule="nonzero" paint-first="fill" font-size="60" font-weight="normal" font-family="Segoe UI Symbol" font-style="normal" line-height="1.16" text-align="left">✓</text></svg>
</body>
</html>
我做了一些测试,看起来 Chromium 中的页面大小小数点被截断了。我认为这种行为是设计使然的。实际上页面大小等于
size: 1152px 1599px
,所以当svg高度为1599.84时你会得到两页。您还可以参考这个类似的帖子:Are the Decimal days in a CSS widthspected?.
之所以增加svg的宽度或高度才能打印一页,是因为页面尺寸比svg小,打印时svg会缩小。
如果要打印一页,可以将页面大小设置为1600px,并使svg的宽度和高度保持不变:
@page {
margin: 0px;
size: 1152px 1600px;
}