diff --git a/OCRmyPDF.sh b/OCRmyPDF.sh index 8630267f..747bb602 100644 --- a/OCRmyPDF.sh +++ b/OCRmyPDF.sh @@ -3,8 +3,9 @@ # Copyright (c) 2013: fritz-hh from Github (https://github.com/fritz-hh) ############################################################################## -TOOLNAME="OCRmyPDF" -VERSION="v1.0-stable" +# Import required scripts +. "`dirname $0`/src/config.sh" + START=`date +%s` @@ -63,21 +64,6 @@ absolutePath() { } - -# Initialization of constants -EXIT_BAD_ARGS="1" # possible exit codes -EXIT_BAD_INPUT_FILE="2" -EXIT_MISSING_DEPENDENCY="3" -EXIT_INVALID_OUPUT_PDFA="4" -EXIT_OTHER_ERROR="5" -LOG_ERR="0" # 0=only error messages -LOG_INFO="1" # 1=error messages and some infos -LOG_DEBUG="2" # 2=debug level logging -SRC="./src" # location of the source folder (except source of external tools like jhove) -OCR_PAGE="$SRC/ocrPage.sh" # path to the script aimed at OCRing one page -JHOVE="./jhove/bin/JhoveApp.jar" # java SW for validating the final PDF/A -JHOVE_CFG="./jhove/conf/jhove.conf" # location of the jhove config file - # Initialization the configuration parameters with default values VERBOSITY="$LOG_ERR" # default verbosity level LAN="eng" # default language of the PDF file (required to get good OCR results) @@ -145,7 +131,7 @@ cd "`dirname $0`" ! command -v pdftk > /dev/null && echo "Please install pdftk. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY [ $PREPROCESS_CLEAN -eq 1 ] && ! command -v unpaper > /dev/null && echo "Please install unpaper. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY ! command -v tesseract > /dev/null && echo "Please install tesseract and tesseract-data. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY -! command -v python > /dev/null && echo "Please install python, and the python libraries: reportlab, lxml. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY +! command -v python2 > /dev/null && echo "Please install python v2.x, and the python libraries: reportlab, lxml. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY ! command -v gs > /dev/null && echo "Please install ghostcript. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY ! command -v java > /dev/null && echo "Please install java. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY @@ -178,7 +164,7 @@ mkdir -p "${TMP_FLD}" sed '/^$/d' "$FILE_TMP" | awk '{printf "%04d %s\n", NR, $0}' > "$FILE_PAGES_INFO" numpages=`tail -n 1 "$FILE_PAGES_INFO" | cut -f1 -d" "` -# Itterate the pages of the input pdf file +# OCR each page of the input pdf file ! parallel -k --halt-on-error 1 "$OCR_PAGE" "$FILE_INPUT_PDF" "{}" "$numpages" "$TMP_FLD" \ "$VERBOSITY" "$LAN" "$KEEP_TMP" "$PREPROCESS_DESKEW" "$PREPROCESS_CLEAN" "$PREPROCESS_CLEANTOPDF" "$PDF_NOIMG" "$TESS_CFG_FILES" < "$FILE_PAGES_INFO" \ && exit $? @@ -201,26 +187,6 @@ numpages=`tail -n 1 "$FILE_PAGES_INFO" | cut -f1 -d" "` -sOutputFile="$FILE_OUTPUT_PDFA" "$FILE_OUTPUT_PDF_CAT" 1> /dev/null 2> /dev/null \ && echo "Could not convert PDF file \"$FILE_OUTPUT_PDF_CAT\" to PDF/A. Exiting..." >&2 && exit $EXIT_OTHER_ERROR -# # Write metadata -# # Needs to be done after converting to PDF/A, as gs does not preserve metadata -# [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Output file: Update metadata (creator, producer, and title)" -# title=`basename "$FILE_INPUT_PDF" | sed 's/[.][^.]*//' | \ - # sed 's/_/ /g' | sed 's/-/ /g' | \ - # sed 's/\([[:lower:]]\)\([[:upper:]]\)/\1 \2/g' | \ - # sed 's/\([[:alpha:]]\)\([[:digit:]]\)/\1 \2/g' | \ - # sed 's/\([[:digit:]]\)\([[:alpha:]]\)/\1 \2/g'` # transform the file name (with extension) into distinct words -# pdftk "$FILE_OUTPUT_PDFA_WO_META" update_info_utf8 - output "$FILE_OUTPUT_PDFA" << EOF -# InfoBegin -# InfoKey: Title -# InfoValue: $title -# InfoBegin -# InfoKey: Creator -# InfoValue: $TOOLNAME $VERSION -# InfoBegin -# InfoKey: Producer -# InfoValue: ghostcript `gs --version`, pdftk -# EOF - # validate generated pdf file (compliance to PDF/A) [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Output file: Checking compliance to PDF/A standard" java -jar "$JHOVE" -c "$JHOVE_CFG" -m PDF-hul "$FILE_OUTPUT_PDFA" > "$FILE_VALIDATION_LOG" diff --git a/src/config.sh b/src/config.sh new file mode 100644 index 00000000..71b4f1f4 --- /dev/null +++ b/src/config.sh @@ -0,0 +1,15 @@ +TOOLNAME="OCRmyPDF" +VERSION="v2.x" + +EXIT_BAD_ARGS="1" # possible exit codes +EXIT_BAD_INPUT_FILE="2" +EXIT_MISSING_DEPENDENCY="3" +EXIT_INVALID_OUPUT_PDFA="4" +EXIT_OTHER_ERROR="5" +LOG_ERR="0" # 0=only error messages +LOG_INFO="1" # 1=error messages and some infos +LOG_DEBUG="2" # 2=debug level logging +SRC="./src" # location of the source folder (except source of external tools like jhove) +OCR_PAGE="$SRC/ocrPage.sh" # path to the script aimed at OCRing one page +JHOVE="./jhove/bin/JhoveApp.jar" # java SW for validating the final PDF/A +JHOVE_CFG="./jhove/conf/jhove.conf" # location of the jhove config file diff --git a/src/hocrTransform.py b/src/hocrTransform.py index 7666ec6b..0a5ae017 100644 --- a/src/hocrTransform.py +++ b/src/hocrTransform.py @@ -1,3 +1,4 @@ +#!/usr/bin/python ############################################################################## # Copyright (c) 2013: fritz-hh from Github (https://github.com/fritz-hh) # @@ -7,7 +8,8 @@ from reportlab.pdfgen.canvas import Canvas from reportlab.lib.units import inch from lxml import etree as ElementTree -import Image, re, sys +from PIL import Image +import re, sys import argparse class hocrTransform(): @@ -38,7 +40,7 @@ class hocrTransform(): # no width and heigh definition in the ocr_image element of the hocr file if self.width is None: - print "No page dimension found in the hocr file" + print("No page dimension found in the hocr file") sys.exit(1) def __str__(self): diff --git a/src/ocrPage.sh b/src/ocrPage.sh index ef5df7ca..94fba129 100644 --- a/src/ocrPage.sh +++ b/src/ocrPage.sh @@ -3,23 +3,13 @@ # Copyright (c) 2013: fritz-hh from Github (https://github.com/fritz-hh) ############################################################################## -# Initialization of constants -EXIT_BAD_ARGS="1" # possible exit codes -EXIT_BAD_INPUT_FILE="2" -EXIT_MISSING_DEPENDENCY="3" -EXIT_INVALID_OUPUT_PDFA="4" -EXIT_OTHER_ERROR="5" -LOG_ERR="0" # 0=only error messages -LOG_INFO="1" # 1=error messages and some infos -LOG_DEBUG="2" # 2=debug level logging - -SRC="./src" +. "./src/config.sh" # Initialization of variables passed by args FILE_INPUT_PDF="$1" -pageInfo="$2" -numpages="$3" +PAGE_INFO="$2" +NUM_PAGES="$3" TMP_FLD="$4" VERBOSITY="$5" LAN="$6" @@ -32,8 +22,8 @@ TESS_CFG_FILES="${12}" -page=`echo $pageInfo | cut -f1 -d" "` -[ $VERBOSITY -ge $LOG_INFO ] && echo "Processing page $page / $numpages" +page=`echo $PAGE_INFO | cut -f1 -d" "` +[ $VERBOSITY -ge $LOG_INFO ] && echo "Processing page $page / $NUM_PAGES" # create the name of the required file curOrigImg="$TMP_FLD/${page}_Image" # original image available in the current PDF page @@ -43,11 +33,11 @@ curOCRedPDF="$TMP_FLD/${page}-ocred.pdf" # PDF file containing the image + the curOCRedPDFDebug="$TMP_FLD/${page}-debug-ocred.pdf" # PDF file containing data required to find out if OCR worked correctly # get width / height of PDF page (in pt) -widthPDF=`echo $pageInfo | cut -f2 -d" "` -heightPDF=`echo $pageInfo | cut -f3 -d" "` +widthPDF=`echo $PAGE_INFO | cut -f2 -d" "` +heightPDF=`echo $PAGE_INFO | cut -f3 -d" "` [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: size ${heightPDF}x${widthPDF} (h*w in pt)" # extract raw image from pdf file to compute resolution -# unfortunatelly this image can have another orientation than in the pdf... +# 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 @@ -130,13 +120,13 @@ else image4finalPDF="$curImgPixmapDeskewed" fi [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Embedding text in PDF" -! python $SRC/hocrTransform.py -r $dpi -i "$image4finalPDF" "$curHocr" "$curOCRedPDF" \ +! python2 $SRC/hocrTransform.py -r $dpi -i "$image4finalPDF" "$curHocr" "$curOCRedPDF" \ && echo "Could not create PDF file from \"$curHocr\". Exiting..." >&2 && exit $EXIT_OTHER_ERROR # if requested generate special debug PDF page with visible OCR text if [ $PDF_NOIMG -eq "1" ] ; then [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Embedding text in PDF (debug page)" - ! python $SRC/hocrTransform.py -b -r $dpi "$curHocr" "$curOCRedPDFDebug" \ + ! python2 $SRC/hocrTransform.py -b -r $dpi "$curHocr" "$curOCRedPDFDebug" \ && echo "Could not create PDF file from \"$curHocr\". Exiting..." >&2 && exit $EXIT_OTHER_ERROR fi