diff --git a/src/ocrmypdf/__main__.py b/src/ocrmypdf/__main__.py index 8fb4589f..511b0cf1 100755 --- a/src/ocrmypdf/__main__.py +++ b/src/ocrmypdf/__main__.py @@ -246,9 +246,13 @@ preprocessing.add_argument( "results slightly") preprocessing.add_argument( '--remove-vectors', action='store_true', - help="EXPERIMENTAL. Remove any vector graphics objects from the PDF, " - "including text rendered as curves. Useful when these objects " - "interfere with OCR.") + help="EXPERIMENTAL. Mask out any vector objects in the PDF so that they " + "will not be included in OCR. This can eliminate false characters.") +preprocessing.add_argument( + '--mask-barcodes', action='store_true', + help="Mask out any barcodes that appear in the PDF so they are not " + "considered during OCR. Barcodes can introduce false characters into " + "OCR.") ocrsettings = parser.add_argument_group( "OCR options", diff --git a/src/ocrmypdf/_pipeline.py b/src/ocrmypdf/_pipeline.py index 8240ba90..13fa51ce 100644 --- a/src/ocrmypdf/_pipeline.py +++ b/src/ocrmypdf/_pipeline.py @@ -632,6 +632,14 @@ def select_ocr_image( draw.rectangle(pixcoords, fill=white) #draw.rectangle(pixcoords, outline=pink) + if options.mask_barcodes: + pix = leptonica.Pix.open(image) + barcodes = pix.locate_barcodes() + for barcode in barcodes: + decoded, rect = barcode + log.info('masking barcode %s %r', decoded, rect) + draw.rectangle(rect, fill=white) + del draw # Pillow requires integer DPI diff --git a/src/ocrmypdf/leptonica.py b/src/ocrmypdf/leptonica.py index a3a31c52..e7648239 100644 --- a/src/ocrmypdf/leptonica.py +++ b/src/ocrmypdf/leptonica.py @@ -103,6 +103,8 @@ class _LeptonicaErrorTrap: raise FileNotFoundError() if 'pixWrite: stream not opened' in leptonica_output: raise LeptonicaIOError() + if 'index not valid' in leptonica_output: + raise IndexError() raise LeptonicaError(leptonica_output) return False @@ -486,10 +488,9 @@ class Pix: return Pix(lept.pixInvert(ffi.NULL, self._pix)) def locate_barcodes(self): - pixa_candidates = lept.pixExtractBarcodes(self._pix, 0) - if not pixa_candidates: - return - sarray = lept.pixReadBarcodes(pixa_candidates, + pix = Pix(lept.pixConvertTo8(self._pix, 0)) + pixa_candidates = PixArray(lept.pixExtractBarcodes(pix._pix, 0)) + sarray = lept.pixReadBarcodes(pixa_candidates._pixa, lept.L_BF_ANY, lept.L_USE_WIDTHS, ffi.NULL, @@ -500,7 +501,7 @@ class Pix: decoded = ffi.string(sarray[0].array[n]).decode() if decoded.strip() == '': continue - box = pixa_candidates[0].boxa[0].box[n][0] + box = pixa_candidates.get_box(n) left, top, right, bottom = box.x, box.y, box.x + box.w, box.y + box.h yield (decoded, (left, top, right, bottom)) @@ -553,12 +554,24 @@ class CompressedData: class PixArray: + """Wrapper around PIXA (array of PIX)""" def __init__(self, pixa): if not pixa: raise ValueError('NULL pixa') self._pixa = ffi.gc(pixa, PixArray._pixa_destroy) + def __len__(self): + return self._pixa[0].n + + def __getitem__(self, n): + with _LeptonicaErrorTrap(): + return Pix(lept.pixaGetPix(self._pixa, n, lept.L_CLONE)) + + def get_box(self, n): + with _LeptonicaErrorTrap(): + return Box(lept.pixaGetBox(self._pixa, n, lept.L_CLONE)) + @staticmethod def _pixa_destroy(pixa): pp = ffi.new('PIXA **', pixa) @@ -566,7 +579,7 @@ class PixArray: class Box: - """Wrapper around Leptonica's BOX objects. + """Wrapper around Leptonica's BOX objects (a pixel rectangle) See class Pix for notes about reference counting. """ diff --git a/src/ocrmypdf/lib/_leptonica.py b/src/ocrmypdf/lib/_leptonica.py index a606c77f..b26d3777 100644 --- a/src/ocrmypdf/lib/_leptonica.py +++ b/src/ocrmypdf/lib/_leptonica.py @@ -3,9 +3,9 @@ import _cffi_backend ffi = _cffi_backend.FFI('ocrmypdf.lib._leptonica', _version = 0x2601, - _types = b'\x00\x00\x01\x0D\x00\x00\xF6\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\xF7\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x00\xFA\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x01\x03\x00\x00\x00\x0F\x00\x00\x04\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x09\x03\x00\x00\x15\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x01\x11\x00\x00\x01\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x05\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x10\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x01\x0F\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\x81\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\xFD\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xFD\x03\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\xFD\x0D\x00\x00\xFB\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x7D\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x00\x0D\x00\x00\x00\x0F\x00\x00\x57\x0D\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x04\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x2D\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x94\x11\x00\x00\x94\x11\x00\x00\x94\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x94\x11\x00\x00\x94\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x57\x11\x00\x00\x57\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x57\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\xF8\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x94\x11\x00\x00\x94\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x15\x11\x00\x00\x15\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x01\x0E\x03\x00\x00\x73\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\xB8\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x01\x0C\x03\x00\x00\xD0\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x01\x12\x0D\x00\x00\x1E\x11\x00\x00\x00\x0F\x00\x01\x12\x0D\x00\x00\x04\x03\x00\x00\x00\x0F\x00\x01\x12\x0D\x00\x00\xB8\x11\x00\x00\x00\x0F\x00\x01\x12\x0D\x00\x00\x15\x11\x00\x00\x00\x0F\x00\x01\x12\x0D\x00\x00\x81\x03\x00\x00\x00\x0F\x00\x01\x12\x0D\x00\x01\x12\x03\x00\x00\x00\x0F\x00\x00\x00\x09\x00\x00\x01\x09\x00\x00\xF9\x03\x00\x00\x02\x09\x00\x00\x03\x09\x00\x00\x05\x09\x00\x00\x04\x09\x00\x00\xFE\x03\x00\x00\x06\x09\x00\x01\x00\x03\x00\x01\x01\x03\x00\x00\x02\x01\x00\x00\x0E\x01\x00\x00\x00\x0B\x00\x00\x01\x0B\x00\x00\x02\x0B\x00\x00\x03\x0B\x00\x00\x04\x0B\x00\x00\x0B\x01\x00\x00\x05\x01\x00\x00\x03\x01\x00\x00\xFC\x03\x00\x01\x0D\x03\x00\x00\x04\x01\x00\x01\x0F\x03\x00\x00\x08\x01\x00\x00\x0C\x01\x00\x00\x06\x01\x00\x00\x00\x01', - _globals = (b'\xFF\xFF\xFF\x0BL_BF_ANY',1,b'\xFF\xFF\xFF\x0BL_BF_CODABAR',9,b'\xFF\xFF\xFF\x0BL_BF_CODE128',2,b'\xFF\xFF\xFF\x0BL_BF_CODE2OF5',5,b'\xFF\xFF\xFF\x0BL_BF_CODE39',7,b'\xFF\xFF\xFF\x0BL_BF_CODE93',8,b'\xFF\xFF\xFF\x0BL_BF_CODEI2OF5',6,b'\xFF\xFF\xFF\x0BL_BF_EAN13',4,b'\xFF\xFF\xFF\x0BL_BF_EAN8',3,b'\xFF\xFF\xFF\x0BL_BF_UNKNOWN',0,b'\xFF\xFF\xFF\x0BL_BF_UPCA',10,b'\xFF\xFF\xFF\x0BL_CLONE',2,b'\xFF\xFF\xFF\x0BL_COPY',1,b'\xFF\xFF\xFF\x0BL_COPY_CLONE',3,b'\xFF\xFF\xFF\x0BL_DEFAULT_ENCODE',0,b'\xFF\xFF\xFF\x0BL_FLATE_ENCODE',3,b'\xFF\xFF\xFF\x0BL_G4_ENCODE',2,b'\xFF\xFF\xFF\x0BL_INSERT',0,b'\xFF\xFF\xFF\x0BL_JP2K_ENCODE',4,b'\xFF\xFF\xFF\x0BL_JPEG_ENCODE',1,b'\xFF\xFF\xFF\x0BL_NOCOPY',0,b'\xFF\xFF\xFF\x0BL_USE_WIDTHS',1,b'\xFF\xFF\xFF\x0BL_USE_WINDOWS',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_BASED_ON_SRC',4,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_BINARY',0,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_FULL_COLOR',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_GRAYSCALE',1,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_WITH_ALPHA',3,b'\x00\x00\x00\x23boxClone',0,b'\x00\x00\xE4\x23boxDestroy',0,b'\x00\x00\xE7\x23boxaDestroy',0,b'\x00\x00\x03\x23boxaGetBox',0,b'\x00\x00\x87\x23getLeptonicaVersion',0,b'\x00\x00\xEA\x23l_CIDataDestroy',0,b'\x00\x00\xD2\x23l_generateCIDataForPdf',0,b'\x00\x00\xF3\x23lept_free',0,b'\x00\x00\x89\x23makePixelSumTab8',0,b'\x00\x00\x24\x23pixAnd',0,b'\x00\x00\x31\x23pixBackgroundNorm',0,b'\x00\x00\x29\x23pixCleanBackgroundToWhite',0,b'\x00\x00\x1B\x23pixClipRectangle',0,b'\x00\x00\xBA\x23pixColorFraction',0,b'\x00\x00\x67\x23pixColorMagnitude',0,b'\x00\x00\x18\x23pixConvertRGBToLuminance',0,b'\x00\x00\x91\x23pixCorrelationBinary',0,b'\x00\x00\xA6\x23pixCountPixels',0,b'\x00\x00\x71\x23pixDeserializeFromMemory',0,b'\x00\x00\x5E\x23pixDeskew',0,b'\x00\x00\xED\x23pixDestroy',0,b'\x00\x00\x18\x23pixEndianByteSwapNew',0,b'\x00\x00\x75\x23pixExtractBarcodes',0,b'\x00\x00\x08\x23pixFindPageForeground',0,b'\x00\x00\xA1\x23pixFindSkew',0,b'\x00\x00\x3D\x23pixGammaTRC',0,b'\x00\x00\xB3\x23pixGenerateCIData',0,b'\x00\x00\x96\x23pixGetAverageMaskedRGB',0,b'\x00\x00\x44\x23pixGlobalNormRGB',0,b'\x00\x00\x20\x23pixInvert',0,b'\x00\x00\x12\x23pixLocateBarcodes',0,b'\x00\x00\x62\x23pixMaskOverColorPixels',0,b'\x00\x00\xAB\x23pixNumSignificantGrayColors',0,b'\x00\x00\xC3\x23pixOtsuAdaptiveThreshold',0,b'\x00\x00\x4C\x23pixOtsuThreshOnBackgroundNorm',0,b'\x00\x00\x79\x23pixProcessBarcodes',0,b'\x00\x00\x6E\x23pixRead',0,b'\x00\x00\x80\x23pixReadBarcodes',0,b'\x00\x00\x5E\x23pixRemoveColormap',0,b'\x00\x00\x62\x23pixRemoveColormapGeneral',0,b'\x00\x00\x8B\x23pixRenderBoxa',0,b'\x00\x00\x20\x23pixRotate180',0,b'\x00\x00\x5E\x23pixRotateOrth',0,b'\x00\x00\x59\x23pixScale',0,b'\x00\x00\xCD\x23pixSerializeToMemory',0,b'\x00\x00\xD8\x23pixWriteImpliedFormat',0,b'\x00\x00\xDE\x23pixWriteMemPng',0,b'\x00\x00\xF0\x23pixaDestroy',0), - _struct_unions = ((b'\x00\x00\x00\xF6\x00\x00\x00\x02Box',b'\x00\x00\x05\x11x',b'\x00\x00\x05\x11y',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x01\x0F\x11refcount'),(b'\x00\x00\x00\xF7\x00\x00\x00\x02Boxa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x0F\x11refcount',b'\x00\x00\x1E\x11box'),(b'\x00\x00\x00\xF9\x00\x00\x00\x02L_Compressed_Data',b'\x00\x00\x05\x11type',b'\x00\x01\x0C\x11datacomp',b'\x00\x00\x73\x11nbytescomp',b'\x00\x01\x00\x11data85',b'\x00\x00\x73\x11nbytes85',b'\x00\x01\x00\x11cmapdata85',b'\x00\x01\x00\x11cmapdatahex',b'\x00\x00\x05\x11ncolors',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x00\x05\x11bps',b'\x00\x00\x05\x11spp',b'\x00\x00\x05\x11minisblack',b'\x00\x00\x05\x11predictor',b'\x00\x00\x73\x11nbytes',b'\x00\x00\x05\x11res'),(b'\x00\x00\x00\xFA\x00\x00\x00\x02Pix',b'\x00\x01\x0F\x11w',b'\x00\x01\x0F\x11h',b'\x00\x01\x0F\x11d',b'\x00\x01\x0F\x11spp',b'\x00\x01\x0F\x11wpl',b'\x00\x01\x0F\x11refcount',b'\x00\x00\x05\x11xres',b'\x00\x00\x05\x11yres',b'\x00\x00\x05\x11informat',b'\x00\x00\x05\x11special',b'\x00\x01\x00\x11text',b'\x00\x01\x0B\x11colormap',b'\x00\x01\x0E\x11data'),(b'\x00\x00\x00\xFC\x00\x00\x00\x02PixColormap',b'\x00\x00\xF4\x11array',b'\x00\x00\x05\x11depth',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n'),(b'\x00\x00\x00\xFB\x00\x00\x00\x02Pixa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x0F\x11refcount',b'\x00\x00\x15\x11pix',b'\x00\x00\x04\x11boxa'),(b'\x00\x00\x00\xFE\x00\x00\x00\x02Sarray',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11refcount',b'\x00\x00\xFF\x11array')), - _enums = (b'\x00\x00\x01\x03\x00\x00\x00\x16$1\x00L_DEFAULT_ENCODE,L_JPEG_ENCODE,L_G4_ENCODE,L_FLATE_ENCODE,L_JP2K_ENCODE',b'\x00\x00\x01\x04\x00\x00\x00\x16$2\x00REMOVE_CMAP_TO_BINARY,REMOVE_CMAP_TO_GRAYSCALE,REMOVE_CMAP_TO_FULL_COLOR,REMOVE_CMAP_WITH_ALPHA,REMOVE_CMAP_BASED_ON_SRC',b'\x00\x00\x01\x05\x00\x00\x00\x16$3\x00L_NOCOPY,L_INSERT,L_COPY,L_CLONE,L_COPY_CLONE',b'\x00\x00\x01\x06\x00\x00\x00\x16$4\x00L_USE_WIDTHS,L_USE_WINDOWS',b'\x00\x00\x01\x07\x00\x00\x00\x16$5\x00L_BF_UNKNOWN,L_BF_ANY,L_BF_CODE128,L_BF_EAN8,L_BF_EAN13,L_BF_CODE2OF5,L_BF_CODEI2OF5,L_BF_CODE39,L_BF_CODE93,L_BF_CODABAR,L_BF_UPCA'), - _typenames = (b'\x00\x00\x00\xF6BOX',b'\x00\x00\x00\xF7BOXA',b'\x00\x00\x00\xF9L_COMP_DATA',b'\x00\x00\x00\xFAPIX',b'\x00\x00\x00\xFBPIXA',b'\x00\x00\x00\xFCPIXCMAP',b'\x00\x00\x00\xFESARRAY',b'\x00\x00\x00\x2Dl_float32',b'\x00\x00\x01\x02l_float64',b'\x00\x00\x01\x09l_int16',b'\x00\x00\x00\x05l_int32',b'\x00\x00\x01\x08l_int64',b'\x00\x00\x01\x0Al_int8',b'\x00\x00\x00\x05l_ok',b'\x00\x00\x01\x11l_uint16',b'\x00\x00\x01\x0Fl_uint32',b'\x00\x00\x01\x10l_uint64',b'\x00\x00\x01\x0Dl_uint8'), + _types = b'\x00\x00\x01\x0D\x00\x01\x00\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x01\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x04\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x0B\x03\x00\x00\x00\x0F\x00\x00\x01\x0D\x00\x01\x05\x03\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x04\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x09\x03\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x01\x11\x00\x00\x01\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x05\x03\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x13\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x10\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x01\x19\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\x13\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x07\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x07\x03\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x07\x0D\x00\x00\x13\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x87\x11\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x01\x0A\x0D\x00\x00\x00\x0F\x00\x00\x5C\x0D\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x04\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x32\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x9E\x11\x00\x00\x9E\x11\x00\x00\x9E\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x9E\x11\x00\x00\x9E\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x5C\x11\x00\x00\x5C\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x07\x01\x00\x00\x5C\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x01\x02\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x9E\x11\x00\x00\x9E\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x0D\x01\x00\x00\x1A\x11\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x09\x11\x00\x01\x18\x03\x00\x00\x7D\x03\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\xC2\x11\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x00\x10\x11\x00\x00\x09\x11\x00\x00\x07\x01\x00\x00\x07\x01\x00\x00\x00\x0F\x00\x00\x05\x0D\x00\x01\x16\x03\x00\x00\xDA\x11\x00\x00\x09\x11\x00\x00\x0D\x01\x00\x00\x00\x0F\x00\x01\x1C\x0D\x00\x00\x23\x11\x00\x00\x00\x0F\x00\x01\x1C\x0D\x00\x00\x04\x03\x00\x00\x00\x0F\x00\x01\x1C\x0D\x00\x00\xC2\x11\x00\x00\x00\x0F\x00\x01\x1C\x0D\x00\x00\x1A\x11\x00\x00\x00\x0F\x00\x01\x1C\x0D\x00\x00\x13\x03\x00\x00\x00\x0F\x00\x01\x1C\x0D\x00\x01\x1C\x03\x00\x00\x00\x0F\x00\x00\x00\x09\x00\x00\x01\x09\x00\x01\x03\x03\x00\x00\x02\x09\x00\x00\x03\x09\x00\x00\x05\x09\x00\x00\x04\x09\x00\x01\x08\x03\x00\x00\x06\x09\x00\x01\x0A\x03\x00\x01\x0B\x03\x00\x00\x02\x01\x00\x00\x0E\x01\x00\x00\x00\x0B\x00\x00\x01\x0B\x00\x00\x02\x0B\x00\x00\x03\x0B\x00\x00\x04\x0B\x00\x00\x0B\x01\x00\x00\x05\x01\x00\x00\x03\x01\x00\x01\x06\x03\x00\x01\x17\x03\x00\x00\x04\x01\x00\x01\x19\x03\x00\x00\x08\x01\x00\x00\x0C\x01\x00\x00\x06\x01\x00\x00\x00\x01', + _globals = (b'\xFF\xFF\xFF\x0BL_BF_ANY',1,b'\xFF\xFF\xFF\x0BL_BF_CODABAR',9,b'\xFF\xFF\xFF\x0BL_BF_CODE128',2,b'\xFF\xFF\xFF\x0BL_BF_CODE2OF5',5,b'\xFF\xFF\xFF\x0BL_BF_CODE39',7,b'\xFF\xFF\xFF\x0BL_BF_CODE93',8,b'\xFF\xFF\xFF\x0BL_BF_CODEI2OF5',6,b'\xFF\xFF\xFF\x0BL_BF_EAN13',4,b'\xFF\xFF\xFF\x0BL_BF_EAN8',3,b'\xFF\xFF\xFF\x0BL_BF_UNKNOWN',0,b'\xFF\xFF\xFF\x0BL_BF_UPCA',10,b'\xFF\xFF\xFF\x0BL_CLONE',2,b'\xFF\xFF\xFF\x0BL_COPY',1,b'\xFF\xFF\xFF\x0BL_COPY_CLONE',3,b'\xFF\xFF\xFF\x0BL_DEFAULT_ENCODE',0,b'\xFF\xFF\xFF\x0BL_FLATE_ENCODE',3,b'\xFF\xFF\xFF\x0BL_G4_ENCODE',2,b'\xFF\xFF\xFF\x0BL_INSERT',0,b'\xFF\xFF\xFF\x0BL_JP2K_ENCODE',4,b'\xFF\xFF\xFF\x0BL_JPEG_ENCODE',1,b'\xFF\xFF\xFF\x0BL_NOCOPY',0,b'\xFF\xFF\xFF\x0BL_USE_WIDTHS',1,b'\xFF\xFF\xFF\x0BL_USE_WINDOWS',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_BASED_ON_SRC',4,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_BINARY',0,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_FULL_COLOR',2,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_TO_GRAYSCALE',1,b'\xFF\xFF\xFF\x0BREMOVE_CMAP_WITH_ALPHA',3,b'\x00\x00\x00\x23boxClone',0,b'\x00\x00\xEE\x23boxDestroy',0,b'\x00\x00\xF1\x23boxaDestroy',0,b'\x00\x00\x03\x23boxaGetBox',0,b'\x00\x00\x91\x23getLeptonicaVersion',0,b'\x00\x00\xF4\x23l_CIDataDestroy',0,b'\x00\x00\xDC\x23l_generateCIDataForPdf',0,b'\x00\x00\xFD\x23lept_free',0,b'\x00\x00\x93\x23makePixelSumTab8',0,b'\x00\x00\x29\x23pixAnd',0,b'\x00\x00\x36\x23pixBackgroundNorm',0,b'\x00\x00\x2E\x23pixCleanBackgroundToWhite',0,b'\x00\x00\x20\x23pixClipRectangle',0,b'\x00\x00\xC4\x23pixColorFraction',0,b'\x00\x00\x6C\x23pixColorMagnitude',0,b'\x00\x00\x1D\x23pixConvertRGBToLuminance',0,b'\x00\x00\x63\x23pixConvertTo8',0,b'\x00\x00\x9B\x23pixCorrelationBinary',0,b'\x00\x00\xB0\x23pixCountPixels',0,b'\x00\x00\x7B\x23pixDeserializeFromMemory',0,b'\x00\x00\x63\x23pixDeskew',0,b'\x00\x00\xF7\x23pixDestroy',0,b'\x00\x00\x1D\x23pixEndianByteSwapNew',0,b'\x00\x00\x7F\x23pixExtractBarcodes',0,b'\x00\x00\x08\x23pixFindPageForeground',0,b'\x00\x00\xAB\x23pixFindSkew',0,b'\x00\x00\x42\x23pixGammaTRC',0,b'\x00\x00\xBD\x23pixGenerateCIData',0,b'\x00\x00\xA0\x23pixGetAverageMaskedRGB',0,b'\x00\x00\x49\x23pixGlobalNormRGB',0,b'\x00\x00\x25\x23pixInvert',0,b'\x00\x00\x17\x23pixLocateBarcodes',0,b'\x00\x00\x67\x23pixMaskOverColorPixels',0,b'\x00\x00\xB5\x23pixNumSignificantGrayColors',0,b'\x00\x00\xCD\x23pixOtsuAdaptiveThreshold',0,b'\x00\x00\x51\x23pixOtsuThreshOnBackgroundNorm',0,b'\x00\x00\x83\x23pixProcessBarcodes',0,b'\x00\x00\x78\x23pixRead',0,b'\x00\x00\x8A\x23pixReadBarcodes',0,b'\x00\x00\x63\x23pixRemoveColormap',0,b'\x00\x00\x67\x23pixRemoveColormapGeneral',0,b'\x00\x00\x95\x23pixRenderBoxa',0,b'\x00\x00\x25\x23pixRotate180',0,b'\x00\x00\x63\x23pixRotateOrth',0,b'\x00\x00\x5E\x23pixScale',0,b'\x00\x00\xD7\x23pixSerializeToMemory',0,b'\x00\x00\xE2\x23pixWriteImpliedFormat',0,b'\x00\x00\xE8\x23pixWriteMemPng',0,b'\x00\x00\xFA\x23pixaDestroy',0,b'\x00\x00\x12\x23pixaGetBox',0,b'\x00\x00\x73\x23pixaGetPix',0), + _struct_unions = ((b'\x00\x00\x01\x00\x00\x00\x00\x02Box',b'\x00\x00\x05\x11x',b'\x00\x00\x05\x11y',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x01\x19\x11refcount'),(b'\x00\x00\x01\x01\x00\x00\x00\x02Boxa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x19\x11refcount',b'\x00\x00\x23\x11box'),(b'\x00\x00\x01\x03\x00\x00\x00\x02L_Compressed_Data',b'\x00\x00\x05\x11type',b'\x00\x01\x16\x11datacomp',b'\x00\x00\x7D\x11nbytescomp',b'\x00\x01\x0A\x11data85',b'\x00\x00\x7D\x11nbytes85',b'\x00\x01\x0A\x11cmapdata85',b'\x00\x01\x0A\x11cmapdatahex',b'\x00\x00\x05\x11ncolors',b'\x00\x00\x05\x11w',b'\x00\x00\x05\x11h',b'\x00\x00\x05\x11bps',b'\x00\x00\x05\x11spp',b'\x00\x00\x05\x11minisblack',b'\x00\x00\x05\x11predictor',b'\x00\x00\x7D\x11nbytes',b'\x00\x00\x05\x11res'),(b'\x00\x00\x01\x04\x00\x00\x00\x02Pix',b'\x00\x01\x19\x11w',b'\x00\x01\x19\x11h',b'\x00\x01\x19\x11d',b'\x00\x01\x19\x11spp',b'\x00\x01\x19\x11wpl',b'\x00\x01\x19\x11refcount',b'\x00\x00\x05\x11xres',b'\x00\x00\x05\x11yres',b'\x00\x00\x05\x11informat',b'\x00\x00\x05\x11special',b'\x00\x01\x0A\x11text',b'\x00\x01\x15\x11colormap',b'\x00\x01\x18\x11data'),(b'\x00\x00\x01\x06\x00\x00\x00\x02PixColormap',b'\x00\x00\xFE\x11array',b'\x00\x00\x05\x11depth',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n'),(b'\x00\x00\x01\x05\x00\x00\x00\x02Pixa',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11nalloc',b'\x00\x01\x19\x11refcount',b'\x00\x00\x1A\x11pix',b'\x00\x00\x04\x11boxa'),(b'\x00\x00\x01\x08\x00\x00\x00\x02Sarray',b'\x00\x00\x05\x11nalloc',b'\x00\x00\x05\x11n',b'\x00\x00\x05\x11refcount',b'\x00\x01\x09\x11array')), + _enums = (b'\x00\x00\x01\x0D\x00\x00\x00\x16$1\x00L_DEFAULT_ENCODE,L_JPEG_ENCODE,L_G4_ENCODE,L_FLATE_ENCODE,L_JP2K_ENCODE',b'\x00\x00\x01\x0E\x00\x00\x00\x16$2\x00REMOVE_CMAP_TO_BINARY,REMOVE_CMAP_TO_GRAYSCALE,REMOVE_CMAP_TO_FULL_COLOR,REMOVE_CMAP_WITH_ALPHA,REMOVE_CMAP_BASED_ON_SRC',b'\x00\x00\x01\x0F\x00\x00\x00\x16$3\x00L_NOCOPY,L_INSERT,L_COPY,L_CLONE,L_COPY_CLONE',b'\x00\x00\x01\x10\x00\x00\x00\x16$4\x00L_USE_WIDTHS,L_USE_WINDOWS',b'\x00\x00\x01\x11\x00\x00\x00\x16$5\x00L_BF_UNKNOWN,L_BF_ANY,L_BF_CODE128,L_BF_EAN8,L_BF_EAN13,L_BF_CODE2OF5,L_BF_CODEI2OF5,L_BF_CODE39,L_BF_CODE93,L_BF_CODABAR,L_BF_UPCA'), + _typenames = (b'\x00\x00\x01\x00BOX',b'\x00\x00\x01\x01BOXA',b'\x00\x00\x01\x03L_COMP_DATA',b'\x00\x00\x01\x04PIX',b'\x00\x00\x01\x05PIXA',b'\x00\x00\x01\x06PIXCMAP',b'\x00\x00\x01\x08SARRAY',b'\x00\x00\x00\x32l_float32',b'\x00\x00\x01\x0Cl_float64',b'\x00\x00\x01\x13l_int16',b'\x00\x00\x00\x05l_int32',b'\x00\x00\x01\x12l_int64',b'\x00\x00\x01\x14l_int8',b'\x00\x00\x00\x05l_ok',b'\x00\x00\x01\x1Bl_uint16',b'\x00\x00\x01\x19l_uint32',b'\x00\x00\x01\x1Al_uint64',b'\x00\x00\x01\x17l_uint8'), ) diff --git a/src/ocrmypdf/lib/compile_leptonica.py b/src/ocrmypdf/lib/compile_leptonica.py index 8582af2c..537ec1d5 100644 --- a/src/ocrmypdf/lib/compile_leptonica.py +++ b/src/ocrmypdf/lib/compile_leptonica.py @@ -209,6 +209,8 @@ l_int32 pixSerializeToMemory ( PIX *pixs, l_uint32 **pdata, size_t *pnbytes ); PIX * pixConvertRGBToLuminance(PIX *pixs); +PIX * pixConvertTo8(PIX *pixs, l_int32 cmapflag); + PIX * pixRemoveColormap(PIX *pixs, l_int32 type); l_int32 @@ -348,6 +350,16 @@ pixProcessBarcodes(PIX *pixs, SARRAY **psaw, l_int32 debugflag); +PIX * +pixaGetPix(PIXA *pixa, + l_int32 index, + l_int32 accesstype); + +BOX* +pixaGetBox (PIXA * pixa, + l_int32 index, + l_int32 accesstype ); + PIXA * pixExtractBarcodes(PIX *pixs, l_int32 debugflag);