mPDF:table 中标题 [h1-hx] 边距的解决方法

mPDF: workaround for heading [h1-hx] margins in table

问题:

如何向属于 TDTH 的标题 (h1 - h4) 添加边距 and/or 填充?

现状:

我有一个由 JIRA 生成的 pre-generated HTML 文档。本文档结构如下:

<tr class="rowAlternate">
  <td class="jira-macro-table-underline-pdfexport">
    <h1><a name="StandardizedInterface"></a>Standardized Interface</span></h1>
    <h2><a name="ShortDescription"></a>Short Description</h2>
    <ul> ... </ul>
  </td>
</tr>

我用 <tocentry> 和其他 mPDF-specific 元素以编程方式扩展了该文档,因此它可以用作讲义,生成的 PDF 看起来相当不错,但我在标题方面存在一个主要问题表。

这是文档在浏览器中的显示方式:

内部生成的 PDF:

可以看到标题的边距在 PDF 导出中消失了。到目前为止,我所有将内联 CSS 添加到标题或用其他元素包裹它们的测试都失败了。 mPDF documentation 表示:

Block-level tags (DIV, P etc) are ignored inside tables, including any CSS styles.

这很可能意味着这不能用纯 CSS 或包装来完成。

我希望之前有人遇到过这个问题,并且可以分享一些关于如何在块元素周围实现间距的见解。

您需要将标记转换为类似于以下的格式:

<table>
    <tr>
        <td class="h1">Report</td>
    </tr>

    <tr>
        <td class="h2">Description</td>
    </tr>

    <tr>
        <td>Body</td>
    </tr>
</table>

然后您可以通过定位 class 名称对 <td> 元素应用适当的填充:

<style>
table, th, td {
    border: none;
}

td.h1 {
    padding: 30px 0;
}

td.h2 {
    padding: 15px 0;
}
</style>

Use a DOM parser like the one from Symfony 帮助您遍历当前标记并自动以正确的格式重建它。

解决方法/解决方案

我使用了一种变通方法,通过使用 preg_replace_callback() 解决了我的问题,无论如何我都需要它来正确格式化我的文档。每当回调处理标题时,我都会在标题文本后添加一个透明图像,标题文本的高度是我通过一些数学运算定义的。

代码

function formatHeading($p) {

  // I only want headings for h1-h3:
  $tocEntry= '';
  if (is_numeric($p[2]) &&  $p[2] >= 1 && $p[2] <= 3) {
    $tocEntry= "<tocentry level=\"{$p[2]}\" content=\"{$p[3]}\" />";
  }

  // calculates the heights of the vertical spacer
  $spacerHeight= ((6-$p[2]) * 10);

  return
  "{$p[1]}{$tocEntry} {$p[3]} {$p[4]}
   <img src=\"../assets/images/transparent.png\" height=\"{$spacerHeight}\" style=\"vertical-align:middle;\" width=\"1\" border=\"0\"/>";
}

// Matches e.g. "<h2><a name="SimpleTest"></a>Simple test</h2>"
$buffered= preg_replace_callback('|(<h(\d)+>?<a?[\w\s\d="%>]+<\/a>)(.+?[\s\r\n\']*.*)(<\/h\d+>)|',
  "formatHeading", $buffered);

结果

为了说明垫片的位置,我使用 non-transparent 图像生成 PDF: