it-swarm-eu.dev

Vytisknout PDF přímo z JavaScriptu

Stavím seznam PDF v HTML. V seznamu bych chtěl uvést odkaz ke stažení a tlačítko Tisk/odkaz. Existuje nějaký způsob, jak otevřít dialogové okno PDF, aniž by uživatel viděl PDF nebo otevřel prohlížeč PDF?

Některá variace stahování PDF do skrytého iframe a jeho spuštění pro tisk s JavaScriptem?

70
Craig Celeste

Tato otázka demonstruje přístup, který vám může pomoci: Tichý tisk vloženého PDF

Pro vložení PDF do dokumentu používá značku <embed>:

<embed
    type="application/pdf"
    src="path_to_pdf_document.pdf"
    id="pdfDocument"
    width="100%"
    height="100%" />

Potom zavoláte metodu .print() na elementu v jazyce Javascript, když je načten objekt PDF:

function printDocument(documentId) {
    var doc = document.getElementById(documentId);

    //Wait until PDF is ready to print    
    if (typeof doc.print === 'undefined') {    
        setTimeout(function(){printDocument(documentId);}, 1000);
    } else {
        doc.print();
    }
}

Můžete vložit vložený do skrytého iframe a vytisknout ho odtud, což vám umožní bezproblémový zážitek.

50
nullability

Zde je funkce pro tisk PDF z iframe.

Musíte pouze předat URL funkce PDF funkci. Po načtení PDF se vytvoří iframe a tisk spouštění.

Všimněte si, že funkce nezničí iframe. Místo toho jej znovu použije při každém volání funkce. Je těžké zničit iframe, protože je potřeba, dokud se tisk neprovede, a metoda tisku nemá podporu zpětného volání (pokud vím).

printPdf = function (url) {
  var iframe = this._printIframe;
  if (!this._printIframe) {
    iframe = this._printIframe = document.createElement('iframe');
    document.body.appendChild(iframe);

    iframe.style.display = 'none';
    iframe.onload = function() {
      setTimeout(function() {
        iframe.focus();
        iframe.contentWindow.print();
      }, 1);
    };
  }

  iframe.src = url;
}
24
Nicolas BADIA

Stáhnout soubor Print.js z http://printjs.crabbly.com/

$http({
    url: "",
    method: "GET",
    headers: {
        "Content-type": "application/pdf"
    },
    responseType: "arraybuffer"
}).success(function (data, status, headers, config) {
    var pdfFile = new Blob([data], {
        type: "application/pdf"
    });
    var pdfUrl = URL.createObjectURL(pdfFile);
    //window.open(pdfUrl);
    printJS(pdfUrl);
    //var printwWindow = $window.open(pdfUrl);
    //printwWindow.print();
}).error(function (data, status, headers, config) {
    alert("Sorry, something went wrong")
});
17
user1892203

https://github.com/mozilla/pdf.js/

pro živé demo http://mozilla.github.io/pdf.js/

je to pravděpodobně to, co chcete, ale nemohu to vidět, protože moderní prohlížeče obsahují takové funkce, také to bude hrozně pomalé na zařízeních s nízkým výkonem, jako jsou mobilní zařízení, která mimochodem mají své vlastní optimalizované pluginy a aplikace .

11
user2311177

Tuto funkci jsem využil ke stažení datového toku ze serveru.

function printPdf(url) {
        var iframe = document.createElement('iframe');
        // iframe.id = 'pdfIframe'
        iframe.className='pdfIframe'
        document.body.appendChild(iframe);
        iframe.style.display = 'none';
        iframe.onload = function () {
            setTimeout(function () {
                iframe.focus();
                iframe.contentWindow.print();
                URL.revokeObjectURL(url)
                // document.body.removeChild(iframe)
            }, 1);
        };
        iframe.src = url;
        // URL.revokeObjectURL(url)
    }
1
Adnan shah

Cross browser řešení pro tisk PDF z řetězce base64:

  • Chrome: Otevře se okno pro tisk
  • FF: otevře se nová záložka s pdf
  • IE11: otevřít/uložit Prompt se otevře

.

const blobPdfFromBase64String = base64String => {
   const byteArray = Uint8Array.from(
     atob(base64String)
       .split('')
       .map(char => char.charCodeAt(0))
   );
  return new Blob([byteArray], { type: 'application/pdf' });
};

const isIE11 = !!(window.navigator && window.navigator.msSaveOrOpenBlob); // or however you want to check it

const printPDF = blob => {
   try {
     isIE11
       ? window.navigator.msSaveOrOpenBlob(blob, 'documents.pdf')
       : printJS(URL.createObjectURL(blob)); // http://printjs.crabbly.com/
   } catch (e) {
     throw PDFError;
   }
};

printPDF(blobPdfFromBase64String(base64String))

BONUS - otevření souboru blob v nové záložce pro IE11

Pokud jste schopni provést nějaké předzpracování řetězce base64 na serveru, můžete jej vystavit pod url a použít odkaz v printJS :)

0
Papi