






















@@ -55,20 +55,35 @@ describe("PDF document extractor", () => {
5555});
5656});
575758-it("extracts text first and renders fallback images through clawpdf", async () => {
59-pdfDocument.extract.mockResolvedValueOnce({ text: "", images: [] }).mockResolvedValueOnce({
60-text: "",
61-images: [
62-{
63-type: "image",
64-bytes: Uint8Array.from(Buffer.from("png")),
65-mimeType: "image/png",
66-page: 1,
67-width: 10,
68-height: 10,
69-},
70-],
71-});
58+it("extracts text first and renders each fallback page with its own pixel budget", async () => {
59+pdfDocument.extract
60+.mockResolvedValueOnce({ text: "", images: [] })
61+.mockResolvedValueOnce({
62+text: "",
63+images: [
64+{
65+type: "image",
66+bytes: Uint8Array.from(Buffer.from("png1")),
67+mimeType: "image/png",
68+page: 1,
69+width: 5,
70+height: 10,
71+},
72+],
73+})
74+.mockResolvedValueOnce({
75+text: "",
76+images: [
77+{
78+type: "image",
79+bytes: Uint8Array.from(Buffer.from("png2")),
80+mimeType: "image/png",
81+page: 2,
82+width: 5,
83+height: 10,
84+},
85+],
86+});
7287const extractor = createPdfDocumentExtractor();
73887489const result = await extractor.extract(request());
@@ -82,18 +97,24 @@ describe("PDF document extractor", () => {
8297maxPages: 2,
8398maxTextChars: 200_000,
8499});
100+// Each page renders in its own extract() call, with the aggregate pixel cap
101+// allocated across selected pages so later pages are not starved.
85102expect(pdfDocument.extract).toHaveBeenNthCalledWith(2, {
86103mode: "images",
87-maxPages: 2,
88-image: {
89-maxDimension: 10_000,
90-maxPixels: 100,
91-forms: true,
92-},
104+pages: [1],
105+image: { maxDimension: 10_000, maxPixels: 50, forms: true },
106+});
107+expect(pdfDocument.extract).toHaveBeenNthCalledWith(3, {
108+mode: "images",
109+pages: [2],
110+image: { maxDimension: 10_000, maxPixels: 50, forms: true },
93111});
94112expect(result).toEqual({
95113text: "",
96-images: [{ type: "image", data: "cG5n", mimeType: "image/png" }],
114+images: [
115+{ type: "image", data: "cG5nMQ==", mimeType: "image/png" },
116+{ type: "image", data: "cG5nMg==", mimeType: "image/png" },
117+],
97118});
98119expect(pdfDocument.destroy).toHaveBeenCalledTimes(1);
99120});
@@ -131,8 +152,9 @@ describe("PDF document extractor", () => {
131152expect(pdfDocument.destroy).not.toHaveBeenCalled();
132153});
133154134-it("filters selected pages before passing them to clawpdf", async () => {
155+it("filters selected pages and renders them one page per image call", async () => {
135156pdfDocument.extract
157+.mockResolvedValueOnce({ text: "", images: [] })
136158.mockResolvedValueOnce({ text: "", images: [] })
137159.mockResolvedValueOnce({ text: "", images: [] });
138160const extractor = createPdfDocumentExtractor();
@@ -141,11 +163,15 @@ describe("PDF document extractor", () => {
141163142164expect(pdfDocument.extract).toHaveBeenNthCalledWith(
1431651,
144-expect.objectContaining({ pages: [2, 1] }),
166+expect.objectContaining({ mode: "text", pages: [2, 1] }),
145167);
146168expect(pdfDocument.extract).toHaveBeenNthCalledWith(
1471692,
148-expect.objectContaining({ pages: [2, 1] }),
170+expect.objectContaining({ mode: "images", pages: [2] }),
171+);
172+expect(pdfDocument.extract).toHaveBeenNthCalledWith(
173+3,
174+expect.objectContaining({ mode: "images", pages: [1] }),
149175);
150176});
151177此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。