2012-10-18 17 views
14

Tôi đang cố gắng bọc một tập lệnh PhantomJS trong tiến trình node.js. Kịch bản ảo lấy một url từ các đối số được cung cấp trên dòng lệnh và xuất ra một pdf (tương tự như ví dụ rasterize.js đi kèm với cài đặt pahntom).Sử dụng mô-đun Phantom 'trang web' trong node.js

Tập lệnh ảo tôi đã hoạt động tốt, chỉ chủ nhân của tôi muốn tập lệnh nút nếu có thể. Không sao, tôi có thể sử dụng mô-đun nút node-phantom để bọc nó.

Nhưng bây giờ tôi đã trúng một trở ngại, kịch bản phantom của tôi có:

var page = require('webpage').create(); 

Vì vậy, Node.js đang cố gắng tìm một module gọi là 'trang web', các mô-đun 'trang web' được xây dựng vào ma cài đặt để nút không thể tìm thấy nó. Theo như tôi có thể nói, không có mô-đun npm được gọi là 'trang web'.

'trang web' được sử dụng như thế này:

page.open(address, function (status) { 

    if (status !== 'success') { 

     // --- Error opening the webpage --- 
     console.log('Unable to load the address!'); 

    } else { 

     // --- Keep Looping Until Render Completes --- 
     window.setTimeout(function() { 
      page.render(output); 
      phantom.exit(); 
     }, 200); 
    } 
}); 

nơi địa chỉ là url được chỉ định trên dòng lệnh và đầu ra là một đối số, tên và loại của tập tin.

Có ai có thể giúp tôi không? Điều này khá trừu tượng vì vậy tôi không mong đợi nhiều nếu tôi trung thực, đáng thử mặc dù.

Cảm ơn.

EDIT - Khoảng 2 giờ sau

bây giờ tôi có điều này mà ném ra một PDF:

var phanty = require('node-phantom'); 

var system = require('system'); 

phanty.create(function(err,phantom) { 

    //var page = require('webpage').create(); 

    var address; 
    var output; 
    var size; 

    if (system.args.length < 4 || system.args.length > 6) { 

     // --- Bad Input --- 

     console.log('Wrong usage, you need to specify the BLAH BLAH BLAH'); 
     phantom.exit(1); 

    } else { 

     phantom.createPage(function(err,page){ 

      // --- Set Variables, Web Address, Output --- 
      address = system.args[2]; 
      output = system.args[3]; 
      page.viewportSize = { width: 600, height: 600 }; 


      // --- Set Variables, Web Address --- 
      if (system.args.length > 4 && system.args[3].substr(-4) === ".pdf") { 

       // --- PDF Specific --- 
       size = system.args[4].split('*'); 
       page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' } 
                : { format: system.args[4], orientation: 'portrait', margin: '1cm' }; 
      } 

      // --- Zoom Factor (Should Never Be Set) --- 
      if (system.args.length > 5) { 
       page.zoomFactor = system.args[5]; 
      } else { 
       page.zoomFactor = 1; 
      } 

      //---------------------------------------------------- 

      page.open(address ,function(err,status){ 

       if (status !== 'success') { 

        // --- Error opening the webpage --- 
        console.log('Unable to load the address!'); 

       } else { 

        // --- Keep Looping Until Render Completes --- 
        process.nextTick(function() { 
         page.render(output); 
         phantom.exit(); 
        }, 200); 
       } 

      }); 

     }); 
    } 
}); 

Nhưng! Nó không đúng kích cỡ! Đối tượng trang tạo ra bằng cách sử dụng ma 'trang web' tạo() chức năng trông như thế này trước khi nó được thông qua URL:

phantom returned page

Trong khi tôi trong kịch bản nút của tôi, trông như thế này:

my page

Có thể mã cứng các thuộc tính để đạt được định dạng A4 không? Tôi thiếu gì?

Tôi rất thân thiết!

+0

Bạn nhận được bất kỳ nơi nào với Adam này? Tôi tò mò. –

+0

Thật không may không phải là cuối cùng. Tôi đã thuyết phục nhóm của tôi sử dụng quá trình ảo thay vì làm việc tốt. –

+0

Ngoài sự tò mò, công cụ nào đang được sử dụng trong hai ảnh chụp màn hình cuối cùng? –

Trả lời

11

Nó phải là một cái gì đó như:

var phantom=require('../node-phantom'); 
phantom.create(function(error,ph){ 
    ph.createPage(function(err,page){ 
    page.open(url ,function(err,status){ 
     // do something 
    }); 
    }); 
}); 

nhầm lẫn của bạn ở đây là bởi vì bạn muốn sử dụng lại các khái niệm và ẩn dụ tương tự từ kịch bản PhantomJS của bạn. Nó không hoạt động theo cách đó. Tôi khuyên bạn nên dành một chút thời gian để nghiên cứu các thử nghiệm được bao gồm của nút-phantom, xem https://github.com/alexscheelmeyer/node-phantom/tree/master/test.

+1

cảm ơn câu trả lời. không thể tin rằng tác giả của Phantom đã trả lời :). Tôi rất gần với việc đóng đinh cái này. Tôi nhận được một đầu ra PDF bây giờ, nhưng nó không phải là kích thước phù hợp (A4). Tôi cần sử dụng hàm decorNewPage (opts, page) được xuất dưới dạng create() từ 'trang web' thay vì ph.createPage (chức năng (err, page) vì 'trang web' nhận tất cả các cài đặt và lưu trữ chúng trong trang var. Điều này có thể không? –

+0

Kiểm tra cập nhật của tôi cho câu hỏi, tôi rất gần nhưng không thể crack nó –

5

Sử dụng https://github.com/sgentle/phantomjs-node Tôi đã thực hiện một trang A4 trong nodejs sử dụng ma với đoạn mã sau:

phantom.create(function(ph){ 
    ph.createPage(function(page) { 
     page.set("paperSize", { format: "A4", orientation: 'portrait', margin: '1cm' }); 
     page.open("http://www.google.com", function(status) { 
      page.render("google.pdf", function(){ 
       console.log("page rendered"); 
       ph.exit(); 
      }) 
     }) 
    }) 

}); 

Side Lưu ý:

các page.set() chức năng có bất kỳ biến mà bạn sẽ thiết lập trong ví dụ rasterize.js. Xem cách paperSize được đặt ở trên và so sánh nó với các dòng có liên quan trong rasterize.js

+0

Cách làm việc này với ['phantomjs-prebuilt'] (https://www.npmjs.com/package/ phantomjs) – Rayon

+0

@Rayon Kiểm tra mô-đun này Tôi đã kết thúc việc tạo https://github.com/rknell/url2pdf Tôi đã được sử dụng rất gần đây trong sản xuất cho một dự án lớn và khá chắc chắn, chỉ cần tránh xa HTML trực tiếp Chuyển đổi PDF nếu bạn đang sử dụng hình ảnh –

Các vấn đề liên quan