diff --git a/OCRmyPDF.sh b/OCRmyPDF.sh index 0134993a..4c5d36ce 100644 --- a/OCRmyPDF.sh +++ b/OCRmyPDF.sh @@ -93,13 +93,11 @@ while getopts ":hvgkdcil:C:" opt; do l) LAN="$OPTARG" ;; C) TESS_CFG_FILES="$OPTARG $TESS_CFG_FILES" ;; \?) - echo "Invalid option: -$OPTARG" - echo + echo "Invalid option: -$OPTARG" >&2 usage exit $EXIT_BAD_ARGS ;; :) - echo "Option -$OPTARG requires an argument" - echo + echo "Option -$OPTARG requires an argument" >&2 usage exit $EXIT_BAD_ARGS ;; esac @@ -111,15 +109,14 @@ shift $((OPTIND-1)) # Check if the number of mandatory parameters # provided is as expected if [ "$#" -ne "2" ]; then - echo "Exactly one mandatory argument shall be provided" - echo + echo "Exactly one mandatory argument shall be provided" >&2 usage exit $EXIT_BAD_ARGS fi -! absolutePath "$1" && echo "The folder in which the input file should be located does not exist. Exiting..." && exit $EXIT_BAD_ARGS +! absolutePath "$1" && echo "The folder in which the input file should be located does not exist. Exiting..." >&2 && exit $EXIT_BAD_ARGS FILE_INPUT_PDF="`absolutePath "$1"`" -! absolutePath "$2" && echo "The folder in which the output file should be generated does not exist. Exiting..." && exit $EXIT_BAD_ARGS +! absolutePath "$2" && echo "The folder in which the output file should be generated does not exist. Exiting..." >&2 && exit $EXIT_BAD_ARGS FILE_OUTPUT_PDFA="`absolutePath "$2"`" @@ -131,15 +128,15 @@ cd "`dirname $0`" # check if the required utilities are installed [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Checking if all dependencies are installed" -! command -v identify > /dev/null && echo "Please install ImageMagick. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -! command -v pdfimages > /dev/null && echo "Please install xpdf. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -! command -v pdftoppm > /dev/null && echo "Please install xpdf. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -! command -v pdftk > /dev/null && echo "Please install pdftk. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -[ $PREPROCESS_CLEAN -eq 1 ] && ! command -v unpaper > /dev/null && echo "Please install unpaper. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -! command -v tesseract > /dev/null && echo "Please install tesseract and tesseract-data. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -! command -v python > /dev/null && echo "Please install python, as well as the following python libraries: reportlab, lxml. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -! command -v gs > /dev/null && echo "Please install ghostcript. Exiting..." && exit $EXIT_MISSING_DEPENDENCY -! command -v java > /dev/null && echo "Please install java. Exiting..." && exit $EXIT_MISSING_DEPENDENCY +! command -v identify > /dev/null && echo "Please install ImageMagick. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY +! command -v pdfimages > /dev/null && echo "Please install xpdf. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY +! command -v pdftoppm > /dev/null && echo "Please install xpdf. Exiting..." >&2 && exit $EXIT_MISSING_DEPENDENCY +! 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, as well as the following 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 @@ -162,7 +159,7 @@ mkdir -p "${TMP_FLD}" # get the size of each pdf page (width / height) in pt (inch*72) [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Input file: Extracting size of each page (in pt)" ! identify -format "%w %h\n" "$FILE_INPUT_PDF" > "$FILE_SIZE_PAGES" \ - && echo "Could not get size of PDF pages. Exiting..." && exit $EXIT_BAD_INPUT_FILE + && echo "Could not get size of PDF pages. Exiting..." >&2 && exit $EXIT_BAD_INPUT_FILE sed -I "" '/^$/d' "$FILE_SIZE_PAGES" # removing empty lines (last one should be) numpages=`cat "$FILE_SIZE_PAGES" | wc -l | sed 's/^ *//g'` [ $VERBOSITY -ge $LOG_INFO ] && echo "Input file: The file has $numpages pages" @@ -192,7 +189,7 @@ while read pageSize ; do 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 "Not exactly 1 image on page $page. Exiting..." && exit $EXIT_BAD_INPUT_FILE + [ $nbImg -ne "1" ] && echo "Expecting exactly 1 image on page $page (found $nbImg). Exiting..." >&2 && exit $EXIT_BAD_INPUT_FILE # Get characteristics of the extracted image curImg=`ls -1 "$curOrigImg"*` @@ -210,7 +207,7 @@ while read pageSize ; do # compute the resolution of the image in the page dpi_x=$(($widthCurImg*72/$widthPDF)) dpi_y=$(($heightCurImg*72/$heightPDF)) - [ "$dpi_x" -ne "$dpi_y" ] && echo "X/Y Resolutions not equal. Exiting..." && exit $EXIT_BAD_INPUT_FILE + [ "$dpi_x" -ne "$dpi_y" ] && echo "X/Y Resolutions not equal ($dpi_x/$dpi_y). Exiting..." >&2 && exit $EXIT_BAD_INPUT_FILE dpi="$dpi_x" # Identify if page image should be saved as ppm (color) or pgm (gray) @@ -227,13 +224,13 @@ while read pageSize ; do # extract current page as image with right orientation and resoltution [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Extracting image as $ext file (${dpi} dpi)" ! pdftoppm -f $page -l $page -r $dpi $opt "$FILE_INPUT_PDF" > "$curImgPixmap" \ - && echo "Could not extract page $page as $ext from $FILE_INPUT_PDF. Exiting..." && exit $EXIT_OTHER_ERROR + && echo "Could not extract page $page as $ext from $FILE_INPUT_PDF. Exiting..." >&2 && exit $EXIT_OTHER_ERROR # if requested deskew image (without changing its size in pixel) if [ "$PREPROCESS_DESKEW" -eq "1" ]; then [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Deskewing image" ! convert "$curImgPixmap" -deskew 40% -gravity center -extent ${heightCurImg}x${widthCurImg} "$curImgPixmapDeskewed" \ - && echo "Could not deskew \"$curImgPixmap\". Exiting..." && exit $EXIT_OTHER_ERROR + && echo "Could not deskew \"$curImgPixmap\". Exiting..." >&2 && exit $EXIT_OTHER_ERROR else cp "$curImgPixmap" "$curImgPixmapDeskewed" fi @@ -244,7 +241,7 @@ while read pageSize ; do ! unpaper --dpi $dpi --mask-scan-size 100 \ --no-deskew --no-grayfilter --no-blackfilter --no-mask-center --no-border-align \ "$curImgPixmapDeskewed" "$curImgPixmapClean" 1> /dev/null \ - && echo "Could not clean \"$curImgPixmapDeskewed\". Exiting..." && exit $EXIT_OTHER_ERROR + && echo "Could not clean \"$curImgPixmapDeskewed\". Exiting..." >&2 && exit $EXIT_OTHER_ERROR else cp "$curImgPixmapDeskewed" "$curImgPixmapClean" fi @@ -252,7 +249,7 @@ while read pageSize ; do # perform OCR [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Performing OCR" ! tesseract -l "$LAN" "$curImgPixmapClean" "$curHocr" hocr $TESS_CFG_FILES 1> /dev/null 2> /dev/null \ - && echo "Could not OCR file \"$curImgPixmapClean\". Exiting..." && exit $EXIT_OTHER_ERROR + && echo "Could not OCR file \"$curImgPixmapClean\". Exiting..." >&2 && exit $EXIT_OTHER_ERROR mv "$curHocr.html" "$curHocr" # embed text and image to new pdf file @@ -263,13 +260,13 @@ while read pageSize ; do fi [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Embedding text in PDF" ! python hocrTransform.py -r $dpi -i "$image4finalPDF" "$curHocr" "$curOCRedPDF" \ - && echo "Could not create PDF file from \"$curHocr\". Exiting..." && exit $EXIT_OTHER_ERROR + && 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 [ $DEBUG_MODE -eq "1" ] ; then [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Page $page: Embedding text in PDF (debug page)" ! python hocrTransform.py -b -r $dpi "$curHocr" "$curOCRedPDFDebug" \ - && echo "Could not create PDF file from \"$curHocr\". Exiting..." && exit $EXIT_OTHER_ERROR + && echo "Could not create PDF file from \"$curHocr\". Exiting..." >&2 && exit $EXIT_OTHER_ERROR fi # delete temporary files created for the current page @@ -293,7 +290,7 @@ done < "$FILE_SIZE_PAGES" # concatenate all pages [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Output file: Concatenating all pages" ! pdftk $FILES_OCRed_PDFS cat output "$FILE_OUTPUT_PDF" \ - && echo "Could not concatenate individual PDF pages (\"$FILES_OCRed_PDFS\") to one file. Exiting..." && exit $EXIT_OTHER_ERROR + && echo "Could not concatenate individual PDF pages (\"$FILES_OCRed_PDFS\") to one file. Exiting..." >&2 && exit $EXIT_OTHER_ERROR # insert metadata (copy metadata from input file) #echo "Output file: Inserting metadata" @@ -305,20 +302,19 @@ done < "$FILE_SIZE_PAGES" ! gs -dQUIET -dPDFA -dBATCH -dNOPAUSE -dUseCIEColor \ -sProcessColorModel=DeviceCMYK -sDEVICE=pdfwrite -sPDFACompatibilityPolicy=2 \ -sOutputFile=$FILE_OUTPUT_PDFA "$FILE_OUTPUT_PDF" 1> /dev/null 2> /dev/null \ - && echo "Could not convert PDF file \"$FILE_OUTPUT_PDF\" to PDF/A. Exiting..." && exit $EXIT_OTHER_ERROR + && echo "Could not convert PDF file \"$FILE_OUTPUT_PDF\" to PDF/A. Exiting..." >&2 && exit $EXIT_OTHER_ERROR # validate generated pdf file (compliance to PDF/A) [ $VERBOSITY -ge $LOG_DEBUG ] && echo "Output file: Checking compliance to PDF/A standard" java -jar /root/jhove-1_9/jhove/bin/JhoveApp.jar -m PDF-hul "$FILE_OUTPUT_PDFA" > "$FILE_VALIDATION_LOG" grep -i "Status|Message" "$FILE_VALIDATION_LOG" # summary of the validation -# check if the validation was successful -pdf_valid=1 -grep -i "ErrorMessage" "$FILE_VALIDATION_LOG" && pdf_valid=0 -grep -i "Status.*not valid" "$FILE_VALIDATION_LOG" && pdf_valid=0 -grep -i "Status.*Not well-formed" "$FILE_VALIDATION_LOG" && pdf_valid=0 -[ $VERBOSITY -ge $LOG_INFO ] && [ $pdf_valid -eq 1 ] && echo "Output file: The generated PDF/A file is VALID" -[ $pdf_valid -ne 1 ] && echo "Output file: The generated PDF/A file is INVALID" [ $VERBOSITY -ge $LOG_DEBUG ] && cat "$FILE_VALIDATION_LOG" +# check the validation results +pdf_valid=1 +grep -i 'ErrorMessage' "$FILE_VALIDATION_LOG" && pdf_valid=0 +grep -i 'Status.*not valid' "$FILE_VALIDATION_LOG" && pdf_valid=0 +grep -i 'Status.*Not well-formed' "$FILE_VALIDATION_LOG" && pdf_valid=0 +! grep -i 'Profile:.*PDF/A-1' "$FILE_VALIDATION_LOG" && pdf_valid=0 @@ -327,4 +323,9 @@ if [ $KEEP_TMP -eq 0 ]; then rm -r -f "${TMP_FLD}" fi + + +[ $pdf_valid -ne 1 ] && echo "Output file: The generated PDF/A file is INVALID" >&2 && exit $EXIT_INVALID_OUPUT_PDFA + +[ $VERBOSITY -ge $LOG_INFO ] && echo "Output file: The generated PDF/A file is VALID" exit 0