PDF.JS: Rendern Sie PDF mit einem ArrayBuffer oder Blob anstelle von URL

9

Ich kenne eine ähnliche Frage zu diesem: Pdf.js: Rendern einer PDF-Datei mit einer base64-Dateiquelle anstelle einer URL . Diese Frage wurde von Codetoffel unglaublich beantwortet, aber meine Frage ist anders, da mein PDF über einen REST-Aufruf an meine Web-API abgerufen wird Implementierung. Lass es mich erklären ...

Zunächst können Sie mit PDF.JS eine PDF-Datei über eine URL öffnen:

%Vor%

Das funktioniert großartig, aber ich benutze Angular und seinen Service $resource , um die Anfrage für das PDF über meine RESTful Web API zu machen. Ich weiß, dass PDF.JS mir erlaubt, die Übergabe der URL als Zeichenfolge in der PDFJS.getDocument-Methode (oben) durch ein DocumentInitParams -Objekt zu ersetzen, das hier . Die Verwendung des DocumentInitParams-Objekts funktioniert folgendermaßen:

%Vor%

Das funktioniert auch, aber es funktioniert um meine Angular $resource , indem ich die API-URL erstellen muss. Aber das ist in Ordnung, weil PDFJS es mir erlaubt, die PDF-Daten direkt zu geben, anstatt sie wie folgt mit einer URL zu versehen:

%Vor%

Dies ist der eine, den ich nicht zur Arbeit bringen kann. Ich kann der myService.$gtPdf -Methode sagen, die Daten als blob oder als arraybuffer zurückzugeben, aber keiner funktioniert. Ich habe versucht, die arraybuffer zurückgegebenen Daten in ein Uint8Array zu konvertieren, aber ohne Erfolg.

Ich bin mir nicht sicher, was ich sonst noch versuchen könnte und könnte wirklich einen Tipp verwenden.

Wie erhalte ich die von meinem Dienst zurückgegebenen Daten für die Arbeit mit PDFJS?

Vielen Dank im Voraus.

    
witttness 18.06.2014, 14:27
quelle

1 Antwort

17

Sie übergeben die Antwortdaten nicht an PDF.js, sondern an eine Instanz der Ressource:

%Vor%

Sie haben Ihren Code für $getPdf nicht angezeigt, aber ich nehme an, dass dies etwas mit

zu tun hat %Vor%

Standardmäßig behandelt ein AngularJS $resource die Antwort als ein Objekt (aus JSON deserialisiert) und kopiert alle Eigenschaften des Objekts in die Ressourceninstanz ( myPdf im vorherigen Ausschnitt).

Offensichtlich wird dies nicht funktionieren, da Ihre Antwort ein Array-Puffer ist (oder ein Blob, typisiertes Array oder was auch immer). Eine der Möglichkeiten, die gewünschte Antwort zu erhalten, besteht darin, transformResponse zu verwenden, um das Antwortobjekt in ein Objekt einzufügen:

%Vor%

Oder einfach das Folgende (vermiedene unnötige lokale Variablen):

%Vor%     
Rob W 18.06.2014, 16:00
quelle