diff --git a/extensions/document-extract/document-extractor.test.ts b/extensions/document-extract/document-extractor.test.ts index e25169a2d28e..da6555a34c28 100644 --- a/extensions/document-extract/document-extractor.test.ts +++ b/extensions/document-extract/document-extractor.test.ts @@ -176,6 +176,24 @@ describe("PDF document extractor", () => { ); }); + it("rejects selected pages outside the PDF page count before extraction", async () => { + pdfDocument.pageCount = 1; + pdfDocument.extract.mockResolvedValueOnce({ text: "", images: [] }); + const extractor = createPdfDocumentExtractor(); + + await expect(extractor.extract(request({ pageNumbers: [2] }))).rejects.toThrow( + "No requested PDF pages exist in this 1-page document.", + ); + expect(pdfDocument.extract).not.toHaveBeenCalled(); + expect(pdfDocument.destroy).toHaveBeenCalledTimes(1); + + await expect(extractor.extract(request({ pageNumbers: [] }))).resolves.toEqual({ + text: "", + images: [], + }); + expect(pdfDocument.destroy).toHaveBeenCalledTimes(2); + }); + it("reports image fallback failures and returns extracted text", async () => { const onImageExtractionError = vi.fn(); const failure = new Error("render failed"); diff --git a/extensions/document-extract/document-extractor.ts b/extensions/document-extract/document-extractor.ts index e2cb7dc0ac30..1c65c0072a18 100644 --- a/extensions/document-extract/document-extractor.ts +++ b/extensions/document-extract/document-extractor.ts @@ -70,6 +70,9 @@ async function extractPdfContent( .filter((p) => Number.isInteger(p) && p >= 1 && p <= pdf.pageCount) .slice(0, request.maxPages) : undefined; + if (request.pageNumbers?.length && pages?.length === 0) { + throw new Error(`No requested PDF pages exist in this ${pdf.pageCount}-page document.`); + } const pageSelection = pages ? { pages } : { maxPages: request.maxPages }; const textResult = await pdf.extract({