From 815fe8d3baf1be65161454d9fcfd770b6532c976 Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Fri, 2 Feb 2024 14:59:15 -0800 Subject: [PATCH] Desktop: Resolves #9765: OCR: Use existing PDF text when available (#9764) --- .../ocr_samples/multi_page__embedded_text.pdf | Bin 0 -> 28304 bytes .../multi_page__no_embedded_text.pdf | Bin 0 -> 52796 bytes packages/lib/services/ocr/OcrService.test.ts | 11 ++++++--- packages/lib/services/ocr/OcrService.ts | 11 +++++++++ packages/lib/shim-init-node.ts | 21 ++++++++++++++++++ packages/lib/shim.ts | 5 +++++ 6 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 packages/app-cli/tests/ocr_samples/multi_page__embedded_text.pdf create mode 100644 packages/app-cli/tests/ocr_samples/multi_page__no_embedded_text.pdf diff --git a/packages/app-cli/tests/ocr_samples/multi_page__embedded_text.pdf b/packages/app-cli/tests/ocr_samples/multi_page__embedded_text.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8a847a490a1af90929aa4a8aaa9c04b2dac0a786 GIT binary patch literal 28304 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 NvZGK@iOP$i{2$W=UNQgx literal 0 HcmV?d00001 diff --git a/packages/app-cli/tests/ocr_samples/multi_page__no_embedded_text.pdf b/packages/app-cli/tests/ocr_samples/multi_page__no_embedded_text.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf907f5b89241cfb37e7082bdc67918d9451e1b5 GIT binary patch literal 52796 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 b3VVn5b`CCfC<}0LaItfs)6$B{i=qEta>L0c literal 0 HcmV?d00001 diff --git a/packages/lib/services/ocr/OcrService.test.ts b/packages/lib/services/ocr/OcrService.test.ts index d92bd14c2..6f52b494f 100644 --- a/packages/lib/services/ocr/OcrService.test.ts +++ b/packages/lib/services/ocr/OcrService.test.ts @@ -82,15 +82,20 @@ describe('OcrService', () => { // `jest.retryTimes(2)` }, 60000 * 5); - it('should process PDF resources', async () => { - const { resource } = await createNoteAndResource({ path: `${ocrSampleDir}/dummy.pdf` }); + test.each([ + // Use embedded text (skip OCR) + ['dummy.pdf', 'Dummy PDF file'], + ['multi_page__embedded_text.pdf', 'This is a test.\nTesting...\nThis PDF has 3 pages.\nThis is page 3.'], + ['multi_page__no_embedded_text.pdf', 'This is a multi-page PDF\nwith no embedded text.\nPage 2: more text.\nThe third page.'], + ])('should process PDF resources', async (samplePath: string, expectedText: string) => { + const { resource } = await createNoteAndResource({ path: `${ocrSampleDir}/${samplePath}` }); const service = newOcrService(); await service.processResources(); const processedResource: ResourceEntity = await Resource.load(resource.id); - expect(processedResource.ocr_text).toBe('Dummy PDF file'); + expect(processedResource.ocr_text).toBe(expectedText); expect(processedResource.ocr_status).toBe(ResourceOcrStatus.Done); expect(processedResource.ocr_error).toBe(''); diff --git a/packages/lib/services/ocr/OcrService.ts b/packages/lib/services/ocr/OcrService.ts index e1cf17e0b..a42d7a9c9 100644 --- a/packages/lib/services/ocr/OcrService.ts +++ b/packages/lib/services/ocr/OcrService.ts @@ -62,6 +62,17 @@ export default class OcrService { const resourceFilePath = Resource.fullPath(resource); if (resource.mime === 'application/pdf') { + // OCR can be slow for large PDFs. + // Skip it if the PDF already includes text. + const pageTexts = await shim.pdfExtractEmbeddedText(resourceFilePath); + const pagesWithText = pageTexts.filter(text => !!text.trim().length); + + if (pagesWithText.length > 0) { + return { + text: pageTexts.join('\n'), + }; + } + const imageFilePaths = await shim.pdfToImages(resourceFilePath, await this.pdfExtractDir()); const results: RecognizeResult[] = []; diff --git a/packages/lib/shim-init-node.ts b/packages/lib/shim-init-node.ts index e8f12f108..b06c7bfe4 100644 --- a/packages/lib/shim-init-node.ts +++ b/packages/lib/shim-init-node.ts @@ -9,6 +9,7 @@ import * as fs from 'fs-extra'; import * as pdfJsNamespace from 'pdfjs-dist'; import { writeFile } from 'fs/promises'; import { ResourceEntity } from './services/database/types'; +import { TextItem } from 'pdfjs-dist/types/src/display/api'; const { FileApiDriverLocal } = require('./file-api-driver-local'); const mimeUtils = require('./mime-utils.js').mime; @@ -734,6 +735,26 @@ function shimInit(options: ShimInitOptions = null) { } }; + shim.pdfExtractEmbeddedText = async (pdfPath: string): Promise => { + const loadingTask = pdfJs.getDocument(pdfPath); + const doc = await loadingTask.promise; + + const textByPage = []; + + for (let pageNum = 1; pageNum <= doc.numPages; pageNum++) { + const page = await doc.getPage(pageNum); + const textContent = await page.getTextContent(); + + const strings = textContent.items.map(item => { + const text = (item as TextItem).str ?? ''; + return text; + }).join('\n'); + textByPage.push(strings); + } + + return textByPage; + }; + shim.pdfToImages = async (pdfPath: string, outputDirectoryPath: string): Promise => { // We handle both the Electron app and testing framework. Potentially // the same code could be use to support the CLI app. diff --git a/packages/lib/shim.ts b/packages/lib/shim.ts index b3b628c3d..fe6901dca 100644 --- a/packages/lib/shim.ts +++ b/packages/lib/shim.ts @@ -277,6 +277,11 @@ const shim = { throw new Error('Not implemented'); }, + // Does not do OCR -- just extracts existing text from a PDF. + pdfExtractEmbeddedText: async (_pdfPath: string): Promise => { + throw new Error('Not implemented: textFromPdf'); + }, + pdfToImages: async (_pdfPath: string, _outputDirectoryPath: string): Promise => { throw new Error('Not implemented'); },