HTMLでPDFのリストを作成しています。リストには、ダウンロードリンクと印刷ボタン/リンクを含めたいと思います。ユーザーがPDFを表示したりPDFビューアを開いたりせずにPDFの[印刷]ダイアログを直接開く方法はありますか?
PDFを非表示のiframeにダウンロードして、JavaScriptで印刷するようにトリガーするバリエーションはありますか?
回答:
以下のコメントに基づいて、最新のブラウザでは動作しません
この質問は、あなたに役立つかもしれないアプローチを示しています:埋め込みPDFのサイレント印刷
<embed>
タグを使用してPDFをドキュメントに埋め込みます。
<embed
type="application/pdf"
src="path_to_pdf_document.pdf"
id="pdfDocument"
width="100%"
height="100%" />
次に.print()
、PDFの読み込み時にJavaScriptの要素のメソッドを呼び出します。
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();
}
}
埋め込みを非表示のiframeに配置してそこから印刷することで、シームレスなエクスペリエンスを実現できます。
iframeからPDFを印刷する機能です。
PDFのURLを関数に渡すだけです。PDFが読み込まれると、iframeが作成され、印刷がトリガーされます。
この関数はiframeを破棄しないことに注意してください。代わりに、関数が呼び出されるたびに再利用します。印刷が完了するまでiframeが必要であり、printメソッドはコールバックサポートを備えていないため(私が知る限り)、iframeを破棄するのは困難です。
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;
}
setTimeout
、印刷機能は時々失敗します。なぜだかわからず、誰かがそれを見つけてくれることを願っています。
onafterprint
ます。最初の印刷ダイアログが表示される前にiframe URLが既にスワップアウトされているため、iframeを再利用すると、誰かが2つのボタンをすばやくクリックして2番目のPDFを2回印刷するという競合状態が発生する可能性があることを少し心配しています。
http://printjs.crabbly.com/からPrint.jsをダウンロードします
$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/
ライブデモhttp://mozilla.github.io/pdf.js/
それはおそらくあなたが望んでいることですが、現代のブラウザにはそのような機能が含まれているので、私はこれのポイントを理解できません。 。
この機能を使用してサーバーからPDFストリームをダウンロードしました。
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)
}
base64文字列からPDFを印刷するためのクロスブラウザーソリューション:
。
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))
ボーナス-IE11の新しいタブでblobファイルを開く
サーバーでbase64文字列の前処理を実行できる場合は、それをいくつかのURLで公開し、printJS
:)でリンクを使用できます。