Css 边框小于 4px @300dpi 使用 wkhtmltopdf
Css border smaller than 4px @300dpi using wkhtmltopdf
我正在生成一个自动填充的 PDF,它是从给我的 inDesign 布局中克隆而来的。此布局使用表格,表格边框为 0.5pt。使用 wkhtmltopdf 时,这些边框无法正确呈现,因为 webkit 不希望线条细于 0.8pt/1px。
我尝试使用变通方法,例如 0.8px(屏幕上 100% 时不显示,正确高度为 400%),直接 0.5pt,或使用 1px 框阴影,none 这似乎给我的厚度是正确的,因为低于 1px 或低于 0.8pt 的线没有呈现到我的 PDF 文件中,而 1px 的框阴影给我同样的问题。
编辑:我用来生成 PDF 的命令:wkhtmltopdf.exe -T 0 -B 0 -L 0 -R 0 --dpi 300 --disable-smart-shrinking <input> <output>
我不反对光学解决方法。
这是我的问题的预览:
提前致谢!
已解决。
如果它被 wkhtmltopdf 处理,则无法使用 CSS。
我发现的第一个解决方法是用 zoom:1.41 以 A3 纸张大小呈现页面,然后以 zoom:1/(1.41) 呈现 A4 纸张大小。那是相当臃肿。
所以,我用 SVG 精灵替换了边框,height/width 为 0.2 毫米。它允许我跳过 A4->A3->A4 转换,并且仍然使用 --disable-smart-shrinking 选项,即使我的标记现在很难看。
我找到的解决方法是将文档中的所有像素值缩放 2,然后应用 css 变换将其再次缩小到正确的大小。
//original
body{ width: 210mm; }
p{ font-size:12px; }
.bordered{ border-width: 0.5px; ) //didn't work
//hacked
body{ width: 420mm; transform: scale(0.5); transform-origin: 0 0; }
p{ font-size:24px; }
.bordered{ border-width: 1px; }
呈现引擎在执行 css 转换之前必须解析所有值并舍入到最接近的整数。
显然,如果您需要 0.5 像素的线条(无论这在现实印刷世界中意味着什么!),这很有效。更细粒度的控制需要更大的比例,我还没有尝试过。
从理论上讲,将正文字体大小设置为正常值的某个倍数相当容易,然后使用 rems 使 css 更加美观且缩放速度更快。
编辑:
我可以确认缩放 10 倍然后向下变换非常有效,可以生成精确到 0.1 像素的边框/线条。这是一些 scss:
$final_width: 210mm;
$final_height: 297mm;
$scale_factor: 10;
$page_width: #{$scale_factor * $final_width};
$page_height: #{$scale_factor * $final_height};
html{
padding: 0;
margin: 0;
font-size: #{$scale_factor*10}px;
}
body{
transform: scale(#{1/$scale_factor});
transform-origin: 0 0;
width: $page_width;
height: $page_height;
margin: 0;
margin-bottom: -$page_height;
...
以 rems 为单位定义所有布局尺寸:例如border: 0.05rem(最终结果为 0.5px,在本例中为 1rem = 10px)
我在 CSS 中设置了正文宽度。
我必须在 100 dpi 下设置 800 像素的宽度才能获得 1 像素的边框
我正在生成一个自动填充的 PDF,它是从给我的 inDesign 布局中克隆而来的。此布局使用表格,表格边框为 0.5pt。使用 wkhtmltopdf 时,这些边框无法正确呈现,因为 webkit 不希望线条细于 0.8pt/1px。
我尝试使用变通方法,例如 0.8px(屏幕上 100% 时不显示,正确高度为 400%),直接 0.5pt,或使用 1px 框阴影,none 这似乎给我的厚度是正确的,因为低于 1px 或低于 0.8pt 的线没有呈现到我的 PDF 文件中,而 1px 的框阴影给我同样的问题。
编辑:我用来生成 PDF 的命令:wkhtmltopdf.exe -T 0 -B 0 -L 0 -R 0 --dpi 300 --disable-smart-shrinking <input> <output>
我不反对光学解决方法。
这是我的问题的预览:
提前致谢!
已解决。 如果它被 wkhtmltopdf 处理,则无法使用 CSS。
我发现的第一个解决方法是用 zoom:1.41 以 A3 纸张大小呈现页面,然后以 zoom:1/(1.41) 呈现 A4 纸张大小。那是相当臃肿。
所以,我用 SVG 精灵替换了边框,height/width 为 0.2 毫米。它允许我跳过 A4->A3->A4 转换,并且仍然使用 --disable-smart-shrinking 选项,即使我的标记现在很难看。
我找到的解决方法是将文档中的所有像素值缩放 2,然后应用 css 变换将其再次缩小到正确的大小。
//original
body{ width: 210mm; }
p{ font-size:12px; }
.bordered{ border-width: 0.5px; ) //didn't work
//hacked
body{ width: 420mm; transform: scale(0.5); transform-origin: 0 0; }
p{ font-size:24px; }
.bordered{ border-width: 1px; }
呈现引擎在执行 css 转换之前必须解析所有值并舍入到最接近的整数。
显然,如果您需要 0.5 像素的线条(无论这在现实印刷世界中意味着什么!),这很有效。更细粒度的控制需要更大的比例,我还没有尝试过。
从理论上讲,将正文字体大小设置为正常值的某个倍数相当容易,然后使用 rems 使 css 更加美观且缩放速度更快。
编辑:
我可以确认缩放 10 倍然后向下变换非常有效,可以生成精确到 0.1 像素的边框/线条。这是一些 scss:
$final_width: 210mm;
$final_height: 297mm;
$scale_factor: 10;
$page_width: #{$scale_factor * $final_width};
$page_height: #{$scale_factor * $final_height};
html{
padding: 0;
margin: 0;
font-size: #{$scale_factor*10}px;
}
body{
transform: scale(#{1/$scale_factor});
transform-origin: 0 0;
width: $page_width;
height: $page_height;
margin: 0;
margin-bottom: -$page_height;
...
以 rems 为单位定义所有布局尺寸:例如border: 0.05rem(最终结果为 0.5px,在本例中为 1rem = 10px)
我在 CSS 中设置了正文宽度。
我必须在 100 dpi 下设置 800 像素的宽度才能获得 1 像素的边框