2012-06-28 73 views
15

Tôi chỉ mới bắt đầu với pdf.js và tôi đang cố tải một tệp pdf từ dữ liệu pdf thô. Tôi đã thấy mã:Sử dụng pdf.js để hiển thị pdf từ dữ liệu thô

PDFJS.getPdf('cwpdf.pdf', function getPdfHelloWorld(data) { 
    ... 
} 

Nhưng tôi tự hỏi có cách nào tải pdf từ dữ liệu pdf thô thay vì từ tên tệp hay không. Điều này có thể không?

Trả lời

5

Tôi đặt cùng một số mã hoàn chỉnh và đã có thể tìm ra vấn đề với các giải pháp dưới đây:

var int8View = new Uint8Array(...); //populate int8View with the raw pdf data 
PDFJS.getDocument(int8View).then(function(pdf) { 
} 

Khi sử dụng giải pháp này tôi chạy vào vấn đề mà người dùng khác đã thấy (@MurWade và @ user94154) - thông báo lỗi stream must have data. Có vẻ như vấn đề nằm trong dòng sau:

var int8View = new Uint8Array(...); 

Mảng chứa dữ liệu không được tạo đúng cách vì dữ liệu không có định dạng mong muốn. Do đó, dòng này hoạt động đối với một số trường hợp, nhưng nó có thể không hoạt động trong trường hợp chung.

Tôi đã kết hợp một giải pháp hoàn chỉnh, có vẻ như hoạt động tốt hơn. Nó tải một tập tin PDF, và nó chuyển đổi nó thành một dòng PDF thô. Điều này là có chỉ cho mục đích thử nghiệm, trong một ví dụ thế giới thực, dòng PDF có thể sẽ nhận được trong một thời trang khác nhau. Bạn có thể kiểm tra luồng trong trình gỡ lỗi và nó sẽ hiển thị dưới dạng văn bản thuần túy. Dưới đây là dòng chính của mã để làm mẫu này hoạt động. Thay vào đó chuyển đổi luồng PDF thô thành một mảng, chuyển đổi nó thành dữ liệu.

var docInitParams = { data: pdfraw }; 

Sau đó tiếp tục tải dữ liệu. Dưới đây là mẫu làm việc hoàn chỉnh về cách tải luồng PDF thô chuẩn và hiển thị nó. Tôi đã sử dụng PDF JS xin chào mẫu thế giới như là một điểm khởi đầu. Xin vui lòng cho tôi biết trong các ý kiến ​​nếu làm rõ là cần thiết về điều này.

'use strict'; 
 

 
PDFJS.getDocument('helloworld.pdf').then(function(pdf) { 
 

 

 
    pdf.getData().then(function(arrayBuffer) { 
 
    var pdfraw = String.fromCharCode.apply(null, arrayBuffer); 
 

 
    var docInitParams = { 
 
     data: pdfraw 
 
    }; 
 
    PDFJS.getDocument(docInitParams).then(function(pdfFromRaw) { 
 
     pdfFromRaw.getPage(1).then(function(page) { 
 
     var scale = 1.5; 
 
     var viewport = page.getViewport(scale); 
 

 
     var canvas = document.getElementById('the-canvas'); 
 
     var context = canvas.getContext('2d'); 
 
     canvas.height = viewport.height; 
 
     canvas.width = viewport.width; 
 

 
     var renderContext = { 
 
      canvasContext: context, 
 
      viewport: viewport 
 
     }; 
 
     page.render(renderContext); 
 
     }); 
 
    }); 
 
    }); 
 
});

+0

Tốt, chấp nhận câu trả lời này vì câu trả lời có vẻ hoàn chỉnh hơn câu trả lời gốc của tôi! – Swiss

+0

Cảm ơn! Hãy cho tôi biết nếu tôi có thể làm bất cứ điều gì để cải thiện nó. –

+0

@ user94154, giải pháp trên có trả lời được câu hỏi của bạn không? –

2

Vâng, vì không ai khác đã trả lời tôi sẽ đăng các phát hiện của tôi. Tôi đã tìm ra rằng có, có thể tải một tập tin pdf từ dữ liệu thô. Cách này có thể được thực hiện là bằng cách sử dụng một UInt8Array dân cư với dữ liệu thay cho địa chỉ nơi tệp pdf được lưu trữ.

Ví dụ mã để làm điều này là dưới đây:

var int8View = new Uint8Array(...); //populate int8View with the raw pdf data 
PDFJS.getDocument(int8View).then(function(pdf) { 

} 
+0

này didnt làm việc cho tôi. tôi nhận được lỗi 'dòng phải có dữ liệu' – MurWade

+0

Tôi nhận được lỗi đó @MurWade. Tôi sẽ * yêu * để sửa lỗi này. – user94154

+0

http://jsperf.com/string-to-uint8array – user94154