2013-08-24 47 views
7

我使用PhantomJS将可变高度的网页导出为pdf。由于pdf可以具有任何页面大小(更像是比率,因为它是矢量的),所以我想以一种可以在pdf中创建单个页面的方式导出它,以适合整个网页。使用PhantomJS生成单页.pdf

幸运的是,使用evaluate PhantomJS方法我可以很容易地检测页面高度

page.includeJs('jquery.js', function() { 
    var pageHeight = page.evaluate(function() { 
    return $('#content').height(); 
    }); 
}); 

但是,我不知道我怎么可以用它来我的优势。 viewportSize似乎没有任何影响,因为我没有渲染视口,而是整个文档。我将它设置为固定的{width: 800, height: 800}

所以我无法将头围绕paperSize大小。设置高度返回pageHeight将呈现1.5x页面,所以我试着调整宽度,但它并没有真正加起来,我可以理解的任何公式。

如何实现这一点,或者你有更深入的理解了paperSize属性,并从页面

+0

不是问题,但感谢的焦点为demoing的includeJS方法来显示如何让jQuery的成幻影js脚本! – chiliNUT

回答

1

viewportSize渲染的像素大小的范围之间的关系的任何想法模拟窗口的大小,就像在传统的浏览器。它由于HTML布局而影响页面的呈现,但不直接影响PDF呈现。

使用page.papersize可以定义网页在呈现为PDF时的大小。带着几分的jQuery,可以很容易地显示网页在一个文档中,像这样的:

var page = require('webpage').create(), 
    system = require('system'), 
    address, output; 

if (system.args.length != 3) { 
    console.log('Usage: spdf.js URL filename'); 
    phantom.exit(1); 
} else { 
    address = system.args[1]; 
    output = system.args[2]; 
    page.viewportSize = { width: 600, height: 600 }; 

    page.open(address, function (status) { 
     if (status !== 'success') { 
      console.log('Unable to load the address!'); 
      phantom.exit(); 
     } else { 
      var size = page.evaluate(function() { 
       return {width: width = $(document).width(), height : $(document).height() }; 
      }); 

      page.paperSize = size; 

      page.render(output); 
      phantom.exit(); 
     } 
    }); 
} 
+0

感谢您的评论,我试过这个,但由于某种原因,我的PDF最终将有2页,1页和半页被我的页面使用。即使宽度看起来好像比viewportSize.width小。它的行为就好像它在某种程度上被放大了一样,但我确保将zoomFactor设置为1.任何想法为什么会发生这种情况,或者如何调试会发生什么? – treznik

+0

同样的问题正在发生在我身上。任何帮助,将不胜感激 –

+0

看到这个:http://stackoverflow.com/a/14036545/1420669 –

2

扩展Cyber​​maxs'的答案,我加入

  • 设定一个固定的宽度(36厘米与对应良好我的查看端口)和
  • 一个单位的高度计算
  • 设置边距为0px。

我不能给出一个很好的解释,但它适用于我。

完整的脚本:

var page = require('webpage').create(), 
system = require('system'), 
address, output, size; 

if (system.args.length < 3 || system.args.length > 5) { 
    console.log('Usage: screenshot.js <URL> <filename>'); 
    phantom.exit(1); 
} else { 
    address = system.args[1]; 
    output = system.args[2]; 
    page.viewportSize = { width: 1280, height: 900}; 
    page.open(address, function (status) { 
     if (status !== 'success') { 
      console.log('Unable to load the address!'); 
      phantom.exit(); 
     } else { 
      window.setTimeout(function() { 
       page.includeJs("//code.jquery.com/jquery-1.10.1.min.js", function() { 
        var size = page.evaluate(function() { 
         return {width: width = "36cm", height : $(document).height()*2+400 + "px", margin: '0px' }; 
        }); 
        page.paperSize = size;   
        page.render(output); 
        phantom.exit(); 
       }); 
      }, 400); 
     } 
    }); 
}