TCPDF 生成:图像在过高时流入下一列
TCPDF generation: image flows into next column when too high
我目前正在生成 pdf 报告类型,其中几篇文章被合并到给定的布局中。几天前,我不得不更改 pdf 的结构,以便将文章文本分为三个单独的栏。
我面临的问题是,一旦您将图像插入 html 并且图像太高而无法放入第一列,例如,它会被放入第二列它应该是,但由于一些奇怪的间距或其他不同的东西,它向右偏移,因此图像的一半被推到以下列:
我为要生成的 PDF 生成 Html 的方式相当简单:
// add source to article
$htmlString = '<p style="font-size: 17px;">' . $valVal['source'] . ' vom ' . $valVal['date'] . '</p>';
// add title to article
$htmlString .= '<p style="font-size: 22px; text-align: left;">' . $valVal['title'] . '</p>';
// Add subtitle to article
if ($valVal['subtitle'] != '' && $valVal['subtitle'] != null) {
$htmlString .= '<p style="font-size: 13px; text-align: justify; padding: 0; margin: 0; font-weight: bold;">' . $valVal['subtitle'] . '</p>';
}
$this->pdf->writeHtml($htmlString . '<p><br></p>', true, false, false, false, '');
$htmlString = '';
$this->pdf->setEqualColumns(3, 57); // KEY PART - number of cols and width
$this->pdf->selectColumn(); // select proper column
// Add summary
if ($valVal['summary'] != '' && $valVal['summary'] != null) {
$htmlString .= '<p style="font-size: 13px;">Zusammenfassung:</p>';
$htmlString .= '<div class="article-summary" style="font-size: 13px; text-align: justify; padding-bottom: 0; margin-bottom: 0;">';
// if there are image captions, style them
if(preg_match("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", $valVal['summary'])) {
$valVal['summary'] = preg_replace("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", '<div style="background-color: #ffffff; font-size: 9px;"></div>', $valVal['summary']);
$valVal['summary'] = preg_replace("/<img([\w\W]+?)(\/|)>/", '<div style="text-align:center;">[=10=]</div>', $valVal['summary']);
}
$htmlString .= $valVal['summary'];
$htmlString .= '</div>';
}
// build html string for the article's text
$htmlString .= '<p style="font-size: 13px; text-align: justify;">';
// if there are image captions, style them
if(preg_match("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", $valVal['excerpt'])) {
$valVal['excerpt'] = preg_replace("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", '<div style="background-color: #ffffff; font-size: 9px;"></div>', $valVal['excerpt']);
$valVal['excerpt'] = preg_replace("/<img([\w\W]+?)(\/|)>/", '<div style="text-align:center;">[=10=]</div>', $valVal['excerpt']);
}
$htmlString .= $valVal['excerpt'];
$htmlString .= '</p>';
$this->writeHyphenatedHtml($htmlString); // the function uses the php library "Syllable" and then inserts the text via "WriteHtml" - this is not the issue, I've tested without the hyphenation
有没有人遇到过相关问题并且知道我该如何改进它?
编辑:特定部分的生成 html 如下所示 - 请忽略 html 实体:
<p>„AC/DC
bietet sich doch eigentlich fürs Klavier an“, kündigt Rüth im vollbesetzten Kammermusiksaal nach
knapp 100 überraschenden Konzertminuten die letzte Zugabe an.
„Oder Löwenzahn“
ergänzt ihre Bühnenkollegin Ming mit
koreanischen Wurzeln. Sie eröffnen
mit Johann Sebastian Bachs
„Toccata“ und treiben
sich gegenseitig an ihren Flügeln sitzend in den HardrockRhythmus der
australischen Rockband hinein.
„Thunderstruck“ von
AC/DC.
</p>
<figure id="attachment_620" style="width: 201px"
class="wp-caption alignnone">
<div
style="text-align:center;"><img
class="wp-image-620 size-full" src="
http://127.0.0.1/_project/wp-content/uploads/2019/01/bild-2.jpg"
alt="" width="201" height="245"
/></div>
<figcaption class="wp-caption-text">
<div style="background-color: #ffffff; font-size: 9px;">Die beiden
Musikerinnen nach der Show. (c)
Spiegel online
</div>
</figcaption>
</figure>
<p> Die beiden Musikerinnen spielen im Sitzen, im Stehen und im Liegen. Sie zupfen die
Saiten der beiden Flügel, sie benutzen sie als Percussions-Instrument
oder einfach nur als Ablage für ihre
</p>
这个 <div style="text-align:center;">
你包裹你的图像是问题所在。我假设这是为了在您的图像未跨越列的整个宽度时确保居中对齐。更改 text-alignment
不会更改内部提供给 Image
的值,因此它是当前 layout/parser 状态和列中断处理的某种组合。此时调试TCPDF状态有点超出我的能力范围
但是,我确实有一个解决方法:Table 支持在 TCPDF 中更强大一些,因此不要使用 div 来执行此中心对齐,而是使用 single-cell table
。即:<table width="100%"><tbody><tr><td align="center"><!--Image tag here--></td></tr></tbody></table>
这是我用来在下面的屏幕截图中生成输出的图像格式代码:
$valVal['excerpt'] = preg_replace("/<img([\w\W]+?)(\/|)>/", '<table width="100%"><tbody><tr><td align="center">[=10=]</td></tr></tbody></table>', $valVal['excerpt']);
//I'm wrapping any image tag here.
$valVal['excerpt'] = str_replace('<figcaption', '<div style="font-size: 9px;" ', $valVal['excerpt']);
$valVal['excerpt'] = str_replace('</figcaption', '</div', $valVal['excerpt']);
//figcaption not supported. Replacing to preserve proper text placement.
注意: TCPDF 从输入 HTML 中删除了 figcaption 和 figure,所以我偷懒了,只是用 divs 替换了 figcaption。在测试中,我发现通过将您的图像与 table 对齐,您的字幕 必须由支持的 BLOCK-LEVEL 标签 包裹,否则字幕文本将不会出现在列。
我目前正在生成 pdf 报告类型,其中几篇文章被合并到给定的布局中。几天前,我不得不更改 pdf 的结构,以便将文章文本分为三个单独的栏。
我面临的问题是,一旦您将图像插入 html 并且图像太高而无法放入第一列,例如,它会被放入第二列它应该是,但由于一些奇怪的间距或其他不同的东西,它向右偏移,因此图像的一半被推到以下列:
我为要生成的 PDF 生成 Html 的方式相当简单:
// add source to article
$htmlString = '<p style="font-size: 17px;">' . $valVal['source'] . ' vom ' . $valVal['date'] . '</p>';
// add title to article
$htmlString .= '<p style="font-size: 22px; text-align: left;">' . $valVal['title'] . '</p>';
// Add subtitle to article
if ($valVal['subtitle'] != '' && $valVal['subtitle'] != null) {
$htmlString .= '<p style="font-size: 13px; text-align: justify; padding: 0; margin: 0; font-weight: bold;">' . $valVal['subtitle'] . '</p>';
}
$this->pdf->writeHtml($htmlString . '<p><br></p>', true, false, false, false, '');
$htmlString = '';
$this->pdf->setEqualColumns(3, 57); // KEY PART - number of cols and width
$this->pdf->selectColumn(); // select proper column
// Add summary
if ($valVal['summary'] != '' && $valVal['summary'] != null) {
$htmlString .= '<p style="font-size: 13px;">Zusammenfassung:</p>';
$htmlString .= '<div class="article-summary" style="font-size: 13px; text-align: justify; padding-bottom: 0; margin-bottom: 0;">';
// if there are image captions, style them
if(preg_match("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", $valVal['summary'])) {
$valVal['summary'] = preg_replace("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", '<div style="background-color: #ffffff; font-size: 9px;"></div>', $valVal['summary']);
$valVal['summary'] = preg_replace("/<img([\w\W]+?)(\/|)>/", '<div style="text-align:center;">[=10=]</div>', $valVal['summary']);
}
$htmlString .= $valVal['summary'];
$htmlString .= '</div>';
}
// build html string for the article's text
$htmlString .= '<p style="font-size: 13px; text-align: justify;">';
// if there are image captions, style them
if(preg_match("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", $valVal['excerpt'])) {
$valVal['excerpt'] = preg_replace("/(\<figcaption.*\>)(.*)(\<\/figcaption\>)/", '<div style="background-color: #ffffff; font-size: 9px;"></div>', $valVal['excerpt']);
$valVal['excerpt'] = preg_replace("/<img([\w\W]+?)(\/|)>/", '<div style="text-align:center;">[=10=]</div>', $valVal['excerpt']);
}
$htmlString .= $valVal['excerpt'];
$htmlString .= '</p>';
$this->writeHyphenatedHtml($htmlString); // the function uses the php library "Syllable" and then inserts the text via "WriteHtml" - this is not the issue, I've tested without the hyphenation
有没有人遇到过相关问题并且知道我该如何改进它?
编辑:特定部分的生成 html 如下所示 - 请忽略 html 实体:
<p>„AC/DC
bietet sich doch eigentlich fürs Klavier an“, kündigt Rüth im vollbesetzten Kammermusiksaal nach
knapp 100 überraschenden Konzertminuten die letzte Zugabe an.
„Oder Löwenzahn“
ergänzt ihre Bühnenkollegin Ming mit
koreanischen Wurzeln. Sie eröffnen
mit Johann Sebastian Bachs
„Toccata“ und treiben
sich gegenseitig an ihren Flügeln sitzend in den HardrockRhythmus der
australischen Rockband hinein.
„Thunderstruck“ von
AC/DC.
</p>
<figure id="attachment_620" style="width: 201px"
class="wp-caption alignnone">
<div
style="text-align:center;"><img
class="wp-image-620 size-full" src="
http://127.0.0.1/_project/wp-content/uploads/2019/01/bild-2.jpg"
alt="" width="201" height="245"
/></div>
<figcaption class="wp-caption-text">
<div style="background-color: #ffffff; font-size: 9px;">Die beiden
Musikerinnen nach der Show. (c)
Spiegel online
</div>
</figcaption>
</figure>
<p> Die beiden Musikerinnen spielen im Sitzen, im Stehen und im Liegen. Sie zupfen die
Saiten der beiden Flügel, sie benutzen sie als Percussions-Instrument
oder einfach nur als Ablage für ihre
</p>
这个 <div style="text-align:center;">
你包裹你的图像是问题所在。我假设这是为了在您的图像未跨越列的整个宽度时确保居中对齐。更改 text-alignment
不会更改内部提供给 Image
的值,因此它是当前 layout/parser 状态和列中断处理的某种组合。此时调试TCPDF状态有点超出我的能力范围
但是,我确实有一个解决方法:Table 支持在 TCPDF 中更强大一些,因此不要使用 div 来执行此中心对齐,而是使用 single-cell table
。即:<table width="100%"><tbody><tr><td align="center"><!--Image tag here--></td></tr></tbody></table>
这是我用来在下面的屏幕截图中生成输出的图像格式代码:
$valVal['excerpt'] = preg_replace("/<img([\w\W]+?)(\/|)>/", '<table width="100%"><tbody><tr><td align="center">[=10=]</td></tr></tbody></table>', $valVal['excerpt']);
//I'm wrapping any image tag here.
$valVal['excerpt'] = str_replace('<figcaption', '<div style="font-size: 9px;" ', $valVal['excerpt']);
$valVal['excerpt'] = str_replace('</figcaption', '</div', $valVal['excerpt']);
//figcaption not supported. Replacing to preserve proper text placement.
注意: TCPDF 从输入 HTML 中删除了 figcaption 和 figure,所以我偷懒了,只是用 divs 替换了 figcaption。在测试中,我发现通过将您的图像与 table 对齐,您的字幕 必须由支持的 BLOCK-LEVEL 标签 包裹,否则字幕文本将不会出现在列。