如何在PDFMake中动态检查剩余页面高度?

时间:2016-06-05 09:04:00

标签: pdfmake

有没有办法在PDFMake中动态检查剩余页面高度?在动态创建页面时,我希望能够检查剩余的可用页面高度,以将其与元素高度进行比较,以便最后的页面元素(例如图像或长文本区域内容)无法剪切但转移到另一页面代替。不知道如何动态地做。

4 个答案:

答案 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 函数。

Release Notes on Github

  

您现在可以指定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;