Je construis une liste de PDF en HTML. Dans la liste, j'aimerais inclure un lien de téléchargement et un bouton/lien d'impression. Existe-t-il un moyen d'ouvrir directement la boîte de dialogue Imprimer du PDF sans que l'utilisateur voie le PDF ou n'ouvre un visualiseur PDF?
Une variante du téléchargement du fichier PDF dans une iframe masquée et de l’impression en JavaScript?
Cette question illustre une approche qui pourrait vous être utile: Imprimer en mode silencieux un fichier PDF
Il utilise la balise <embed>
pour incorporer le PDF dans le document:
<embed
type="application/pdf"
src="path_to_pdf_document.pdf"
id="pdfDocument"
width="100%"
height="100%" />
Ensuite, vous appelez la méthode .print()
sur l'élément en Javascript lorsque le PDF est chargé:
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();
}
}
Vous pouvez placer l’incorporation dans un iframe caché et l’imprimer à partir de là, pour une expérience continue.
Voici une fonction pour imprimer un PDF à partir d'un iframe.
Il vous suffit de transmettre l'URL du PDF à la fonction. Il créera une iframe et déclenchera une impression lorsque le PDF sera chargé.
Notez que la fonction ne détruit pas l'iframe. Au lieu de cela, il le réutilise chaque fois que la fonction est appelée. Il est difficile de détruire l’iframe car il est nécessaire jusqu’à ce que l’impression soit terminée, et la méthode d’impression ne prend pas en charge les rappels (à ma connaissance).
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;
}
Téléchargez le fichier Print.js à partir de 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")
});
https://github.com/mozilla/pdf.js/
pour une démonstration en direct http://mozilla.github.io/pdf.js/
c'est probablement ce que vous voulez, mais je ne vois pas l'intérêt de cela, car les navigateurs modernes incluent de telles fonctionnalités. De plus, il fonctionnera très lentement sur les appareils de faible puissance, comme les appareils mobiles, qui ont d'ailleurs leurs propres plugins et applications optimisés. .
J'ai utilisé cette fonction pour télécharger un flux pdf à partir du serveur.
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)
}
Solution de navigateur croisé pour l'impression de pdf à partir d'une chaîne base64:
.
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 - Ouvrir un fichier blob dans un nouvel onglet pour IE11
Si vous pouvez effectuer un traitement préalable de la chaîne base64 sur le serveur, vous pouvez l'exposer sous une URL et utiliser le lien dans printJS
:)