基本的に、ディレクティブ要素に制限する必要があります。テンプレートを使用してcanvas
およびdiv
タグを追加します。次に、関数でそれらを呼び出してlink
、pdf をレンダリングします。
これをさらに一歩進めて、PDFJS
およびrender
およびload
関数を角度サービスにラップし、それをディレクティブに挿入することができます。そうすれば、読み込みメソッドとレンダリング メソッドがサービスに配置され、ディレクティブはテンプレートをセットアップしてそれらを呼び出すだけです。
マークアップ:
<pdf-viewer pdf-path="pathToYourPdf"></pdf-viewer>
ディレクティブ:
これは実際には機能的なディレクティブではありませんが、探しているものを達成する方法の一般的なアイデアを提供する必要があります。
angular.module('myApp', [])
.directive('pdfViewer', [
function() {
return {
template: '<canvas></canvas><div></div>',
replace: true,
restrict: 'E',
scope: {
pdfPath: '='
},
link: function postLink(scope, iElement, iAttrs) {
scope.pdfPath = iAttrs.$eval(pdfPath);
scope.pdf = PDFJS.getDocument(scope.pdfPath);
scope.pdf
.then(renderPdf);
var renderPdf = function() {
service.pdf.getPage(1)
.then(renderPage);
};
var renderPage = function(page) {
var viewport = page.getViewport(scale);
var canvas = iElement.find('canvas')[0];
// Set the canvas height and width to the height and width of the viewport
var context = canvas.getContext("2d");
// The following few lines of code set up scaling on the context if we are on a HiDPI display
var outputScale = getOutputScale(context);
canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
canvas.style.width = Math.floor(viewport.width) + 'px';
canvas.style.height = Math.floor(viewport.height) + 'px';
// Append the canvas to the pdf container div
var $pdfContainer = iElement;
iElement.css("height", canvas.style.height)
.css("width", canvas.style.width);
var canvasOffset = canvas.offset();
var textLayerDiv = iElement.find('div')[0];
textLayerDiv
.addClass("textLayer")
.css("height", canvas.style.height)
.css("width", canvas.style.width)
.offset({
top: canvasOffset.top,
left: canvasOffset.left
});
context._scaleX = outputScale.sx;
context._scaleY = outputScale.sy;
if (outputScale.scaled) {
context.scale(outputScale.sx, outputScale.sy);
}
page.getTextContent()
.then(function(textContent) {
var textLayer = new TextLayerBuilder({
textLayerDiv: textLayerDiv,
viewport: viewport,
pageIndex: 0
});
textLayer.setTextContent(textContent);
var renderContext = {
canvasContext: context,
viewport: viewport
};
page.render(renderContext);
});
};
}
};
}
]);