我正在使用 html-pdf 2.2.0 模块将我的 html 转换为 pdf。我使用的是多行表格,所以我想使用分页符,这样单行就不会分成两页,但在将其转换为 pdf 时不起作用。
下面是代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<style>
table tbody tr {
height: 120px;
border:5px solid red;
}
</style>
<body>
<table border="1" style="page-break-after: always;">
<thead>
<tr>
<td>AA</td>
<td>BB</td>
<td>CC</td>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</tbody>
</table>
</body>
</html>
当使用简单的 HTML 打印代码(CTRL + P)时,它看起来不错,但当将其转换为 pdf 时,它不起作用。
很难找到可以在保留所有布局的同时将内容转换为 PDF 的好包或 API。我花了很多时间调查并尝试了很多不同的解决方案(直接将 HTML 转换为 PDF,转换为 DOCX,然后从 DOCX 转换为 PDF...)。我建议你检查在线转换工具(大多数都是免费的,你可以很快地使用它们,你只需要上传文件,他们会给你一个 PDF 文件供你下载)。如果您只需要转换这个 html 文件,那么这是最好的方法(因为其中一种工具可能会以正确的方式转换它)。如果您需要它作为一项功能,那么您可以向为您工作的转换器提供商请求 API 访问。
通常,当您将 PDF 转换为 HTML 时,它工作正常,但是当您尝试将其转换回来(即使是相同的 HTML)时,它看起来将与原始版本不同。根据我的经验,最好的映射是在 PDF 和 DOCX 文件之间。因此,也许您可以考虑先将 HTML 转换为 DOCX,然后再将 DOCX 转换为 PDF。有一些 npm 包可以同时执行这两种操作,因此您可以检查它们(或考虑再次检查在线转换工具)。
我建议使用
tr, td { page-break-inside: avoid; }
来防止行和单元格内部中断。
这就是我想出来的
<style>
@media print {
.page-break {
page-break-before: always;
}
}
</style>
<table>
<thead>
<tr>
<th>Index</th>
</tr>
</thead>
<tbody>
<% data.forEach((itm, index) => { %>
<tr>
<td><%= index + 1 %></td>
</tr>
<% if ((index + 1) % 5 === 0) { %> <!-- This will apply page break after every 5 entry on a page -->
</table>
<div class="page-break"></div>
<table>
<% } %>
<% }) %>
</tbody>
我建议使用下面的CSS来解决这个问题
<style type="text/css">
table { page-break-inside:auto }
tr { page-break-inside:avoid; page-break-after:auto }
thead { display:table-header-group }
tfoot { display:tenter code hereable-footer-group }
</style>
不幸的是,这种情况是在 Node 中使用一些库将 html 转换为 pdf 时发生的,它甚至被视为报告的错误,到目前为止似乎还没有解决方案,但是,有一种方法可以解决这个问题。
如果不是创建多个列和行,而是将它们全部创建为表格并将其应用到 CSS:
table, tr, td { page-break-inside: avoid; }
就能解决问题。
如何创建表格来解决 HTML 中的问题的示例:
<table>
<tr>
<th>AA</th>
<th>BB</th>
<th>CC</th>
</tr>
</table>
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</table>
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</table>
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</table>
...
这是我能够解决 pdf 库节点中问题的唯一方法