我必须在我的页面上使用PDFJS库显示PDF。问题在于,因为我将比例作为固定数量的画布给出,其中呈现的PDF不响应并且不适合引导网格列宽度。这是HTML代码:
<div class="row">
<div class="col-md-1" style="padding-right: 15px;">
<input type="button" ng-click="openPreviousPage()"/>
</div>
<div class="col-md-8">
<canvas id="the-canvas" style="border: 1px solid black;"></canvas>
</div>
<div class="col-md-1 col-md-offset-2" style="padding-right:15px;">
<input type="button" ng-click="openNextPage()" />
</div>
</div>
和我在控制器中的Typescript:
openPage = (pdf: PDFDocumentProxy, pageNumber: number) => {
pdf.getPage(pageNumber).then(function getPage(page) {
var scale = 1;
var viewport = page.getViewport(scale);
var canvas = <HTMLCanvasElement>document.getElementById('the-canvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: context,
viewport: viewport
};
//...rest of actions
});
}
对任何暗示都会感激不尽。
答案 0 :(得分:10)
您可以在画布容器id
上放置div
,并根据div.clientWidth
和viweport.width
设置比例。
在您的HTML代码上:
<div class="row">
<div class="col-md-1" style="padding-right: 15px;">
<input type="button" ng-click="openPreviousPage()"/>
</div>
<div class="col-md-8" id="the-container">
<canvas id="the-canvas" style="border: 1px solid black;"></canvas>
</div>
<div class="col-md-1 col-md-offset-2" style="padding-right:15px;">
<input type="button" ng-click="openNextPage()" />
</div>
</div>
然后在控制器上:
openPage = (pdf: PDFDocumentProxy, pageNumber: number) => {
pdf.getPage(pageNumber).then(function getPage(page) {
var container = document.getElementById('the-container');
var canvas = <HTMLCanvasElement>document.getElementById('the-canvas');
var context = canvas.getContext('2d');
var viewport = page.getViewport(1);
var scale = container.clientWidth / viewport.width;
viewport = page.getViewport(scale);
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: context,
viewport: viewport
};
//...rest of actions
});
}
希望这会有所帮助......
答案 1 :(得分:0)
对于以Acroforms示例为起点的任何人,您可能会注意到viewport.width与您在检查时在屏幕上呈现的内容不匹配,这使得上述解决方案使PDF大于所需的大小。在我的例子中,viewport.width是612,但是渲染到816.我终于发现这是CSS_UNITS变量的结果,它存在于pdf_viewer.js中。一旦我明白这一点,我就磨练了我的谷歌搜索,发现对话讨论了它的目的:
要调整这个不是全局的变量,我只是在本地再次声明它,然后调整上面的比例公式以包含它,如下所示:
'use strict';
PDFJS.workerSrc = '/assets/plugins/PDFjs/web/test/pdf.worker.js';
var DEFAULT_URL = '/assets/plugins/PDFjs/web/test/form.pdf';
var DEFAULT_SCALE = 1.0;
var CSS_UNITS = 96/72;
var container = document.getElementById('pageContainer');
// Fetch the PDF document from the URL using promises.
PDFJS.getDocument(DEFAULT_URL).then(function (doc) {
// Use a promise to fetch and render the next page.
var promise = Promise.resolve();
for (var i = 1; i <= doc.numPages; i++) {
promise = promise.then(function (pageNum) {
return doc.getPage(pageNum).then(function (pdfPage) {
var viewport = pdfPage.getViewport(DEFAULT_SCALE);
var scale = container.clientWidth / (viewport.width * CSS_UNITS);
// Create the page view.
var pdfPageView = new PDFJS.PDFPageView({
container: container,
id: pageNum,
scale: scale,
defaultViewport: pdfPage.getViewport(scale),
annotationLayerFactory: new PDFJS.DefaultAnnotationLayerFactory(),
renderInteractiveForms: true,
});
// Associate the actual page with the view and draw it.
pdfPageView.setPdfPage(pdfPage);
return pdfPageView.draw();
});
}.bind(null, i));
}
});
现在对我来说效果很好。希望我能够拯救你们中的一个人。 :)
干杯!