经过反复尝试,我最终成功实现了在Windows 8应用程序中打印代表PDF二进制码的Base64流。我使用HTML/CSS/WinJS编写这个应用程序。下面是简要说明:
在 default.html
文件中创建一个新的 <canvas>
元素。把它放在 <body>
元素的开标签之后,像这样:
<body role="application" class="app">
<canvas id="pdf-render-output"></canvas>
.
.
.
</body>
然后在default.css
文件中,设置一些规则以及打印媒体查询。就像这样:
body > canvas {
display: none;
}
.
.
.
@media print {
body > * {
display:none;
max-width: 100%;
}
html {
max-width: 100%;
border-top-color: none;
border-top: 0;
}
body > canvas {
display: block;
border: none;
max-width: 100%;
width: 100%;
height: 100%;
position: relative;
}
}
值得注意的是CSS规则的声明顺序。在声明默认CSS规则之后,将打印媒体查询放置在重要位置非常重要。
设置完成后,JavaScript负责其余工作。基本思路是将PDF.js输出渲染到DOM中的“隐藏”画布中。当文档对象被发送到打印机时,会查询CSS打印媒体声明,以便在``下的所有元素都被隐藏,除了画布元素。以下是仅打印PDF第一页的JavaScript代码:
var pdfPrintData = {};
printPrescription: function () {
var self = Application.navigator.pageControl,
printManager = Windows.Graphics.Printing.PrintManager.getForCurrentView();
self.getPDF().done(function () {
var pdfStream = pdfPrintData.base64,
pdfFile = convertDataURIToBinary(pdfStream);
PDFJS.disableWorker = true;
PDFJS.getDocument(pdfFile).then(function (pdf) {
var numPages = pdf.numPages,
renderCanvas = $('#pdf-render-output')[0];
renderCanvas.height = pdf.getPage(1).data.getViewport(1).height;
renderCanvas.width = pdf.getPage(1).data.getViewport(1).width;
var renderContext = {
canvasContext: renderCanvas.getContext('2d'),
viewport: pdf.getPage(1).data.getViewport(1)
};
pdf.getPage(1).data.render(renderContext).then(function () {
printManager.onprinttaskrequested = self.onPrintTaskRequested;
Windows.Graphics.Printing.PrintManager.showPrintUIAsync();
});
})
});
},
onPrintTaskRequested: function (e) {
var self = Application.navigator.pageControl,
printTask = e.request.createPrintTask("Print Prescription", function (args) {
args.setSource(MSApp.getHtmlPrintDocumentSource(document));
printTask.oncompleted = self.onPrintTaskCompleted;
});
},
onPrintTaskCompleted: function (e) {
if (e.completion === Windows.Graphics.Printing.PrintTaskCompletion.failed) {
console.log("[ERX] : Failed to print!");
}
}
self.getPDF
方法只是一个检索Base64数据流的函数,该流设置在全局pdfPrintData
对象的.base64
属性上。由于某种原因,我无法使用pdf.js将pdf呈现到动态创建的文档中的动态创建的画布中。我必须将pdf.js渲染方法的输出呈现到DOM中已经存在的画布中。
<script>
标签。如果您尝试使用pdf.js,分享您在SO上的发现将是很好的。 - Sushil