我正在一个使用 ruby on rails(3.1) 的项目中工作。我的要求是从 html 内容生成 pdf。所以我使用pdfkit gem。
在某些页面中,单行字符在页面之间部分切开。当我使用 pdfkit gem 将 html 转换为 pdf
wkhtmltopdf 版本:wkhtmltopdf -- 0.11.0 rc1
操作系统:Linux CentOS 5.5
在下图中显示了页面之间部分剪切的字符。
请提出解决方案。
示例 1
示例 2
我正在一个使用 ruby on rails(3.1) 的项目中工作。我的要求是从 html 内容生成 pdf。所以我使用pdfkit gem。
在某些页面中,单行字符在页面之间部分切开。当我使用 pdfkit gem 将 html 转换为 pdf
wkhtmltopdf 版本:wkhtmltopdf -- 0.11.0 rc1
操作系统:Linux CentOS 5.5
在下图中显示了页面之间部分剪切的字符。
请提出解决方案。
示例 1
示例 2
我的桌子确实有这个问题:
然后我将它添加到我的 CSS 中:
table, img, blockquote {page-break-inside: avoid;}
这解决了问题:
我刚刚遇到了这个问题,发现了一些可以为我解决问题的东西。在我的特殊情况下,有 div 带有display: inline-block; margin-bottom: -20px;
. 一旦我将它们更改为阻止并重置边距底部,线条分割就消失了。YMMV。
根据我发现的一些文档(请参阅分页符),这是一个已知问题,建议使用 CSS 分页符插入分页符(假设您使用的是 QT 的修补版本):
WebKit 当前的分页算法还有很多不足之处。基本上 webkit 会将所有内容渲染成一个长页面,然后将其切割成页面。这意味着,如果您有两列文本,其中一列垂直移动了半行。然后 webkit 将一条线切成碎片显示在一页上的上半部分。下半部分在另一页。它还会将图像一分为二,依此类推。如果您使用的是 QT 的补丁版本,您可以使用 CSS page-break-inside 属性来解决这个问题。这个问题没有简单的解决方案,在解决这个问题之前,请尝试组织您的 HTML 文档,使其包含许多可以干净地剪切页面的行。
另请参阅:http ://code.google.com/p/wkhtmltopdf/issues/detail?id=9 、 http ://code.google.com/p/wkhtmltopdf/issues/detail?id=33和 http:// /code.google.com/p/wkhtmltopdf/issues/detail?id=57。
就我而言,通过注释掉以下 css 解决了这个问题:
html, body {
overflow-x: hidden;
}
一般来说,检查是否有任何标签overflow
设置为hidden
并将其删除或设置为visible
。
顺便说一句,我wkhtmltopdf version 0.12.2.1
在 Windows 8 上使用。
https://github.com/ArthurHub/HTML-Renderer/issues/38
**var head = "<head><style type=\"text/css\"> td, h1, h2, h3, p, b, div, i, span, label, ul, li, tr, table { page-break-inside: avoid; } </style></head>";**
PdfDocument pdf = PdfGenerator.GeneratePdf("html>" + head + "<body>" + m42Notes + "</body></html>", configurationOptions);
我解决了添加边距顶部和边距底部的问题,如下所示:
$this->get('knp_snappy.pdf')->generateFromHtml($html, $pdfFilepath, [
'default-header' => false,
'header-line' => false,
'footer-line' => false,
'disable-javascript' => true,
'margin-top' => '3mm',
'margin-bottom' => '3mm',
'margin-right' => '5mm',
'margin-left' => '5mm',
'orientation' => 'Landscape',
], true);
这很旧,但希望能对某人有所帮助-我也遇到了问题,尝试了所有方法-甚至求助于提到的旧版本(12.1)但无济于事。我一直在调整 css 来玩,试图在任何地方都避免分页符,但没有太大进展。然后我调整了我的 html 根 div 上的 css,并修复了它。我做了很多调整,试图让它工作,所以我不能 100% 确定,但我相信问题在于它设置为 'display:table',margin: 0 auto 和主外部 div 上的特定宽度。一旦我删除它,它就开始工作并且不会切断中间的图像或表格。然后 page-break-inside: Avoid 在那之后按预期工作。
我相信最终代码会尽可能准确地猜测每个页面有多少像素,以及您的内容到底在哪里(精确到像素)。我们必须通过尽可能多地删除其中的奇数 css 来使库更容易检测到这一点,因此尽可能简单地计算到内容所在的像素。这是我的猜测。
剪切文本问题是一个已知的 webkit 问题,似乎开发人员在 wkhtmltopdf 中找到了解决方案。更新到 0.12.1 将解决剪切文本问题(如果您不想浪费时间编译,您可以从这里获取二进制文件:https ://github.com/h4cc/wkhtmltopdf-amd64 )。
已经忍受了几个月,终于找到了解决我的情况的方法。我在我正在转换的 html 文件中使用 github css 样式表,code
如果跨多个页面的块会得到文本剪切。什么都没有,只是被切成了两半。
页面底部:
下一页开始:
所以在 github 样式表中溢出设置为自动<pre>
标记。
.markdown-body .highlight pre,
.markdown-body pre {
padding: 16px;
overflow: auto;
...
将溢出属性切换为隐藏为我解决了它!
.markdown-body .highlight pre,
.markdown-body pre {
padding: 16px;
overflow: hidden;
认为我尝试了此页面上的所有其他答案,但这已为我解决。希望它可以帮助别人:)
我在网上搜索了几个星期,试图解决这个问题。我找到的解决方案都没有对我有用,但有其他方法。
我有一个两列布局,其中文本被中间文本截断。在破碎状态下,我的基本结构是这样的:
@media print {
* {
page-break-inside: avoid;
page-break-after: avoid;
page-break-before: avoid;
}
}
.col-9{
display: inline-block;
width: 70%;
}
.col-9{
display: inline-block;
width: 25%;
}
<div class="col-9">
[a lot of text here, that would spill over multiple pages]
</div>
<div class="col-3">
[a short sidebar here]
</div>
我通过将其更改为:
@media print {
* {
page-break-inside: avoid;
page-break-after: avoid;
page-break-before: avoid;
}
}
.col-9{
display: block;
float: left;
width: 70%;
}
.col-9{
display: block;
float: left;
width: 25%;
}
.clear{
clear: both;
}
<div class="col-9">
[a lot of text here, that no longer split mid-line.]
</div>
<div class="col-3">
[a short sidebar here]
</div>
<div class="clear"></div>
由于某种原因,该工具无法处理显示:inline-block setup。它适用于花车。我正在运行版本 0.12.4。
通过从https://github.com/wkhtmltopdf/packaging/releases/0.12.6-1安装 wkhtmltox_0.12.6-1.bionic_amd64.deb (适用于 Ubuntu),我能够找到解决此问题的方法
更新此 wkhtmltox 包后,表格和文本将不再在页面末尾截断。此修复为我引入了一个不同的问题,现在生成的 pdf 没有样式。例如 font-family、font-size 甚至文本对齐方式都消失了,并且正在使用一些默认设置。