diff options
author | tdro <tdro@users.noreply.github.com> | 2019-10-21 21:34:12 -0400 |
---|---|---|
committer | tdro <tdro@users.noreply.github.com> | 2019-10-21 21:34:12 -0400 |
commit | dc76353eabd502bb2e7a1825d75fd2fd0965db31 (patch) | |
tree | 60785e4dd50604ff4ddf60b8618cdaee61f14c70 /.local/share | |
parent | 97aa8f88d99f191ad1e6b203f929630cc3ba3bd7 (diff) | |
download | dotfiles-dc76353eabd502bb2e7a1825d75fd2fd0965db31.tar.gz dotfiles-dc76353eabd502bb2e7a1825d75fd2fd0965db31.tar.bz2 dotfiles-dc76353eabd502bb2e7a1825d75fd2fd0965db31.zip |
.local/share/bin/pdfmted-editor: Add
Diffstat (limited to '.local/share')
-rwxr-xr-x | .local/share/bin/pdfmted-editor | 739 |
1 files changed, 739 insertions, 0 deletions
diff --git a/.local/share/bin/pdfmted-editor b/.local/share/bin/pdfmted-editor new file mode 100755 index 0000000..8a3b46b --- /dev/null +++ b/.local/share/bin/pdfmted-editor @@ -0,0 +1,739 @@ +#!/bin/bash +# NAME: PDFMtEd – Editor +# VERSION: 0.1 +# AUTHOR: (c) 2014 Glutanimate +# DEPENDENCIES: yad exiftool python2.7 (sejda-pdf) (qpdf) +# +# DESCRIPTION: View and edit PDF metadata using exiftool. +# +# LICENSE: GNU GPLv3 (http://www.gnu.de/documents/gpl-3.0.en.html) +# +# NOTICE: THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +# EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +# PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR +# IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +# PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +# YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +# +# IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +# COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +# PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +# INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE +# THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +# INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +# PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +# PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +# +# USAGE: pdfmted_editor [-r|-u] <file(s) or directory(ies)> + +################ GLOBVAR ################# + +EXECUTABLE="$(readlink -f "$0")" +PROGDIR="${EXECUTABLE%/*}" +THUMBNAILER="$PROGDIR/pdfmted-thumbnailer.py" +TMPDIR="/tmp/${0##*/}" + +############### SETTINGS ################# + +# Supply password for protected PDF files +PASSWORD="" +# Rename modified files by default? +RENAME_OPT="FALSE" + +############## DIALOGS ################# + +# Usage message + +USAGE=" +Usage: $(basename "$0") [-r|-u|-h] <PDF Files/Directories> + + Title: PDFMtEd – Editor + Author: (c) 2014 Glutanimate + Description: View and edit PDF metadata + Arguments: This script accepts multiple PDF files and + directories as input. + +Available options: + -r rename files by default + -u arguments are URIs + -h display this help message\ +" + +# General settings + +YAD_TITLE="PDFMtEd – Editor" +WMCLASS="pdfmtededitor" +ICON="application-pdf" +WIDTH="800" +HEIGHT="650" +PROGWIDTH="400" +PROGHEIGHT="100" + +# Descriptions and tooltips + +TEXT_INFO_DEPERR="Error: Missing dependencies. Please install the \ +following:" + +TEXT_MAIN_DESCRP="\ +<b>Important note</b>: + +Empty fields will <b>delete</b> the associated metadata. \ +However, modifications performed by exiftool are <b>reversible</b>. \ +To purge the file of all metadata please use PDFMtEd – Inspector +" + +TEXT_CHCK_SAVECH="Save changes, file will be skipped if unchecked" +TEXT_CHCK_RENMFL="Rename based on tags" +TEXT_CHCK_DUPLIC="Copy tags over to next/previous file" + +TEXT_HOVR_CANCEL="Cancel and exit" +TEXT_HOVR_FNNISH="Save (if option selected) and exit" +TEXT_HOVR_PREVIT="Move back to previous document" +TEXT_HOVR_NEXTIT="Move to next document in line" + +TEXT_BTTN_PDFVWR="_Open in PDF viewer" +TEXT_HOVR_PDFVWR="Open document with default PDF viewer" + +TEXT_BTTN_SHWFLD="Show in parent _directory" +TEXT_HOVR_SHWFLD="Open parent directory with default file manager" + +TEXT_BTTN_CLRALL="C_lear all" +TEXT_HOVR_CLRALL="Clear all fields" + +TEXT_INFO_WARNG1="Something went wrong while writing the metadata. Processing the document with \ +sejda (recommended) or linearizing it with qpdf helps in these cases. Want to proceed?" +TEXT_NOTI_SUCCE1="Metadata succesfully updated." +TEXT_NOTI_ERROR1="Post-processing failed." + +############## FUNCTIONS ################# + +# dependencies + +check_deps() { + for i in "$@"; do + type "$i" > /dev/null 2>&1 + if [[ "$?" != "0" ]]; then + MISSINGDEPS+=" $i" + fi + done +} + +gui_check_deps(){ + check_deps yad exiftool python2.7 + if [[ -n "$MISSINGDEPS" ]]; then + gui_show_error "${TEXT_INFO_DEPERR} + ${MISSINGDEPS}" + exit 1 + fi +} + +# cleanup + +var_unset(){ + unset -v KEYWORDS SUBJECT AUTHOR TITLE_FN UPDATED_NAME +} + +cleanup(){ + [[ -n "$TMPDIR" && -d "$TMPDIR" ]] && rm -r "$TMPDIR" +} + +# evaluate and check arguments + +arg_evaluate_options(){ + # grab options if present + while getopts "ruh" OPTIONS; do + case $OPTIONS in + r ) RENAME_OPT="TRUE" + ;; + u ) URI_OPT="TRUE" + ;; + h ) echo "$USAGE" + exit 0 + ;; + \? ) echo "$USAGE" + exit 1 + ;; + esac + done +} + +arg_check_correct(){ + # check if arguments aside from options given + if [[ "$#" = "0" ]] + then + error_log 1 + fi + + # check if arguments are files or folders + for ITEM in "$@"; do + if [[ ! -d "$ITEM" && ! -f "$ITEM" ]] + then + error_log 3 + fi + done + + # notify user and exit + if [[ "$ARGERROR" = "1" ]] + then + gui_show_error "ERROR: No files/folder selected." + echo "Exiting..." + exit 1 + fi +} + +arg_uri_to_path(){ + # handle cases where we have to use "pseudo-uris" + cnt=0 + FILEARGS=() + for URI in "$@"; do + # only handles file:// prefix + # for other uri-specific substitutions we would have to + # use python+gio-bindings + FILEARGS[$cnt]="$(echo "$URI" | sed "s/^file:\/\///g")" + ((cnt++)) + done +} + +arg_compose_filearray(){ + # recursively add pdf files and folders in given arguments to array + unset ARGS + ARGID="1" # start array at 1 + while IFS= read -r -d $'\0' FILE; do + if [[ ! "$(file -ib "$FILE")" == *application/pdf* ]] + then + echo "Error: '$FILE' is not a pdf file. Ignoring." + continue + fi + ARGS[ARGID++]="$FILE" + done < <(find "$@" -type f -name '*.pdf' -print0 | sort -z --version-sort) + # numerical-composite (e.g. 1.1<1.2), zero-delimited sorting + ARGSTOTAL="${#ARGS[@]}" + ARGID="1" + if [[ "$ARGSTOTAL" = "0" ]]; then + gui_show_error "ERROR: No PDF files found." + echo "Exiting..." + exit 1 + fi +} + +# Error handling + +error_log(){ + if [[ "$1" = "1" ]]; then + ARGERROR="1" + echo "ARG ERROR: insufficient arguments given." + elif [[ "$1" = "2" ]]; then + ARGERROR="1" + echo "ARG ERROR: illegal arguments ('$ITEM' is not a file or directory.)" + elif [[ "$1" = "3" ]]; then + WRITEERROR="1" + echo "WRITE ERROR: File not updated. Likely an issue with exiftool" + elif [[ "$1" = "5" ]]; then + PSTPRCERROR="1" + echo "POST PROCESSING ERROR: qpdf/sejda failed." + fi +} + +# Set up environment + +setup_filevars(){ + FILE="$(readlink -f "$1")" + FILE_ESCAPED="${FILE//%/%%}" + FILENAME="${FILE##*/}" + BASENAME="${FILENAME%.*}" + DIRNAME="${FILE%/*}" + DIRNAME_ESCAPED="${FILE_ESCAPED%/*}" + PREV_FILE="${ARGS[$ARGID-1]}" + NEXT_FILE="${ARGS[$ARGID+1]}" + PREV_FILENAME="${PREV_FILE##*/}" + NEXT_FILENAME="${NEXT_FILE##*/}" +} + +# Set up GUI + +setup_geometry(){ + GEOMETRYOPTS=("--center" "--height=$HEIGHT" "--width=$WIDTH") + PROGGEO=("--center" "--height=$PROGHEIGHT" "--width=$PROGWIDTH") +} + +setup_gui(){ + MULTIDOC_TITLE="$YAD_TITLE ($ARGID/$ARGSTOTAL)" + # we are using arrays to construct and modify YAD dialogs + # multiple documents - show all elements + if [[ "$MULTIDOC" = "middle" ]] + then + MULTIDOC_FIELDS=(\ + --field="$TEXT_CHCK_DUPLIC":CHK "FALSE" \ + --field="<b>Previous Document</b>:":RO "$PREV_FILENAME" \ + --field="<b>Next Document</b>:":RO "$NEXT_FILENAME") + MULTIDOC_BUTTONS=(--button="_Previous!go-previous!$TEXT_HOVR_PREVIT:1" \ + --button="_Next!go-next!$TEXT_HOVR_NEXTIT:2") + # multiple documents, first doc - hide previous + elif [[ "$MULTIDOC" = "first" ]] + then + MULTIDOC_FIELDS=(\ + --field="$TEXT_CHCK_DUPLIC":CHK "FALSE" \ + --field="<b>Next Document</b>:":RO "$NEXT_FILENAME" ) + MULTIDOC_BUTTONS=(--button="_Next!go-next!$TEXT_HOVR_NEXTIT:2") + # multiple documents, last doc - hide next + elif [[ "$MULTIDOC" = "last" ]] + then + MULTIDOC_FIELDS=(\ + --field="$TEXT_CHCK_DUPLIC":CHK "FALSE" \ + --field="<b>Previous Document</b>:":RO "$PREV_FILENAME") + MULTIDOC_BUTTONS=(--button="_Previous!go-previous!$TEXT_HOVR_PREVIT:1") + # single document - hide all elements + elif [[ "$MULTIDOC" = "single" ]] + then + HEIGHT="620" + MULTIDOC_FIELDS=() + MULTIDOC_BUTTONS=() + fi + setup_geometry +} + +# GUIs + +gui_notify(){ + notify-send -i "$NOTIFY_ICON" "$YAD_TITLE" "$1" +} + +gui_progress(){ + # ampersands in gui elements cause issues in gtk/pango markup + BASENAME_PANGO="$(echo "$BASENAME" | sed 's/\&/\&/g')" + yad --progress --pulsate --auto-close \ + "${PROGGEO[@]}" \ + --image="$ICON" --window-icon="$ICON" \ + --class="$WMCLASS" \ + --title="$YAD_TITLE" \ + --text="Processing <b>$BASENAME_PANGO</b> ..." \ + --button='_Cancel!gtk-cancel!':1 \ + 2> /dev/null + PROG_RET="$?" + if [[ "$PROG_RET" != "0" ]] + then + kill -s TERM "$TOP_PID" + fi +} + +gui_show_error(){ + yad --title="$YAD_TITLE" \ + --center --width="400" --height="100" \ + --image=dialog-error \ + --window-icon=dialog-error \ + --class="$WMCLASS" \ + --text="$1" \ + --button="OK":0 2> /dev/null + echo "$1" +} + +gui_metadata_entry_multi(){ + NEW_METADATA="$( \ + yad --form --scroll \ + --always-print-result \ + "${GEOMETRYOPTS[@]}" \ + --image="$IMAGE" --window-icon="$ICON" \ + --class="$WMCLASS" \ + --title="$MULTIDOC_TITLE" \ + --buttons-layout=end \ + --button="_Cancel!gtk-cancel!$TEXT_HOVR_CANCEL:33" \ + "${MULTIDOC_BUTTONS[@]}" \ + --button="_Finish!gtk-ok!$TEXT_HOVR_FNNISH:3" \ + --field="<b>Current Document</b>:":RO "$FILENAME"\ + --field="":LBL "" \ + --field="$TEXT_MAIN_DESCRP":LBL "" \ + --field="Author:" "$AUTHOR_ORIGINAL" \ + --field="Title:" "$TITLE_ORIGINAL" \ + --field="Year:":NUM "$YEAR_ORIGINAL[!0..3000[!1]]" \ + --field="Keywords:" "$KEYWORDS_ORIGINAL" \ + --field="Subject:" "$SUBJECT_ORIGINAL" \ + --field "$TEXT_BTTN_CLRALL!gtk-clear!$TEXT_HOVR_CLRALL":FBTN \ + "@bash -c gui_clear_fields" \ + --field="":LBL "" \ + --field="$TEXT_BTTN_PDFVWR!application-pdf!$TEXT_HOVR_PDFVWR:FBTN" \ + "bash -c \"gui_open '$FILE_ESCAPED'\"" \ + --field="$TEXT_BTTN_SHWFLD!folder!$TEXT_HOVR_SHWFLD:FBTN" \ + "bash -c \"gui_open '$DIRNAME_ESCAPED'\"" \ + --field="":LBL "" \ + --field="$TEXT_CHCK_SAVECH":CHK "TRUE" \ + --field="$TEXT_CHCK_RENMFL":CHK "$RENAME_OPT" \ + "${MULTIDOC_FIELDS[@]}" \ + 2> /dev/null)" + RET_MAIN=$? + if [[ "$RET_MAIN" = 1 ]] + then + PROGRESSION="PREVIOUS" + elif [[ "$RET_MAIN" = 2 ]] + then + PROGRESSION="NEXT" + elif [[ "$RET_MAIN" = 3 ]] + then + PROGRESSION="FINISH" + else + echo "Aborted." + exit 1 + fi +} + +gui_postprocess_pdf(){ + yad --title="$YAD_TITLE" \ + --center --width="400" --height="100" \ + --image=dialog-error \ + --window-icon=dialog-error \ + --class="$WMCLASS" \ + --text="$TEXT_INFO_WARNG1" \ + --button="_Process with Sejda!gtk-ok!$TEXT_HOVR_PSTPRC_SEJ:0" \ + --button="_Linearize!gtk-ok!$TEXT_HOVR_PSTPRC_LIN:2" \ + --button="_Cancel!gtk-cancel!$TEXT_HOVR_PSTPRC_CANCEL:1" + RET_PSTPRC="$?" + if [[ "$RET_PSTPRC" = "0" ]]; then + if ! type sejda-console > /dev/null 2>&1; then + gui_show_error "Error: Sejda not installed." + gui_postprocess_pdf + return + fi + sejda_process_pdf | gui_progress + check_modify_success + error_recheck_write + elif [[ "$RET_PSTPRC" = "2" ]]; then + if ! type qpdf > /dev/null 2>&1; then + gui_show_error "Error: qpdf not installed." + gui_postprocess_pdf + return + fi + linearize_pdf | gui_progress + check_modify_success + error_recheck_write + else + return 1 + fi +} + + +# GUI extensions + +# create thumbnail +gui_thumbnail_generate() { + if [[ -f "$THUMBNAILER" ]]; then + echo "#Generating preview..." + $THUMBNAILER "$FILE" > /dev/null 2>&1 + fi +} + +# assign thumbnail +gui_thumbnail_assign(){ + + PREVIEWIMG="$(python2.7 -c "import gio; import sys; \ + print gio.File(sys.argv[1]).query_info('*').get_attribute_byte_string \ + ('''thumbnail::path''')" "$FILE")" + + if [[ "$(file -ib "$FILE" | cut -d';' -f1)" != "application/pdf" || ! -f "$PREVIEWIMG" ]] + then + PREVIEWIMG="$ICON" + fi + + IMAGE="$PREVIEWIMG" + NOTIFY_ICON="$PREVIEWIMG" +} + +# generic yad xdg-open function +gui_open(){ + PATH_ESCAPED="${1//%/%25}" + xdg-open "$PATH_ESCAPED" > /dev/null 2>&1 & +} + +# clear yad fields +gui_clear_fields(){ + for FIELDNR in {4..8}; do + echo "$FIELDNR:" + done +} + +# preserve metadata for next document in line +duplicate_metadata () { + AUTHOR_ORIGINAL="$AUTHOR" + TITLE_ORIGINAL="$TITLE" + YEAR_ORIGINAL="$YEAR" + SUBJECT_ORIGINAL="$SUBJECT" + KEYWORDS_ORIGINAL="$KEYWORDS" +} + + +process_yad_formchoices(){ + echo "$NEW_METADATA" + AUTHOR="$(echo "$NEW_METADATA" | cut -d '|' -f4)" + TITLE="$(echo "$NEW_METADATA" | cut -d '|' -f5)" + YEAR="$(echo "$NEW_METADATA" | cut -d '|' -f6 | cut -d ',' -f1 | cut -d '.' -f1)" + KEYWORDS="$(echo "$NEW_METADATA" | cut -d '|' -f7)" + SUBJECT="$(echo "$NEW_METADATA" | cut -d '|' -f8)" + SAVECHOICE="$(echo "$NEW_METADATA" | cut -d '|' -f14)" + RENAMECHOICE="$(echo "$NEW_METADATA" | cut -d '|' -f15)" + DUPLICATECHOICE="$(echo "$NEW_METADATA" | cut -d '|' -f16)" + MODIFYDATE="$(date +"%Y:%m:%d %H:%M:%S")" + if [[ "$YEAR" = "0" ]]; then + CREATEDATE="" + else + CREATEDATE="$(printf "%04d" "$YEAR"):01:01 00:00:00" + fi +} + +# Metadata input + +read_metadata() { + echo "#Reading embedded metadata..." + exiftool -e -S -sep ";" -PDF:Title -PDF:Author -PDF:Subject \ + -PDF:Keywords -PDF:CreateDate -PDF:ModifyDate \ + "$FILE" > "$PROGPIPE" +} + +print_original_metadata() { + echo "###Original metadata:" + echo "" + echo "Author: $AUTHOR_ORIGINAL" + echo "Title: $TITLE_ORIGINAL" + echo "Year: $YEAR_ORIGINAL" + echo "Creation date: $CREATEDATE_ORIGINAL" + echo "Modification date: $MODIFYDATE_ORIGINAL" + echo "Subject: $SUBJECT_ORIGINAL" + echo "Keywords: $KEYWORDS_ORIGINAL" +} + +evaluate_original_metadata() { + METADATA_PDF="$( [[ -f "$PROGPIPE" ]] && cat "$PROGPIPE")" + AUTHOR_ORIGINAL="$(echo "$METADATA_PDF" | sed -n 's/Author: //p')" + TITLE_ORIGINAL="$(echo "$METADATA_PDF" | sed -n 's/Title: //p')" + CREATEDATE_ORIGINAL="$(echo "$METADATA_PDF" | sed -n 's/CreateDate: //p')" + YEAR_ORIGINAL="${CREATEDATE_ORIGINAL:0:4}" + MODIFYDATE_ORIGINAL="$(echo "$METADATA_PDF" | sed -n 's/ModifyDate: //p')" + SUBJECT_ORIGINAL="$(echo "$METADATA_PDF" | sed -n 's/Subject: //p')" + KEYWORDS_ORIGINAL="$(echo "$METADATA_PDF" | sed -n 's/Keywords: //p')" +} + +# Metadata output + +delete_metadata(){ + echo "#Deleting existing metadata" + exiftool -e -overwrite_original -all:all="" "$FILE" +} + +write_metadata(){ + echo "#Writing new metadata" + exiftool -e -overwrite_original -password "$PASSWORD" -sep ";" \ + -PDF:Title="$TITLE" -PDF:Author="$AUTHOR" \ + -PDF:Subject="$SUBJECT" -PDF:Keywords="$KEYWORDS" \ + -PDF:ModifyDate="$MODIFYDATE" -PDF:CreateDate="$CREATEDATE" \ + -XMP-dc:Subject="$KEYWORDS" -XMP-dc:Description="$SUBJECT" -XMP-dc:Title="$TITLE" \ + -XMP-dc:Creator="$AUTHOR" -XMP-dc:Date="$CREATEDATE" \ + "$FILE" + echo "$?" > "$ERRORPIPE1" +} + +update_metadata(){ + delete_metadata; write_metadata + check_modify_success + error_check_write +} + +print_updated_metadata() { + echo "###Updated metadata:" + echo "" + echo "Author: $AUTHOR" + echo "Title: $TITLE" + echo "Year: $YEAR" + echo "Creation date: $CREATEDATE" + echo "Modificaiton date: $MODIFYDATE" + echo "Subject: $SUBJECT" + echo "Keywords: $KEYWORDS" +} + +update_filename(){ + TARGETFOLDER="$DIRNAME" + # replace characters in title that might cause issues on some file systems + TITLE_FN="$(echo "$TITLE" | sed -e 's/\:/\;/g' -e 's/\&/and/g')" + # Modify the following lines to change the naming scheme: + # (default naming scheme: ${AUTHOR} - ${TITLE_FN} - ${YEAR}) + if [[ -n "$AUTHOR" ]]; then + UPDATED_NAME="$AUTHOR" + fi + if [[ -n "$TITLE" ]]; then + if [[ -n "$UPDATED_NAME" ]]; then + UPDATED_NAME+=" - $TITLE_FN" + else + UPDATED_NAME="$TITLE" + fi + fi + if [[ -n "$YEAR" && "$YEAR" != "0" ]]; then + if [[ -n "$UPDATED_NAME" ]]; then + UPDATED_NAME+=" - $YEAR" + else + UPDATED_NAME="$YEAR" + fi + fi + echo "Updating file name..." + mv "$FILE" "$TARGETFOLDER/$UPDATED_NAME.pdf" + ARGS[$ARGID]="$TARGETFOLDER/$UPDATED_NAME.pdf" # make sure to update file array with + # new location +} + +# Error checks and workarounds + +# check if modification was successful +check_modify_success(){ + # if the PDF ModifyDate hasn't been altered we can assume + # that the exiftool tagging failed + MODDATE_CHECK="$(exiftool -e -S -sep ";" -PDF:ModifyDate "$FILE"\ + | sed -n 's/ModifyDate: //p')" + if [[ "$MODDATE_CHECK" != "$MODIFYDATE" ]] + then + error_log 3 + fi +} + +error_check_write(){ + WRITE_RETURNCODE="$(cat "$ERRORPIPE1")" + if [[ "$WRITE_RETURNCODE" != "0" || "$WRITEERROR" = "1" ]] + then + WRITEERROR="0" + echo "$TEXT_INFO_WARNG1" + gui_postprocess_pdf + else + gui_notify "$TEXT_NOTI_SUCCE1" + echo "Success." + fi +} + +error_recheck_write(){ + PSTPRC_RETURNCODE="$(cat "$ERRORPIPE2")" + if [[ "$PSTPRC_RETURNCODE" != "0" || "$WRITEERROR" = "1" ]] + then + error_log 4 + echo "$TEXT_NOTI_ERROR1" + gui_notify "$TEXT_NOTI_ERROR1" + else + gui_notify "$TEXT_NOTI_SUCCE1" + echo "Success." + fi +} + +sejda_process_pdf(){ + # Sejda does not preserve any document metadata + # so we have to perform the exiftool actions again; + # we use delete_metadata() in order to remove sejda-related metadata + echo "#Running Sejda on $FILENAME..." + TEMPFILE="$DIRNAME/${BASENAME}_sejda.pdf" + sejda-console merge --compressed -v 7 -f "$FILE" -o "$TEMPFILE" + RET_POSTPROC="$?" + if [[ "$RET_POSTPROC" = "0" ]]; then + mv "$TEMPFILE" "$DIRNAME/${BASENAME}.pdf" + delete_metadata + write_metadata + fi + echo "$RET_POSTPROC" > "$ERRORPIPE2" +} + +linearize_pdf(){ + # qpdf only preserves metadata that is not marked as + # obsolete by exiftool; to purge all existing (and potentially + # corrupted metadata entries) we first delete all metadata, + # linearize with qpdf, and then rewrite the metadata + echo "#Linearizing $FILENAME..." + delete_metadata + TEMPFILE="$DIRNAME/${BASENAME}_linearized.pdf" + qpdf --linearize "$FILE" "$TEMPFILE" + RET_QPDF="$?" + if [[ "$RET_QPDF" = "0" ]]; then + mv "$TEMPFILE" "$DIRNAME/${BASENAME}.pdf" + write_metadata + fi + echo "$RET_QPDF" > "$ERRORPIPE2" +} + +# Main + +main_check_argid(){ + echo "Processing $ARGID of $ARGSTOTAL" + if [[ "$ARGSTOTAL" = "1" ]] + then + MULTIDOC="single" + elif [[ "$ARGID" = "1" ]] + then + MULTIDOC="first" + elif [[ "$ARGID" = "$ARGSTOTAL" ]] + then + MULTIDOC="last" + else + MULTIDOC="middle" + fi +} + +main_iteration(){ + var_unset + setup_filevars "$1" + setup_gui + gui_thumbnail_generate; read_metadata + gui_thumbnail_assign + evaluate_original_metadata + [[ "$DUPLICATECHOICE" = "TRUE" ]] && duplicate_metadata + print_original_metadata + gui_metadata_entry_multi + process_yad_formchoices + print_updated_metadata + [[ "$SAVECHOICE" = "TRUE" ]] && update_metadata + [[ "$SAVECHOICE" = "TRUE" && "$RENAMECHOICE" = "TRUE" ]] && update_filename +} + +main_check_progression(){ + if [[ "$PROGRESSION" = "NEXT" ]] + then + ARGID="$((ARGID+1))" + main + elif [[ "$PROGRESSION" = "PREVIOUS" ]] + then + ARGID="$((ARGID-1))" + main + elif [[ "$PROGRESSION" = "FINISH" ]] + then + echo "Finished." + exit 0 + fi +} + +main(){ + main_check_argid + main_iteration "${ARGS[$ARGID]}" + main_check_progression +} + +############## FCT EXPORT ################ + +# functions assigned to yad buttons need to be exported + +export -f gui_clear_fields +export -f gui_open + +############### CLEANUP ################## + +trap "cleanup; exit" EXIT + +############## PREPWORK ################### + +TOP_PID="$$" +mkdir -p "$TMPDIR" +PROGPIPE="$(mktemp -u --tmpdir="$TMPDIR" XXXXXXXX)" +ERRORPIPE1="$(mktemp -u --tmpdir="$TMPDIR" XXXXXXXX)" +ERRORPIPE2="$(mktemp -u --tmpdir="$TMPDIR" XXXXXXXX)" + +############## USGCHECKS ################# + +gui_check_deps +arg_evaluate_options "$@" +shift $((OPTIND-1)) +FILEARGS=("$@") +[[ "$URI_OPT" = "TRUE" ]] && arg_uri_to_path "${FILEARGS[@]}" +arg_check_correct "${FILEARGS[@]}" +arg_compose_filearray "${FILEARGS[@]}" + +################ MAIN #################### + +main |