有没有办法在PDFMake中动态检查剩余页面高度?在动态创建页面时,我希望能够检查剩余的可用页面高度,以将其与元素高度进行比较,以便最后的页面元素(例如图像或长文本区域内容)无法剪切但转移到另一页面代替。不知道如何动态地做。
答案 0 :(得分:3)
谢谢你们所有人。我最后使用了pageBreakBefore函数和headlineLevel,它用作标记,并找到了pdfmake的一个版本,它允许我们查看节点是否是图像,因此我计算了元素的高度。 以下是我的代码中的外观。在那里我也有一个页脚,我必须在我的计算中考虑它,以便内容不应该继续:
pageBreakBefore: function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
var pageInnerHeight = currentNode.startPosition.pageInnerHeight;
var top = (currentNode.startPosition.top) ? currentNode.startPosition.top : 0;
var footerHeight = 30;
var nodeHeight = 0;
if (followingNodesOnPage && followingNodesOnPage.length) {
nodeHeight = followingNodesOnPage[0].startPosition.top - top;
}
if (currentNode.headlineLevel === 'footer') return false;
return (currentNode.image && (top + nodeHeight + footerHeight > pageInnerHeight))
|| (currentNode.headlineLevel === 'longField' && (top + nodeHeight + footerHeight > pageInnerHeight))
|| currentNode.startPosition.verticalRatio >= 0.95;
}
答案 1 :(得分:2)
好吧,我可能会迟到一点。但在版本0.1.17中,他们引入了 pageBreakBefore 函数。
您现在可以指定pageBreakBefore函数,该函数可以确定是否应在分页符之前插入分页符。实施一个孤儿“没有孤儿”。规则,这可能是这样的:
for(boost::unordered_multimap<string, string>::iterator> it = ret.first ; it != ret.second; it++)
{
cout<<"The values mapped are : "<<*it->second<<"\n";
}
如果pageBreakBefore返回true,则会在currentNode之前添加分页符。当前节点附有以下信息:
var dd = {
content: [
{text: '1 Headline', headlineLevel: 1},
'Some long text of variable length ...',
{text: '2 Headline', headlineLevel: 1},
'Some long text of variable length ...',
{text: '3 Headline', headlineLevel: 1},
'Some long text of variable length ...',
],
pageBreakBefore: function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
return currentNode.headlineLevel === 1 && followingNodesOnPage.length === 0;
}
}
答案 2 :(得分:0)
我最近在一次开发者代表大会上与一位同事交谈过。他们面临同样的问题。如果你真的需要知道,据我所知,有两种可能性:
1)测试渲染页面数据并检查输出是否超过一页。这是令人沮丧的,但你不知道内部。
2)在生成pdf之前,自行完成pdfmake中的计算。关于如何在遗憾的情况下需要查看pdfmake生成代码本身。
如果有更优雅的解决方案,我非常想了解自己!
答案 3 :(得分:0)
我是手动完成的。您需要的只是在文本开始出来之前知道页面的最大大小。就我而言,在文本被截断之前,Legal纸张尺寸的最大宽度为700px。
所以我所做的是减少循环中的列宽,直到totalPageWidth小于acceptableWidth。 它可能不太可读,但这是代码。
// For a legal size page, total width is 700. So try and push all columns within 700
// Following lines are there to reduce the width of columns so as to adjust the total width.
// Width is deducted for every column so as not to affect any individual column.
totalOutOfPageWidth = totalWidth - 700;
var totalWidthDeducted = 0;
while (totalOutOfPageWidth > 0) {
for (var c = 0; c < colWidthArray.length; c++) {
if (totalOutOfPageWidth > 0) {
if (colWidthArray[c] == width70 - totalWidthDeducted) {
colWidthArray[c] = colWidthArray[c] - 5;
totalOutOfPageWidth -= 5;
}
}
}
if (totalOutOfPageWidth > 0) {
for (var c = 0; c < colWidthArray.length; c++) {
if (colWidthArray[c] == width50 - totalWidthDeducted) {
colWidthArray[c] = colWidthArray[c] - 5;
totalOutOfPageWidth -= 5;
}
}
}
if (totalOutOfPageWidth > 0) {
for (var c = 0; c < colWidthArray.length; c++) {
if (colWidthArray[c] == width35 - totalWidthDeducted) {
colWidthArray[c] = colWidthArray[c] - 5;
totalOutOfPageWidth -= 5;
}
}
}
if (totalOutOfPageWidth > 0) {
for (var c = 0; c < colWidthArray.length; c++) {
if (colWidthArray[c] == width25 - totalWidthDeducted) {
colWidthArray[c] = colWidthArray[c] - 5;
totalOutOfPageWidth -= 5;
}
}
}
totalWidthDeducted += 5;