How to build PDF file from binary string returned from a web-service using javascript

后端 未结 8 1637
悲哀的现实
悲哀的现实 2020-11-22 14:33

I am trying to build a PDF file out of a binary stream which I receive as a response from an Ajax request.

Via XmlHttpRequest I receive the following da

相关标签:
8条回答
  • 2020-11-22 14:55

    I changed this:

    var htmlText = '<embed width=100% height=100%'
                     + ' type="application/pdf"'
                     + ' src="data:application/pdf,'
                     + escape(pdfText)
                     + '"></embed>'; 
    

    to

    var htmlText = '<embed width=100% height=100%'
                     + ' type="application/pdf"'
                     + ' src="data:application/pdf;base64,'
                     + escape(pdfText)
                     + '"></embed>'; 
    

    and it worked for me.

    0 讨论(0)
  • 2020-11-22 14:58

    You can use PDF.js to create PDF files from javascript... it's easy to code... hope this solve your doubt!!!

    Regards!

    0 讨论(0)
  • 2020-11-22 14:59

    I saw another question on just this topic recently (streaming pdf into iframe using dataurl only works in chrome).

    I've constructed pdfs in the ast and streamed them to the browser. I was creating them first with fdf, then with a pdf class I wrote myself - in each case the pdf was created from data retrieved from a COM object based on a couple of of GET params passed in via the url.

    From looking at your data sent recieved in the ajax call, it looks like you're nearly there. I haven't played with the code for a couple of years now and didn't document it as well as I'd have cared to, but - I think all you need to do is set the target of an iframe to be the url you get the pdf from. Though this may not work - the file that oututs the pdf may also have to outut a html response header first.

    In a nutshell, this is the output code I used:

    //We send to a browser
    header('Content-Type: application/pdf');
    if(headers_sent())
        $this->Error('Some data has already been output, can\'t send PDF file');
    header('Content-Length: '.strlen($this->buffer));
    header('Content-Disposition: inline; filename="'.$name.'"');
    header('Cache-Control: private, max-age=0, must-revalidate');
    header('Pragma: public');
    ini_set('zlib.output_compression','0');
    echo $this->buffer;
    

    So, without seeing the full response text fro the ajax call I can't really be certain what it is, though I'm inclined to think that the code that outputs the pdf you're requesting may only be doig the equivalent of the last line in the above code. If it's code you have control over, I'd try setting the headers - then this way the browser can just deal with the response text - you don't have to bother doing a thing to it.

    I simply constructed a url for the pdf I wanted (a timetable) then created a string that represented the html for an iframe of the desired sie, id etc that used the constructed url as it's src. As soon as I set the inner html of a div to the constructed html string, the browser asked for the pdf and then displayed it when it was received.

    function  showPdfTt(studentId)
    {
        var url, tgt;
        title = byId("popupTitle");
        title.innerHTML = "Timetable for " + studentId;
        tgt = byId("popupContent");
        url = "pdftimetable.php?";
        url += "id="+studentId;
        url += "&type=Student";
        tgt.innerHTML = "<iframe onload=\"centerElem(byId('box'))\" src='"+url+"' width=\"700px\" height=\"500px\"></iframe>";
    }
    

    EDIT: forgot to mention - you can send binary pdf's in this manner. The streams they contain don't need to be ascii85 or hex encoded. I used flate on all the streams in the pdf and it worked fine.

    0 讨论(0)
  • 2020-11-22 15:00

    Is there any solution like building a pdf file on file system in order to let the user download it?

    Try setting responseType of XMLHttpRequest to blob , substituting download attribute at a element for window.open to allow download of response from XMLHttpRequest as .pdf file

    var request = new XMLHttpRequest();
    request.open("GET", "/path/to/pdf", true); 
    request.responseType = "blob";
    request.onload = function (e) {
        if (this.status === 200) {
            // `blob` response
            console.log(this.response);
            // create `objectURL` of `this.response` : `.pdf` as `Blob`
            var file = window.URL.createObjectURL(this.response);
            var a = document.createElement("a");
            a.href = file;
            a.download = this.response.name || "detailPDF";
            document.body.appendChild(a);
            a.click();
            // remove `a` following `Save As` dialog, 
            // `window` regains `focus`
            window.onfocus = function () {                     
              document.body.removeChild(a)
            }
        };
    };
    request.send();
    
    0 讨论(0)
  • 2020-11-22 15:06

    Detect the browser and use Data-URI for Chrome and use PDF.js as below for other browsers.

    PDFJS.getDocument(url_of_pdf)
    .then(function(pdf) {
        return pdf.getPage(1);
    })
    .then(function(page) {
        // get a viewport
        var scale = 1.5;
        var viewport = page.getViewport(scale);
        // get or create a canvas
        var canvas = ...;
        canvas.width = viewport.width;
        canvas.height = viewport.height;
    
        // render a page
        page.render({
            canvasContext: canvas.getContext('2d'),
            viewport: viewport
        });
    })
    .catch(function(err) {
        // deal with errors here!
    });
    
    0 讨论(0)
  • 2020-11-22 15:09

    I realize this is a rather old question, but here's the solution I came up with today:

    doSomethingToRequestData().then(function(downloadedFile) {
      // create a download anchor tag
      var downloadLink      = document.createElement('a');
      downloadLink.target   = '_blank';
      downloadLink.download = 'name_to_give_saved_file.pdf';
    
      // convert downloaded data to a Blob
      var blob = new Blob([downloadedFile.data], { type: 'application/pdf' });
    
      // create an object URL from the Blob
      var URL = window.URL || window.webkitURL;
      var downloadUrl = URL.createObjectURL(blob);
    
      // set object URL as the anchor's href
      downloadLink.href = downloadUrl;
    
      // append the anchor to document body
      document.body.append(downloadLink);
    
      // fire a click event on the anchor
      downloadLink.click();
    
      // cleanup: remove element and revoke object URL
      document.body.removeChild(downloadLink);
      URL.revokeObjectURL(downloadUrl);
    }
    
    0 讨论(0)
提交回复
热议问题