使用CasperJS抓取PDF文件

时间:2016-02-19 05:20:22

标签: javascript pdf casperjs

我正在尝试抓取使用pdf.js制作的PDF文件的内容 Example

问题是一些DOM元素在FireBug中显示但在页面源中没有显示,所以每当我尝试抓取时,我都会得到空白的pdf页面。

我尝试使用NightWatchJs做同样的事情并且它有效,但出于特定目的,我想坚持使用CasperJS。

这是我的代码

var casper = require('casper').create({
    verbose: true,
    logLevel: 'debug',
    userAgent: 'Mozilla/5.0  poi poi poi (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',
    contentType: 'application/pdf',
    viewportSize: {
        width:2000,
        height:1000
    },
    pageSettings: {
        javascriptEnabled: true,
        loadImages: true,
        loadPlugins: true
    }
});

var fs = require('fs');

casper.start('https://mozilla.github.io/pdf.js/web/viewer.html', function() {

     this.waitForSelector("#pageContainer1", function check() {
          var pdfContent = this.getPageContent();
          fs.write( '/var/www/caspersJS/pdf_check.html', pdfContent, 'w+' );

          this.capture('/var/www/caspersJS/pdf_check.png', {
                top:0,
                left:0,
                height:2368,
                width:2024,
                format: 'png',
                quality: 100
          });
     }, function then() {
          var pdfContent = this.getPageContent();
          fs.write( '/var/www/caspersJS/pdf_then.html', pdfContent, 'w+' );

          this.capture('/var/www/caspersJS/pdf_then.png', {
                top:0,
                left:0,
                height:2368,
                width:2024,
                format: 'png',
                quality: 100
          });
     }, 60000);
});
casper.run();

2 个答案:

答案 0 :(得分:0)

当我正在研究类似的问题时,刚发现这篇文章。你可能已经转向别的东西了。但我只是想为那些正在研究这些问题的人添加一些内容。

据我所知,pdf.js中查看的每个页面内容仅在您滚动到/靠近其位置时加载。因此,如果您不仅需要第1页上的信息,请务必将滚动条添加到脚本中。如果您期待获取整个文件。你可以用PDFView.download();这是pdf.js中提供的函数,只要您可以查看整个pdf。

答案 1 :(得分:-2)

在加载页面(和PDF)之前,您尚未完全等待。 #pageContainer1是第一页的容器,但容器可能存在,但其内容尚未创建。

casper.waitForSelector(selector, then, onTimeout, timeout)将等待,直到selector在DOM中可用,然后执行then回调。如果在selector毫秒等待后未找到timeout,则会执行onTimeout

您可以设计一个更好的选择器,可以显示页面是否已加载,或者您可以等待一段时间:

this.waitForSelector("#pageContainer1")
    .wait(5000, function() {
        var pdfContent = this.getPageContent();
        fs.write( 'pdf_check.html', pdfContent, 'w+' );

        this.capture('pdf_check.png');
    });