mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-24 09:08:07 +02:00
Inline the default Factory-definitions in getDocument
- Most of the these are only used in the `src/display/api.js` file, and this leads to slightly shorter code. - A number of unit-tests need a `BaseCanvasFactory`-instance, however that one is available through the `PDFDocumentProxy`-instance nowadays. - For other unit-tests the remaining necessary default Factory-definitions can be moved into the `test/unit/test_utils.js` file.
This commit is contained in:
parent
6d12d2924f
commit
db43f158dc
6 changed files with 105 additions and 94 deletions
|
@ -34,13 +34,11 @@ import {
|
|||
import {
|
||||
CMAP_URL,
|
||||
createIdFactory,
|
||||
DefaultCMapReaderFactory,
|
||||
DefaultStandardFontDataFactory,
|
||||
STANDARD_FONT_DATA_URL,
|
||||
XRefMock,
|
||||
} from "./test_utils.js";
|
||||
import {
|
||||
DefaultCMapReaderFactory,
|
||||
DefaultStandardFontDataFactory,
|
||||
} from "../../src/display/api.js";
|
||||
import { Dict, Name, Ref, RefSetCache } from "../../src/core/primitives.js";
|
||||
import { Lexer, Parser } from "../../src/core/parser.js";
|
||||
import { FlateStream } from "../../src/core/flate_stream.js";
|
||||
|
|
|
@ -37,7 +37,12 @@ import {
|
|||
TestPdfsServer,
|
||||
} from "./test_utils.js";
|
||||
import {
|
||||
DefaultCanvasFactory,
|
||||
fetchData as fetchDataDOM,
|
||||
PageViewport,
|
||||
RenderingCancelledException,
|
||||
StatTimer,
|
||||
} from "../../src/display/display_utils.js";
|
||||
import {
|
||||
getDocument,
|
||||
PDFDataRangeTransport,
|
||||
PDFDocumentLoadingTask,
|
||||
|
@ -46,12 +51,6 @@ import {
|
|||
PDFWorker,
|
||||
RenderTask,
|
||||
} from "../../src/display/api.js";
|
||||
import {
|
||||
fetchData as fetchDataDOM,
|
||||
PageViewport,
|
||||
RenderingCancelledException,
|
||||
StatTimer,
|
||||
} from "../../src/display/display_utils.js";
|
||||
import { AutoPrintRegExp } from "../../web/ui_utils.js";
|
||||
import { GlobalImageCache } from "../../src/core/image_utils.js";
|
||||
import { GlobalWorkerOptions } from "../../src/display/worker_options.js";
|
||||
|
@ -67,17 +66,11 @@ describe("api", function () {
|
|||
const tracemonkeyGetDocumentParams =
|
||||
buildGetDocumentParams(tracemonkeyFileName);
|
||||
|
||||
let CanvasFactory;
|
||||
|
||||
beforeAll(async function () {
|
||||
CanvasFactory = new DefaultCanvasFactory({});
|
||||
|
||||
await TestPdfsServer.ensureStarted();
|
||||
});
|
||||
|
||||
afterAll(async function () {
|
||||
CanvasFactory = null;
|
||||
|
||||
await TestPdfsServer.ensureStopped();
|
||||
});
|
||||
|
||||
|
@ -4280,7 +4273,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const viewport = pdfPage.getViewport({ scale: 1 });
|
||||
expect(viewport instanceof PageViewport).toEqual(true);
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const { canvasFactory } = pdfDoc;
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4307,7 +4301,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
expect(statEntryThree.name).toEqual("Overall");
|
||||
expect(statEntryThree.end - statEntryThree.start).toBeGreaterThan(0);
|
||||
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
await loadingTask.destroy();
|
||||
});
|
||||
|
||||
|
@ -4315,7 +4309,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const viewport = page.getViewport({ scale: 1 });
|
||||
expect(viewport instanceof PageViewport).toEqual(true);
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const { canvasFactory } = pdfDocument;
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4338,14 +4333,15 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
expect(reason.extraDelay).toEqual(0);
|
||||
}
|
||||
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
});
|
||||
|
||||
it("re-render page, using the same canvas, after cancelling rendering", async function () {
|
||||
const viewport = page.getViewport({ scale: 1 });
|
||||
expect(viewport instanceof PageViewport).toEqual(true);
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const { canvasFactory } = pdfDocument;
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4375,7 +4371,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
await reRenderTask.promise;
|
||||
expect(reRenderTask.separateAnnots).toEqual(false);
|
||||
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
});
|
||||
|
||||
it("multiple render() on the same canvas", async function () {
|
||||
|
@ -4385,7 +4381,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const viewport = page.getViewport({ scale: 1 });
|
||||
expect(viewport instanceof PageViewport).toEqual(true);
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const { canvasFactory } = pdfDocument;
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4416,6 +4413,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
}
|
||||
),
|
||||
]);
|
||||
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
});
|
||||
|
||||
it("cleans up document resources after rendering of page", async function () {
|
||||
|
@ -4426,7 +4425,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const viewport = pdfPage.getViewport({ scale: 1 });
|
||||
expect(viewport instanceof PageViewport).toEqual(true);
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const { canvasFactory } = pdfDoc;
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4442,7 +4442,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
await pdfDoc.cleanup();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
await loadingTask.destroy();
|
||||
});
|
||||
|
||||
|
@ -4454,7 +4454,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const viewport = pdfPage.getViewport({ scale: 1 });
|
||||
expect(viewport instanceof PageViewport).toEqual(true);
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const { canvasFactory } = pdfDoc;
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4489,7 +4490,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const { data } = canvasAndCtx.context.getImageData(0, 0, 1, 1);
|
||||
expect(data).toEqual(new Uint8ClampedArray([255, 0, 0, 255]));
|
||||
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
await loadingTask.destroy();
|
||||
});
|
||||
|
||||
|
@ -4505,6 +4506,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
})
|
||||
);
|
||||
const pdfDoc = await loadingTask.promise;
|
||||
const { canvasFactory } = pdfDoc;
|
||||
let checkedCopyLocalImage = false,
|
||||
firstImgData = null,
|
||||
firstStatsOverall = null;
|
||||
|
@ -4513,7 +4515,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const pdfPage = await pdfDoc.getPage(i);
|
||||
const viewport = pdfPage.getViewport({ scale: 1 });
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4526,7 +4528,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const opList = renderTask.getOperatorList();
|
||||
// The canvas is no longer necessary, since we only care about
|
||||
// the image-data below.
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
|
||||
const [statsOverall] = pdfPage.stats.times
|
||||
.filter(time => time.name === "Overall")
|
||||
|
@ -4609,6 +4611,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
})
|
||||
);
|
||||
const pdfDoc = await loadingTask.promise;
|
||||
const { canvasFactory } = pdfDoc;
|
||||
let checkedCopyLocalImage = false,
|
||||
firstStatsOverall = null;
|
||||
|
||||
|
@ -4616,7 +4619,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const pdfPage = await pdfDoc.getPage(i);
|
||||
const viewport = pdfPage.getViewport({ scale: 1 });
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4628,7 +4631,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
await renderTask.promise;
|
||||
// The canvas is no longer necessary, since we only care about
|
||||
// the stats below.
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
|
||||
const [statsOverall] = pdfPage.stats.times
|
||||
.filter(time => time.name === "Overall")
|
||||
|
@ -4656,13 +4659,14 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
|
||||
const loadingTask = getDocument(buildGetDocumentParams("issue18042.pdf"));
|
||||
const pdfDoc = await loadingTask.promise;
|
||||
const { canvasFactory } = pdfDoc;
|
||||
let checkedGlobalDecodeFailed = false;
|
||||
|
||||
for (let i = 1; i <= pdfDoc.numPages; i++) {
|
||||
const pdfPage = await pdfDoc.getPage(i);
|
||||
const viewport = pdfPage.getViewport({ scale: 1 });
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4675,7 +4679,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const opList = renderTask.getOperatorList();
|
||||
// The canvas is no longer necessary, since we only care about
|
||||
// the image-data below.
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
|
||||
const { commonObjs, objs } = pdfPage;
|
||||
const imgIndex = opList.fnArray.indexOf(OPS.paintImageXObject);
|
||||
|
@ -4712,7 +4716,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
|
||||
it("render for printing, with `printAnnotationStorage` set", async function () {
|
||||
async function getPrintData(printAnnotationStorage = null) {
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4728,7 +4732,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
expect(renderTask.separateAnnots).toEqual(false);
|
||||
|
||||
const printData = canvasAndCtx.canvas.toDataURL();
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
|
||||
return printData;
|
||||
}
|
||||
|
@ -4737,6 +4741,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
buildGetDocumentParams("annotation-tx.pdf")
|
||||
);
|
||||
const pdfDoc = await loadingTask.promise;
|
||||
const { canvasFactory } = pdfDoc;
|
||||
const pdfPage = await pdfDoc.getPage(1);
|
||||
const viewport = pdfPage.getViewport({ scale: 1 });
|
||||
|
||||
|
@ -4797,7 +4802,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
const viewport = page.getViewport({ scale: 1.2 });
|
||||
expect(viewport instanceof PageViewport).toEqual(true);
|
||||
|
||||
const canvasAndCtx = CanvasFactory.create(
|
||||
const { canvasFactory } = pdf;
|
||||
const canvasAndCtx = canvasFactory.create(
|
||||
viewport.width,
|
||||
viewport.height
|
||||
);
|
||||
|
@ -4809,7 +4815,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||
expect(renderTask.separateAnnots).toEqual(false);
|
||||
|
||||
const data = canvasAndCtx.canvas.toDataURL();
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
return data;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,8 +14,7 @@
|
|||
*/
|
||||
|
||||
import { CMap, CMapFactory, IdentityCMap } from "../../src/core/cmap.js";
|
||||
import { CMAP_URL } from "./test_utils.js";
|
||||
import { DefaultCMapReaderFactory } from "../../src/display/api.js";
|
||||
import { CMAP_URL, DefaultCMapReaderFactory } from "./test_utils.js";
|
||||
import { Name } from "../../src/core/primitives.js";
|
||||
import { StringStream } from "../../src/core/stream.js";
|
||||
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { DefaultCanvasFactory, getDocument } from "../../src/display/api.js";
|
||||
import { buildGetDocumentParams } from "./test_utils.js";
|
||||
import { getDocument } from "../../src/display/api.js";
|
||||
|
||||
function getTopLeftPixel(canvasContext) {
|
||||
const imgData = canvasContext.getImageData(0, 0, 1, 1);
|
||||
|
@ -30,28 +30,24 @@ describe("custom canvas rendering", function () {
|
|||
const transparentGetDocumentParams =
|
||||
buildGetDocumentParams("transparent.pdf");
|
||||
|
||||
let CanvasFactory;
|
||||
let loadingTask;
|
||||
let page;
|
||||
let loadingTask, doc, page;
|
||||
|
||||
beforeAll(async function () {
|
||||
CanvasFactory = new DefaultCanvasFactory({});
|
||||
|
||||
loadingTask = getDocument(transparentGetDocumentParams);
|
||||
const doc = await loadingTask.promise;
|
||||
const data = await doc.getPage(1);
|
||||
page = data;
|
||||
doc = await loadingTask.promise;
|
||||
page = await doc.getPage(1);
|
||||
});
|
||||
|
||||
afterAll(async function () {
|
||||
CanvasFactory = null;
|
||||
doc = null;
|
||||
page = null;
|
||||
await loadingTask.destroy();
|
||||
});
|
||||
|
||||
it("renders to canvas with a default white background", async function () {
|
||||
const viewport = page.getViewport({ scale: 1 });
|
||||
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
|
||||
const { canvasFactory } = doc;
|
||||
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
|
||||
|
||||
const renderTask = page.render({
|
||||
canvasContext: canvasAndCtx.context,
|
||||
|
@ -65,12 +61,13 @@ describe("custom canvas rendering", function () {
|
|||
b: 255,
|
||||
a: 255,
|
||||
});
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
});
|
||||
|
||||
it("renders to canvas with a custom background", async function () {
|
||||
const viewport = page.getViewport({ scale: 1 });
|
||||
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
|
||||
const { canvasFactory } = doc;
|
||||
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
|
||||
|
||||
const renderTask = page.render({
|
||||
canvasContext: canvasAndCtx.context,
|
||||
|
@ -85,7 +82,7 @@ describe("custom canvas rendering", function () {
|
|||
b: 0,
|
||||
a: 255,
|
||||
});
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -137,17 +134,15 @@ describe("custom ownerDocument", function () {
|
|||
getElementsByTagName: () => [{ append: () => {} }],
|
||||
},
|
||||
};
|
||||
const CanvasFactory = new DefaultCanvasFactory({ ownerDocument });
|
||||
|
||||
return {
|
||||
elements,
|
||||
ownerDocument,
|
||||
CanvasFactory,
|
||||
};
|
||||
}
|
||||
|
||||
it("should use given document for loading fonts (with Font Loading API)", async function () {
|
||||
const { ownerDocument, elements, CanvasFactory } = getMocks();
|
||||
const { ownerDocument, elements } = getMocks();
|
||||
const getDocumentParams = buildGetDocumentParams(
|
||||
"TrueType_without_cmap.pdf",
|
||||
{
|
||||
|
@ -161,7 +156,8 @@ describe("custom ownerDocument", function () {
|
|||
const page = await doc.getPage(1);
|
||||
|
||||
const viewport = page.getViewport({ scale: 1 });
|
||||
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
|
||||
const { canvasFactory } = doc;
|
||||
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
|
||||
|
||||
await page.render({
|
||||
canvasContext: canvasAndCtx.context,
|
||||
|
@ -174,12 +170,12 @@ describe("custom ownerDocument", function () {
|
|||
expect(Array.from(ownerDocument.fonts).find(checkFont)).toBeTruthy();
|
||||
|
||||
await loadingTask.destroy();
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
expect(ownerDocument.fonts.size).toBe(0);
|
||||
});
|
||||
|
||||
it("should use given document for loading fonts (with CSS rules)", async function () {
|
||||
const { ownerDocument, elements, CanvasFactory } = getMocks();
|
||||
const { ownerDocument, elements } = getMocks();
|
||||
ownerDocument.fonts = null;
|
||||
const getDocumentParams = buildGetDocumentParams(
|
||||
"TrueType_without_cmap.pdf",
|
||||
|
@ -194,7 +190,8 @@ describe("custom ownerDocument", function () {
|
|||
const page = await doc.getPage(1);
|
||||
|
||||
const viewport = page.getViewport({ scale: 1 });
|
||||
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
|
||||
const { canvasFactory } = doc;
|
||||
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
|
||||
|
||||
await page.render({
|
||||
canvasContext: canvasAndCtx.context,
|
||||
|
@ -206,7 +203,7 @@ describe("custom ownerDocument", function () {
|
|||
expect(style.sheet.cssRules.find(checkFontFaceRule)).toBeTruthy();
|
||||
|
||||
await loadingTask.destroy();
|
||||
CanvasFactory.destroy(canvasAndCtx);
|
||||
canvasFactory.destroy(canvasAndCtx);
|
||||
expect(style.remove.called).toBe(true);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -14,10 +14,16 @@
|
|||
*/
|
||||
|
||||
import { assert, isNodeJS } from "../../src/shared/util.js";
|
||||
import {
|
||||
fetchData as fetchDataNode,
|
||||
NodeCMapReaderFactory,
|
||||
NodeStandardFontDataFactory,
|
||||
} from "../../src/display/node_utils.js";
|
||||
import { NullStream, StringStream } from "../../src/core/stream.js";
|
||||
import { Page, PDFDocument } from "../../src/core/document.js";
|
||||
import { DOMCMapReaderFactory } from "../../src/display/cmap_reader_factory.js";
|
||||
import { DOMStandardFontDataFactory } from "../../src/display/standard_fontdata_factory.js";
|
||||
import { fetchData as fetchDataDOM } from "../../src/display/display_utils.js";
|
||||
import { fetchData as fetchDataNode } from "../../src/display/node_utils.js";
|
||||
import { Ref } from "../../src/core/primitives.js";
|
||||
|
||||
const TEST_PDFS_PATH = isNodeJS ? "./test/pdfs/" : "../pdfs/";
|
||||
|
@ -40,6 +46,16 @@ class DefaultFileReaderFactory {
|
|||
}
|
||||
}
|
||||
|
||||
const DefaultCMapReaderFactory =
|
||||
typeof PDFJSDev !== "undefined" && PDFJSDev.test("GENERIC") && isNodeJS
|
||||
? NodeCMapReaderFactory
|
||||
: DOMCMapReaderFactory;
|
||||
|
||||
const DefaultStandardFontDataFactory =
|
||||
typeof PDFJSDev !== "undefined" && PDFJSDev.test("GENERIC") && isNodeJS
|
||||
? NodeStandardFontDataFactory
|
||||
: DOMStandardFontDataFactory;
|
||||
|
||||
function buildGetDocumentParams(filename, options) {
|
||||
const params = Object.create(null);
|
||||
params.url = isNodeJS
|
||||
|
@ -234,7 +250,9 @@ export {
|
|||
buildGetDocumentParams,
|
||||
CMAP_URL,
|
||||
createIdFactory,
|
||||
DefaultCMapReaderFactory,
|
||||
DefaultFileReaderFactory,
|
||||
DefaultStandardFontDataFactory,
|
||||
getCrossOriginHostname,
|
||||
STANDARD_FONT_DATA_URL,
|
||||
TEST_PDFS_PATH,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue