mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-28 23:28:16 +02:00
[api-minor] Use the NodeCanvasFactory
/NodeCMapReaderFactory
classes as defaults in Node.js environments (issue 11900)
This moves, and slightly simplifies, code that's currently residing in the unit-test utils into the actual library, such that it's bundled with `GENERIC`-builds and used in e.g. the API-code. As an added bonus, this also brings out-of-the-box support for CMaps in e.g. the Node.js examples.
This commit is contained in:
parent
fe3df495cc
commit
4a7e29865d
10 changed files with 164 additions and 123 deletions
|
@ -16,7 +16,6 @@
|
|||
import {
|
||||
buildGetDocumentParams,
|
||||
DOMFileReaderFactory,
|
||||
NodeCanvasFactory,
|
||||
NodeFileReaderFactory,
|
||||
TEST_PDFS_PATH,
|
||||
} from "./test_utils.js";
|
||||
|
@ -49,6 +48,7 @@ import { GlobalImageCache } from "../../src/core/image_utils.js";
|
|||
import { GlobalWorkerOptions } from "../../src/display/worker_options.js";
|
||||
import { isNodeJS } from "../../src/shared/is_node.js";
|
||||
import { Metadata } from "../../src/display/metadata.js";
|
||||
import { NodeCanvasFactory } from "../../src/display/node_utils.js";
|
||||
|
||||
describe("api", function () {
|
||||
const basicApiFileName = "basicapi.pdf";
|
||||
|
|
|
@ -17,7 +17,7 @@ import { CMap, CMapFactory, IdentityCMap } from "../../src/core/cmap.js";
|
|||
import { DOMCMapReaderFactory } from "../../src/display/display_utils.js";
|
||||
import { isNodeJS } from "../../src/shared/is_node.js";
|
||||
import { Name } from "../../src/core/primitives.js";
|
||||
import { NodeCMapReaderFactory } from "./test_utils.js";
|
||||
import { NodeCMapReaderFactory } from "../../src/display/node_utils.js";
|
||||
import { StringStream } from "../../src/core/stream.js";
|
||||
|
||||
var cMapUrl = {
|
||||
|
|
|
@ -13,10 +13,11 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { buildGetDocumentParams, NodeCanvasFactory } from "./test_utils.js";
|
||||
import { buildGetDocumentParams } from "./test_utils.js";
|
||||
import { DOMCanvasFactory } from "../../src/display/display_utils.js";
|
||||
import { getDocument } from "../../src/display/api.js";
|
||||
import { isNodeJS } from "../../src/shared/is_node.js";
|
||||
import { NodeCanvasFactory } from "../../src/display/node_utils.js";
|
||||
|
||||
function getTopLeftPixel(canvasContext) {
|
||||
const imgData = canvasContext.getImageData(0, 0, 1, 1);
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { assert, CMapCompressionType } from "../../src/shared/util.js";
|
||||
import { assert } from "../../src/shared/util.js";
|
||||
import { isNodeJS } from "../../src/shared/is_node.js";
|
||||
import { isRef } from "../../src/core/primitives.js";
|
||||
import { Page } from "../../src/core/document.js";
|
||||
|
@ -62,77 +62,6 @@ function buildGetDocumentParams(filename, options) {
|
|||
return params;
|
||||
}
|
||||
|
||||
class NodeCanvasFactory {
|
||||
create(width, height) {
|
||||
assert(width > 0 && height > 0, "Invalid canvas size");
|
||||
|
||||
const Canvas = require("canvas");
|
||||
const canvas = Canvas.createCanvas(width, height);
|
||||
return {
|
||||
canvas,
|
||||
context: canvas.getContext("2d"),
|
||||
};
|
||||
}
|
||||
|
||||
reset(canvasAndContext, width, height) {
|
||||
assert(canvasAndContext.canvas, "Canvas is not specified");
|
||||
assert(width > 0 && height > 0, "Invalid canvas size");
|
||||
|
||||
canvasAndContext.canvas.width = width;
|
||||
canvasAndContext.canvas.height = height;
|
||||
}
|
||||
|
||||
destroy(canvasAndContext) {
|
||||
assert(canvasAndContext.canvas, "Canvas is not specified");
|
||||
|
||||
// Zeroing the width and height cause Firefox to release graphics
|
||||
// resources immediately, which can greatly reduce memory consumption.
|
||||
canvasAndContext.canvas.width = 0;
|
||||
canvasAndContext.canvas.height = 0;
|
||||
canvasAndContext.canvas = null;
|
||||
canvasAndContext.context = null;
|
||||
}
|
||||
}
|
||||
|
||||
class NodeCMapReaderFactory {
|
||||
constructor({ baseUrl = null, isCompressed = false }) {
|
||||
this.baseUrl = baseUrl;
|
||||
this.isCompressed = isCompressed;
|
||||
}
|
||||
|
||||
async fetch({ name }) {
|
||||
if (!this.baseUrl) {
|
||||
throw new Error(
|
||||
'The CMap "baseUrl" parameter must be specified, ensure that ' +
|
||||
'the "cMapUrl" and "cMapPacked" API parameters are provided.'
|
||||
);
|
||||
}
|
||||
if (!name) {
|
||||
throw new Error("CMap name must be specified.");
|
||||
}
|
||||
const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : "");
|
||||
const compressionType = this.isCompressed
|
||||
? CMapCompressionType.BINARY
|
||||
: CMapCompressionType.NONE;
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const fs = require("fs");
|
||||
fs.readFile(url, (error, data) => {
|
||||
if (error || !data) {
|
||||
reject(new Error(error));
|
||||
return;
|
||||
}
|
||||
resolve({ cMapData: new Uint8Array(data), compressionType });
|
||||
});
|
||||
}).catch(reason => {
|
||||
throw new Error(
|
||||
`Unable to load ${this.isCompressed ? "binary " : ""}` +
|
||||
`CMap at: ${url}`
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class XRefMock {
|
||||
constructor(array) {
|
||||
this._map = Object.create(null);
|
||||
|
@ -186,8 +115,6 @@ function isEmptyObj(obj) {
|
|||
export {
|
||||
DOMFileReaderFactory,
|
||||
NodeFileReaderFactory,
|
||||
NodeCanvasFactory,
|
||||
NodeCMapReaderFactory,
|
||||
XRefMock,
|
||||
buildGetDocumentParams,
|
||||
TEST_PDFS_PATH,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue