diff --git a/OCRmyPDF.sh b/OCRmyPDF.sh index cddd20ff..85bb34e0 100644 --- a/OCRmyPDF.sh +++ b/OCRmyPDF.sh @@ -1,6 +1,6 @@ #!/bin/sh ############################################################################## -# Copyright (c) 2013: fritz-hh from Github (https://github.com/fritz-hh) +# Copyright (c) 2013-14: fritz-hh from Github (https://github.com/fritz-hh) ############################################################################## # Import required scripts @@ -19,7 +19,7 @@ tesseract engine) Copyright: fritz from NAS4Free forum Version: $VERSION -Usage: OCRmyPDF.sh [-h] [-v] [-g] [-k] [-d] [-c] [-i] [-o dpi] [-l language] [-C filename] inputfile outputfile +Usage: OCRmyPDF.sh [-h] [-v] [-g] [-k] [-d] [-c] [-i] [-o dpi] [-f] [-l language] [-C filename] inputfile outputfile -h : Display this help message -v : Increase the verbosity (this option can be used more than once) (e.g. -vvv) @@ -36,6 +36,8 @@ Usage: OCRmyPDF.sh [-h] [-v] [-g] [-k] [-d] [-c] [-i] [-o dpi] [-l language] [- -o : If the resolution of an image is lower than dpi value provided as argument, provide the OCR engine with an oversampled image having the latter dpi value. This can improve the OCR results but can lead to a larger output PDF file. (default: no oversampling performed) +-f : Force to OCR the whole document, even if some page already contain font data + (which should not be the case for PDF files built from scnanned images) -l : Set the language of the PDF file in order to improve OCR results (default "eng") Any language supported by tesseract is supported. -C : Pass an additional configuration file to the tesseract OCR engine. @@ -43,7 +45,7 @@ Usage: OCRmyPDF.sh [-h] [-v] [-g] [-k] [-d] [-c] [-i] [-o dpi] [-l language] [- Note: The configuration file must be available in the "tessdata/configs" folder of your tesseract installation inputfile : PDF file to be OCRed -outputfile : The PDF/A file to be generated +outputfile : The PDF/A file that will be generated -------------------------------------------------------------------------------------- EOF } @@ -76,10 +78,11 @@ PREPROCESS_CLEAN="0" # 0=no, 1=yes (clean image to improve OCR) PREPROCESS_CLEANTOPDF="0" # 0=no, 1=yes (put cleaned image in final PDF) OVERSAMPLING_DPI="0" # do not perform oversampling PDF_NOIMG="0" # 0=no, 1=yes (generates each PDF page twice, with and without image) +FORCE_OCR="0" # 0=do not force, 1=force (Force to OCR the whole document, even if some page already contain font data) TESS_CFG_FILES="" # list of additional configuration files to be used by tesseract # Parse optional command line arguments -while getopts ":hvgkdcio:l:C:" opt; do +while getopts ":hvgkdcio:fl:C:" opt; do case $opt in h) usage ; exit 0 ;; v) VERBOSITY=$(($VERBOSITY+1)) ;; @@ -89,6 +92,7 @@ while getopts ":hvgkdcio:l:C:" opt; do c) PREPROCESS_CLEAN="1" ;; i) PREPROCESS_CLEANTOPDF="1" ;; o) OVERSAMPLING_DPI="$OPTARG" ;; + f) FORCE_OCR="1" ;; l) LAN="$OPTARG" ;; C) TESS_CFG_FILES="$OPTARG $TESS_CFG_FILES" ;; \?) @@ -207,11 +211,13 @@ numpages=`tail -n 1 "$FILE_PAGES_INFO" | cut -f1 -d" "` # OCR each page of the input pdf file ! parallel -q -k --halt-on-error 1 "$OCR_PAGE" "$FILE_INPUT_PDF" "{}" "$numpages" "$TMP_FLD" \ - "$VERBOSITY" "$LAN" "$KEEP_TMP" "$PREPROCESS_DESKEW" "$PREPROCESS_CLEAN" "$PREPROCESS_CLEANTOPDF" "$OVERSAMPLING_DPI" "$PDF_NOIMG" "$TESS_CFG_FILES" < "$FILE_PAGES_INFO" \ + "$VERBOSITY" "$LAN" "$KEEP_TMP" "$PREPROCESS_DESKEW" "$PREPROCESS_CLEAN" "$PREPROCESS_CLEANTOPDF" "$OVERSAMPLING_DPI" \ + "$PDF_NOIMG" "$TESS_CFG_FILES" "$FORCE_OCR" < "$FILE_PAGES_INFO" \ && exit $? #while read pageInfo ; do # ! "$OCR_PAGE" "$FILE_INPUT_PDF" "$pageInfo" "$numpages" "$TMP_FLD" \ -# "$VERBOSITY" "$LAN" "$KEEP_TMP" "$PREPROCESS_DESKEW" "$PREPROCESS_CLEAN" "$PREPROCESS_CLEANTOPDF" "$OVERSAMPLING_DPI" "$PDF_NOIMG" "$TESS_CFG_FILES" \ +# "$VERBOSITY" "$LAN" "$KEEP_TMP" "$PREPROCESS_DESKEW" "$PREPROCESS_CLEAN" "$PREPROCESS_CLEANTOPDF" "$OVERSAMPLING_DPI" \ +# "$PDF_NOIMG" "$TESS_CFG_FILES" "$FORCE_OCR" \ # && exit $? #done < "$FILE_PAGES_INFO" diff --git a/src/ocrPage.sh b/src/ocrPage.sh index 7b2d5af6..2ad733cc 100644 --- a/src/ocrPage.sh +++ b/src/ocrPage.sh @@ -2,7 +2,7 @@ ############################################################################## # Script aimed at OCRing a single page of a PDF file # -# Copyright (c) 2013: fritz-hh from Github (https://github.com/fritz-hh) +# Copyright (c) 2013-14: fritz-hh from Github (https://github.com/fritz-hh) ############################################################################## . "./src/config.sh" @@ -22,7 +22,7 @@ PREPROCESS_CLEANTOPDF="${10}" # Put the cleaned paged in the OCRed PDF OVERSAMPLING_DPI="${11}" # Oversampling resolution in dpi PDF_NOIMG="${12}" # Request to generate also a PDF page containing only the OCRed text but no image (helpful for debugging) TESS_CFG_FILES="${13}" # Specific configuration files to be used by Tesseract during OCRing - +FORCE_OCR="${14}" # Force to OCR, even if the page already contains fonts @@ -54,18 +54,24 @@ imageCharacteristics() { # path of the file in which the output should be written curImgCharacteristics="$4" - # check if the page already contains fonts (which should not be the case for PDF based on scanned files - [ `pdffonts -f $page -l $page ${FILE_INPUT_PDF} | wc -l` -gt 2 ] && echo "Page $page: This page already contains fonts !!!" && return 1 - [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Size ${heightPDF}x${widthPDF} (h*w in pt)" + + + # check if the page already contains fonts (which should not be the case for PDF based on scanned files + [ `pdffonts -f $page -l $page ${FILE_INPUT_PDF} | wc -l` -gt 2 ] && echo "Page $page: Page already contains font data !!!" && return 1 + + # extract raw image from pdf file to compute resolution # unfortunately this image can have another orientation than in the pdf... # so we will have to extract it again later using pdftoppm pdfimages -f $page -l $page -j "$FILE_INPUT_PDF" "$curOrigImg" 1>&2 # count number of extracted images nbImg=`ls -1 "$curOrigImg"* | wc -l` - [ $nbImg -ne "1" ] && echo "Page $page: Expecting exactly 1 image on page $page (found $nbImg). Cannot compute dpi value." && return 2 + if [ $nbImg -ne "1" ]; then + [ $VERBOSITY -ge $LOG_WARN ] && echo "Page $page: Expecting exactly 1 image on page $page (found $nbImg). Cannot compute dpi value." + return 2 + fi # Get characteristics of the extracted image curImg=`ls -1 "$curOrigImg"*` propCurImg=`identify -format "%w %h %[colorspace]" "$curImg"` @@ -130,13 +136,19 @@ curImgCharacteristics="$TMP_FLD/${page}-img-characteristics.txt" # Detected char # auto-detect the characteristics of the embedded image imageCharacteristics "$page" "$widthPDF" "$heightPDF" "$curImgCharacteristics" -#in case the page contains more than one image, warn the user but go on with default parameters -if [ "$?" -eq "1" ]; then - echo "Page $page: No need to OCR this file. Exiting..." && exit $EXIT_BAD_INPUT_FILE -elif [ "$?" -eq "2" ]; then - dpi=300 - echo "Page $page: Continuing anyway, assuming a default resolution of $dpi dpi" +ret_code="$?" +# in case the page contains text do not OCR, unless the FORCE_OCR flag is set +if [ "$ret_code" -eq "1" -a "$FORCE_OCR" -eq "0" ]; then + echo "Page $page: Exiting... (Use the -f option to force OCRing, even though fonts are available in the input file)" && exit $EXIT_BAD_INPUT_FILE +elif [ "$ret_code" -eq "1" -a "$FORCE_OCR" -eq "1" ]; then colorspaceCurImg="sRGB" + dpi=300 + [ $VERBOSITY -ge $LOG_WARN ] && echo "Page $page: OCRing anyway, assuming a default resolution of $dpi dpi" +# in case the page contains more than one image, warn the user but go on with default parameters +elif [ "$ret_code" -eq "2" ]; then + colorspaceCurImg="sRGB" + dpi=300 + [ $VERBOSITY -ge $LOG_WARN ] && echo "Page $page: Continuing anyway, assuming a default resolution of $dpi dpi" else # read the image characteristics from the file dpi=`cat "$curImgCharacteristics" | cut -f1 -d" "` @@ -216,12 +228,12 @@ fi # delete temporary files created for the current page # to avoid using to much disk space in case of PDF files having many pages if [ $KEEP_TMP -eq 0 ]; then - rm "$curOrigImg"*.* - rm "$curHocr" - rm "$curImgPixmap" - rm "$curImgPixmapDeskewed" - rm "$curImgPixmapClean" - rm "$curImgCharacteristics" + rm -f "$curOrigImg"*.* + rm -f "$curHocr" + rm -f "$curImgPixmap" + rm -f "$curImgPixmapDeskewed" + rm -f "$curImgPixmapClean" + rm -f "$curImgCharacteristics" fi exit 0 \ No newline at end of file