【发布时间】:2022-10-19 23:50:11
【问题描述】:
做pdf.js只允许部分呈现 PDF 页面?更具体地说,是否可以告诉pdf.js从整个 PDF 页面中呈现选定的“像素矩形”?
假设分辨率为 144 dpi,典型的页面 (DIN A4) 大约有 144 dpi。 684(宽)乘 1190(高)像素。我想渲染(例如)一个矩形,如 [100, 100](左上角坐标,以像素为单位)和 [400, 400](右下角坐标,以像素为单位)。
一个典型的用例可能是一个带有几个手写笔记的扫描文档,我想单独显示和进一步处理这些笔记。
我确实理解“解决方法”可能是将整个页面保存为 jpg(或任何其他合适的位图格式)并应用一些剪辑功能。但这肯定是一种比选定渲染性能更低的方法。
pdfs.js使用viewport 对象(可能包含参数)进行渲染。该对象包含
heightwidthoffsetXoffsetYrotationscaletransform-
viewBox(默认[0, 0, 宽度/比例, 高度/比例])
有人可能认为在其中操纵viewBox 可能会导致预期的结果,但我发现更改viewBox 参数根本没有任何作用。每次我应用 render 方法时都会呈现整个页面。
我可能做错了什么?做pdf.js提供所需的功能?如果是这样,我怎样才能让它工作?非常感谢!
这是一个非常简单的 React 组件,展示了我的方法(不起作用):
import React, { useRef } from 'react';
import { pdfjs } from 'react-pdf';
pdfjs.GlobalWorkerOptions.workerSrc = 'pdf.worker.js';
function PdfTest() {
// useRef hooks
const myCanvas: React.RefObject<HTMLCanvasElement> = useRef(null);
const test = () => {
const loadDocument = pdfjs.getDocument('...');
loadDocument.promise
.then((pdf) => {
return pdf.getPage(1);
})
.then((page) => {
const viewport = page.getViewport({ scale: 2 });
// Here I modify the viewport object on purpose
viewport.viewBox = [100, 100, 400, 400];
if (myCanvas.current) {
const context = myCanvas.current.getContext('2d');
if (context) {
page.render({ canvasContext: context, viewport: viewport });
myCanvas.current.height = viewport.height;
myCanvas.current.width = viewport.width;
}
}
});
};
// Render function
return (
<div>
<button onClick={test}>Test!</button>
<canvas ref={myCanvas} />
</div>
);
}
export default PdfTest;
【问题讨论】: