2012-06-28 15 views
15

Właśnie zaczynam od pdf.js i próbuję załadować plik pdf z surowych danych pdf. Widziałem kod:Używanie pdf.js do wyświetlania pdf z nieprzetworzonych danych

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

Ale zastanawiam się czy jest jakiś sposób, aby załadować plik PDF z surowych danych pdf zamiast z nazwy pliku. czy to możliwe?

Odpowiedz

5

ułożyła jakiś kompletny kod i był w stanie znaleźć problemu z poniższej rozwiązania:

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

Przy zastosowaniu tego rozwiązania wpadłem na problem, który inni użytkownicy widzieli (@MurWade i @ user94154) - komunikat o błędzie stream must have data. Wygląda na to, że problem jest w następujący wiersz:

var int8View = new Uint8Array(...); 

Tablica zawierająca dane nie zostanie prawidłowo utworzony, ponieważ dane nie są w oczekiwanym formacie. Dlatego linia ta działa w niektórych przypadkach, ale może nie działać w ogólnym przypadku.

Połączyłem kompletne rozwiązanie, które wydaje się działać lepiej. Ładuje plik PDF i konwertuje go do nieprzetworzonego strumienia PDF. Jest to tylko do celów testowych, w rzeczywistym świecie, strumień PDF zostanie prawdopodobnie odebrany w inny sposób. Możesz sprawdzić strumień w debugerze i będzie on wyświetlany jako zwykły tekst. Poniżej znajduje się kluczowa linia kodu, aby ten przykład działał. Zamiast konwertować surowy strumień PDF do tablicy, przekonwertuj go na dane.

var docInitParams = { data: pdfraw }; 

Następnie kontynuuj ładowanie danych. Poniżej znajduje się pełna robocza próbka ładowania standardowego nieprzetworzonego strumienia PDF i wyświetlania go. Kiedyś jako punkt wyjścia użyłem próbki PDF JS hello world. Proszę dać mi znać w komentarzach, jeśli wyjaśnienia są konieczne.

'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

Przyjemnie, akceptuję tę odpowiedź, ponieważ wydaje się bardziej kompletna niż moja oryginalna! – Swiss

+0

Dzięki! Daj mi znać, jeśli mogę zrobić cokolwiek, aby to poprawić. –

+0

@ user94154, czy powyższe rozwiązanie odpowiada na twoje pytanie? –

2

Cóż, ponieważ nikt inny nie odpowiedział, opublikuję moje wnioski. Uznałem, że tak, możliwe jest załadowanie pliku pdf z surowych danych. Sposób, w jaki można to zrobić, polega na użyciu tablicy UInt8Array wypełnionej danymi zamiast adresu URL do miejsca przechowywania pliku pdf.

Przykładowy kod na to jest poniżej:

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

} 
+0

Ta praca nie zrobił dla mnie. pojawia się błąd 'strumień musi mieć dane' – MurWade

+0

Otrzymuję ten sam błąd @MurWade. Uwielbiam * to naprawić. – user94154

+0

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

Powiązane problemy