Program GUI do zmiany rozmiaru dokumentów pdf i zmiany ich DPI

12

Widzę, że LibreOffice Draw powinien móc otworzyć plik pdf i wyeksportować go z opcjami zmiany jakości i rozdzielczości DPI. Ale zeskanowane pliki PDF w wysokiej rozdzielczości, które mam, nie są poprawnie otwierane w tej aplikacji (importowana jest tylko pierwsza strona), więc chcę znaleźć bardziej wyspecjalizowaną aplikację.

Nie pytam w tym momencie o opcję wiersza poleceń (moje pliki PDF są tak duże, że wszystko, co próbowałem w ten sposób, zawiodło).

Glutanimate
źródło

Odpowiedzi:

12

Skrypt Nautilus


Kod

Udało mi się zmienić rozmiar moich plików PDF za pomocą tego skryptu Nautilus:

#! /bin/bash

# AUTHOR:   (c) Ricardo Ferreira, oriolpont -- modified in accordance to /ubuntu//q/280618/81372
# NAME:     Compress PDF 1.4.2
# DESCRIPTION:  A nice Nautilus script with a GUI to compress and optimize PDF files
# REQUIRES: ghostscript, poppler-utils, zenity, sed, python-notify (optional)
# LICENSE:  GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE:  https://launchpad.net/compress-pdf

VERSION="1.4.2"
COMPRESSPDF_BATCH_ABORT_ERR=115

# Messages
        # English (en-US)
        error_nofiles="No file selected."
        error_noquality="No optimization level selected."
        error_ghostscript="PDF Compress requires the ghostscript package, which is not installed. Please install it and try again."
        error_nopdf="At least one of the selected file(s) is not a valid PDF archive."
        label_filename="Save PDF as..."
        label_level="Please choose an optimization level below."
        optimization_level="Optimization Level"
        level_default="Default" # apparently close to High Quality
        level_screen="Screen-view only (72dpi)"
        level_low="Low Quality (150dpi)"
        level_high="High Quality (300dpi)"
        level_color="High Quality (Color Preserving) (300dpi)"
        job_done="has been successfully compressed"
        filename_suffix="_opt"
        label_suffix="Choose the suffix for the filenames."
        warning_overwrite="That will overwrite the original pdf files."


case $LANG in

    pt* )
        # Portuguese (pt-PT)
        error_nofiles="Nenhum ficheiro seleccionado."
        error_noquality="Nenhum nível de optimização escolhido."
        error_ghostscript="O PDF Compress necessita do pacote ghostscript, que não está instalado. Por favor instale-o e tente novamente."
        error_nopdf="O ficheiro seleccionado não é um ficheiro PDF válido."
        label_filename="Guardar PDF como..."
        label_level="Por favor escolha um nível de optimização abaixo."
        optimization_level="Nível de Optimização"
        level_default="Normal"
        level_screen="Visualização no Ecrã"
        level_low="Baixa Qualidade"
        level_high="Alta Qualidade"
        level_color="Alta Qualidade (Preservação de Cores)"
        job_done="foi comprimido com sucesso"
        filename_suffix="-otimizado";;


    es* )
        # Spanish (es-AR) by Eduardo Battaglia
        error_nofiles="Ningún archivo seleccionado."
        error_noquality="Ningún nivel de optimización escogido."
        error_ghostscript="Compress PDF necesita el paquete ghostscript, que no está instalado. Por favor instálelo e intente nuevamente."
        label_filename="Guardar PDF como..."
        label_level="Por favor escoja un nivel de optimización debajo."
        optimization_level="Nivel de Optimización"
        level_default="Normal"
        level_screen="Sólo visualización"
        level_low="Baja calidad"
        level_high="Alta calidad"
        level_color="Alta calidad (Preservación de Colores)"
        filename_suffix="-optimizado";;


    cs*)
       # Czech (cz-CZ) by Martin Pavlík
        error_nofiles="Nebyl vybrán žádný soubor."
        error_noquality="Nebyla zvolena úroveň optimalizace."
        error_ghostscript="PDF Compress vyžaduje balíček ghostscript, který není nainstalován. Nainstalujte jej prosím a opakujte akci."
        label_filename="Uložit PDF jako..."
        label_level="Prosím vyberte úroveň optimalizace z níže uvedených."
        optimization_level="Úroveň optimalizace"
        level_default="Výchozí"
        level_screen="Pouze pro čtení na obrazovce"
        level_low="Nízká kvalita"
        level_high="Vysoká kvalita"
        level_color="Vysoká kvalita (se zachováním barev)"
        filename_suffix="-optimalizované";;


    fr*)
       # French (fr-FR) by Astromb
        error_nofiles="Aucun fichier sélectionné"
        error_noquality="Aucun niveau d'optimisation sélectionné"
        error_ghostscript="PDF Compress a besoin du paquet ghostscript, mais il n'est pas installé. Merci de l'installer et d'essayer à nouveau."
        error_nopdf="Le fichier que vous avez sélectionné n'est pas un PDF valide."
        label_filename="Sauvegarder le PDF sous..."
        label_level="Merci de choisir, ci-dessous, un niveau d'optimisation."
        optimization_level="Niveau d'optimisation"
        level_default="Défaut"
        level_screen="Affichage à l'écran"
        level_low="Basse qualité"
        level_high="Haute qualité"
        level_color="Haute qualité (Couleurs préservées)"
        filename_suffix="-optimisé";;


    zh_CN*)
        # Simplified Chinese (zh_CN) by TualatriX Chou
        error_nofiles="没有选择文件。"
        error_noquality="没有优化优化等级。"
        error_ghostscript="PDF压缩需要ghostscript软件包,但是它没有安装。请先安装然后再重试。"
        error_nopdf="选择的文件不是一个有效的PDF文件"
        label_filename="另存为PDF..."
        label_level="请在下面选择优化等级"
        optimization_level="优化等级"
        level_default="默认"
        level_screen="仅在屏幕上浏览"
        level_low="低品质"
        level_high="高品质"
        level_color="高品质(护色) "
        filename_suffix="-优化";;


        ar*)
                # Arabic (ar) by Mohammed hasan Taha
        error_nofiles="لم يتم اختيار ملف"
        error_noquality="لم يتم اختيار درجة الضغط"
        error_ghostscript="هذا السكربت يحتاج حزمة ghostscript package لذا يرجى تنصيبها ثم اعادة المحاولة"
        error_nopdf="الملف الذي تم اختياره ليس ملف pdf صالح"
        label_filename="حفظ الملف باسم"
        label_level="الرجاء اختيار درجة الضغط"
        optimization_level="درجة الضغط"
        level_default="افتراضي"
        level_screen="عرض للشاشة فقط(الدرجة الأكثر انخفاضا)"
        level_low="جودة منخفضة"
        level_high="جودة مرتفعة"
        level_color="جودة عالية جدا"
        filename_suffix="-الأمثل";;


    ml_IN*)
        # Malayalam (ml_IN) by Hrishikesh K B
        error_nofiles="ഒരു ഫയലും തിരഞ്ഞെടുത്തിട്ടില്ല."
        error_noquality="യാതൊരു ഒപ്റ്റിമൈസേഷന്‍ ലെവലും തിരഞ്ഞെടുത്തിട്ടില്ല."
        error_ghostscript="പി ഡി എഫ് കംപ്രസ്സറിന് ഗോസ്റ്റ് സ്ക്രിപ്റ്റ് പാക്കേജ് ആവശ്യമാണ്. ആ പാക്കേജ് ഇന്‍സ്റ്റാള്‍ ചെയ്‌‌ത ശേഷം ദയവായി വീണ്ടും ശ്രമിക്കുക."
        error_nopdf="തിരഞ്ഞെടുത്ത ഫയല്‍ സാധുവായ ഒരു പിഡിഎഫ് ആര്‍ച്ചീവ് അല്ല."
        label_filename="പിഡിഎഫ് ഇങ്ങിനെ സംരക്ഷിക്കുക..."
        label_level="ദയവായി താഴെ നിന്നും ഒരു ഒപ്റ്റിമൈസേഷന്‍ ലെവല്‍ തിരഞ്ഞെടുക്കുക."
        optimization_level="ഒപ്റ്റിമൈസേഷന്‍ ലെവല്‍ "
        level_default="ഡീഫാള്‍ട്ട്"
        level_screen="സ്ക്രീനില്‍ കാണാന്‍ മാത്രം "
        level_low="കുറഞ്ഞ നിലവാരം"
        level_high="കൂടിയ നിലവാരം "
        level_color="കൂടിയ നിലവാരം (നിറം സംരക്ഷിച്ചിട്ടുള്ളത്)";;


    he*)
        # Hebrew (he-IL) by Yaron (from Launchpad question)
        error_nofiles="לא נבחר אף קובץ."
        error_noquality="לא נבחרה רמת הייעול."
        error_ghostscript="התכנית PDF Compress דורשת את החבילה ghostscript, שאינה מותקנת. נא להתקין אותה ולנסות שוב."
        error_nopdf="הקובץ הנבחר אינו ארכיון PDF תקני."
        label_filename="שמירת ה־ PDF בשם..."
        label_level="נא לבחור את רמת הייעול להלן."
        optimization_level="רמת הייעול"
        level_default="בררת מחדל"
        level_screen="לצפייה בצג בלבד"
        level_low="איכות נמוכה"
        level_high="איכות גבוהה"
        level_color="איכות גבוהה (שימור הצבע)"
        job_done="הדחיסה הסתיימה בהצלחה";;

esac



# Check if Zenity is installed
if ! ZENITY=$(which zenity)
then
    echo "error: Compress PDF $VERSION needs zenity to run." # maybe we could translate this someday
    exit 1
fi

# Check if Ghostscript is installed
if ! GS=$(which gs)
then
    $ZENITY --error --title="Compress PDF $VERSION" --text="$error_ghostscript"
    exit 1
fi

# Check if the user has selected any files
# if [ "x$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" = "x"  -o  "$#" = "0" ] # we double check. Remove the first part if you plan to manually invoke the script

if [ "$#" = "0" ] # removed nautilus specific variable to make the script compatible with other file managers
then
    $ZENITY --error --title="Compress PDF $VERSION" --text="$error_nofiles"
    exit 1
fi

# Check if we can properly parse the arguments
INPUT=("$@")
N=("$#")
if [ "${#INPUT[@]}" != "$N" ] # comparing the number of arguments the script is given with what it can count
then
    $ZENITY --error --title="Compress PDF $VERSION" # if we arrive here, there is something very messed
    exit 1
fi

# Check if all the arguments are proper PDF files
for ARG in "$@"
do
    IS_PDF=$(file --brief --mime-type "$ARG" | grep -i "/pdf") # ignoring case for 'pdf'; as far as I know, the slash before (sth/pdf) is universal mimetype output. In most cases we can even expect 'application/pdf' (portability issues?).
    if [ "x$IS_PDF" = x ]; then NOT_PDF=1; break; fi
done
if [ "x$NOT_PDF" != x ]
then
    $ZENITY --error --title="Compress PDF $VERSION" --text="$error_nopdf"
    exit 1
fi



# Everything is OK. We can go on.



# Ask the user to select an output format
selected_level=$($ZENITY --list --title="Compress PDF "$VERSION"" --text "$label_level" --radiolist --column "" --column "$optimization_level" TRUE "$level_default" FALSE "$level_screen" FALSE "$level_low" FALSE "$level_high" FALSE "$level_color" --height 250 --width 400)
if [ "$?" != "0"  -o  "x$selected_level" = x ]; then exit 1; fi

# Select the optimization level to use
case $selected_level in
    "$level_default")
        COMP_COMMAND="/default"
    ;;
    "$level_screen")
        COMP_COMMAND="/screen"
    ;;
    "$level_low")
        COMP_COMMAND="/ebook"
    ;;
    "$level_high")
        COMP_COMMAND="/printer"
    ;;
    "$level_color")
        COMP_COMMAND="/prepress"
    ;;
esac



# Choose output filename(s)
if [ $# -eq 1 ]
then
    pdf_file=$(basename "$1")
    suggested_filename=${pdf_file%.*}${filename_suffix}.${pdf_file##*.}
    output_filename=$($ZENITY --file-selection --save --confirm-overwrite --filename="$PWD/$suggested_filename" --title="$label_filename")
    if [ "$?" != "0"  -o  "x$output_filename" = x ]; then exit 1; fi
else
    filename_suffix=$($ZENITY --entry --title="Compress PDF $VERSION" --text="$label_suffix" --entry-text="$filename_suffix")
    if [ "$?" != "0" ]; then exit 1; fi
    if [ "x$filename_suffix" = x ]
        then if ! $ZENITY --warning --title="Compress PDF $VERSION" --text="$warning_overwrite"; then exit 1; fi
    fi
    case "$filename_suffix" in */*) $ZENITY --error --title="Compress PDF $VERSION"; exit 1; esac # Check if the specified suffix is legal (we use 'case' instead of 'if' to directly use asterisk * globbing -- and avoid [[...]] for portability)
fi



# Finally, we process the files



for arg in "$@" # this processing is partly inspired by Edouard Saintesprit's patch from Compress PDF page at Launchpad
do
    if [ $# -ne 1 ]
    then
        pdf_file=$(basename "$arg")
        output_filename=${pdf_file%.*}${filename_suffix}.${pdf_file##*.}
    fi

    output_name=$(basename "$output_filename")

    temp_pdfmarks=tmp-compresspdf-$output_name-pdfmarks
    temp_filename=tmp-compresspdf-$output_name

    if [ -e $temp_pdfmarks  -o  -e $temp_filename ]; then $ZENITY --error --title="Compress PDF $VERSION"; exit 1; fi

    # Extract metadata from the original PDF. This is not a crucial functionality, but maybe we could warn if pdfinfo or sed are not available
    pdfinfo "$arg" | sed -e 's/^ *//;s/ *$//;s/ \{1,\}/ /g' -e 's/^/  \//' -e '/CreationDate/,$d' -e 's/$/)/' -e 's/: / (/' > "$temp_pdfmarks"
    if ! grep /Title "$temp_pdfmarks"; then echo '  /Title ()' >> "$temp_pdfmarks"; fi # Warning: if the pdf has not defined a Title:, ghostscript makes a fontname become the title.
    # echo -e 0a'\n''  /Title ()''\n'.'\n'w | ed afile # use to prepend instead of append
    sed -i '1s/^ /[/' "$temp_pdfmarks"
    sed -i '/:)$/d' "$temp_pdfmarks"
    echo "  /DOCINFO pdfmark" >> "$temp_pdfmarks"

    # Execute ghostscript while showing a progress bar
    (
        $GS -sDEVICE=pdfwrite -dPDFSETTINGS=$COMP_COMMAND -dColorConversionStrategy=/LeaveColorUnchanged -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -dSAFER -sOutputFile="$temp_filename" "$arg" "$temp_pdfmarks" & echo -e "$!\n"
        # we output the pid so that it passes the pipe; the explicit linefeed starts the zenity progressbar pulsation
    ) | ( # the pipes create implicit subshells; marking them explicitly
        read PIPED_PID
        if $ZENITY --progress --pulsate --auto-close --title="Compress PDF $VERSION"
        then
            rm "$temp_pdfmarks"
            mv -f "$temp_filename" "$output_filename" & # we go on to the next file as fast as possible (this subprocess survives the end of the script, so it is even safer)
            notify-send "Compress PDF" "$output_name $job_done"
        else
            kill $PIPED_PID
            rm "$temp_pdfmarks"
            rm "$temp_filename"
            exit $COMPRESSPDF_BATCH_ABORT_ERR # Warning: it exits the subshell but not the script
        fi
    )
    if [ "$?" = "$COMPRESSPDF_BATCH_ABORT_ERR" ]; then break; fi # to break the loop in case we abort (zenity fails)
done

Oryginalne źródło: https://launchpad.net/compress-pdf

Skrypt oparty na tej gałęzi przez oriolpont i zmodyfikowany zgodnie z sugestią Cipricusa .

Zmodyfikowana wersja Oriolpont zawiera szereg ulepszeń:

  • Tłumaczenie hebrajskie przez Yarona
  • Obsługa wielu plików na podstawie zmian wprowadzonych przez Edouarda Saintesprita
  • Kilka innych modyfikacji Bash, aby skrypt był znacznie bezpieczniejszy (pliki tymczasowe PID, tryb bezpieczniejszy dla GS, więcej wstępnych kontroli)

Zrzut ekranu

Kompresja


Opcje

Opcje oferowane w oknie dialogowym zenity GUI odpowiadają następującym ghostscriptustawieniom:

  • dPDFSETTINGS=/screen (jakość tylko do wyświetlania, obrazy 72 dpi)
  • dPDFSETTINGS=/ebook (obrazy niskiej jakości, 150 dpi)
  • dPDFSETTINGS=/printer (obrazy wysokiej jakości, 300 dpi)
  • dPDFSETTINGS=/prepress (wysoka jakość, zachowanie kolorów, 300 dpi obrazów)
  • dPDFSETTINGS=/default (prawie identyczny z / screen)

Więcej opcji i dostrajanie na stronie: http://milan.kupcevic.net/ghostscript-ps-pdf/

Źródło: narzędzie wiersza polecenia Open Source do optymalizacji plików PDF

Możesz znaleźć więcej informacji na temat użytych opcji tutaj . README firmy Oriolpont oferuje dodatkowe informacje na temat dostosowywania skryptu do własnych potrzeb.


Instalacja

Skrypt zależy od liczby pakietów. Możesz je zainstalować za pomocą:

sudo apt-get install ghostscript poppler-utils zenity

Jeśli nie wiesz, jak zainstalować skrypt Nautilus, postępuj zgodnie z tym przewodnikiem:

Jak mogę zainstalować skrypt Nautilus?


Instalacja w alternatywnych środowiskach pulpitu

Skrypt nie zależy od żadnych niestandardowych zmiennych Nautilus i może być używany z praktycznie każdym menedżerem plików, który obsługuje niestandardowe akcje menu. Informacje na temat instalacji skryptu znajdują się w podręczniku menedżera plików. Użytkownicy XFCE mogą znaleźć fajny samouczek tutaj .

Oczywiście możesz również uruchomić skrypt z wiersza poleceń. Podstawowe użycie:

compresspdf "filename.pdf"

Przemytnik bimbrownik


Przegląd

Bardziej zaawansowaną kontrolę nad plikami PDF można uzyskać dzięki Moonshiner , interfejsowi GUI do ghostscript.


Instalacja

Moonshiner nie jest dostępny w oficjalnych repozytoriach. Niestety nie mogłem też znaleźć oficjalnego PPA. Jest tylko ten prywatny PPA, który nie był aktualizowany od dłuższego czasu. .debArchiwum dostępne tutaj powinien działać na najnowszych wersjach Ubuntu, ale nie biorą za to moje słowo.

O ile widzę, najbezpieczniejszy sposób instalacji bimbru jest bezpośrednio z jego źródła. Aby to zrobić, najpierw pobierz najnowszą wersję:

svn co https://moonshiner.svn.sourceforge.net/svnroot/moonshiner/trunk moonshiner_svn
cd $HOME/moonshiner_svn/

Moonshiner zależy od Pythona, PyGTK i Ghostscript. Jeśli te zależności są spełnione (które powinny być na standardowej instalacji Ubuntu), możesz przystąpić do instalacji aplikacji za pomocą:

sudo python setup.py install

Lub za pomocą narzędzia do zarządzania pakietami Pythona ( sudo apt-get install python-pip):

python setup.py sdist
sudo pip install $HOME/moonshiner_svn/dist/moonshiner-1.1svn.tar.gz

Odinstalowanie bimbru to pestka dzięki pip:

sudo pip uninstall moonshiner

Jeśli wybierzesz pierwszą metodę instalacji, będziesz musiał ręcznie usunąć wszystkie zainstalowane pliki.


Stosowanie

Po instalacji powinieneś móc uruchomić Moonshiner z deski rozdzielczej lub preferowanego programu uruchamiającego aplikacje. GUI jest dość zrozumiałe. Aby zmodyfikować plik PDF, po prostu przeciągnij i upuść plik do interfejsu, zmień żądane ustawienia i wciśnij Go Moonshining! .

Trzy oddzielne gubernatory w zakładce Obrazy pozwalają dostosować ustawienia DPI i jakości do twojej woli:

http://i.imgur.com/Y5ziLnu.gif

Nie będę zagłębiał się w inne ustawienia tutaj, ale zachęcam do zapoznania się z oficjalną dokumentacją w przypadku jakichkolwiek pytań.


Ikona niestandardowa

Nie przepadałem za ikoną bimbrownika, więc stworzyłem jedną z moich:

Możesz pobrać SVG tutaj . Ikona jest oparta na fantastycznym zestawie ikon Faenza i wydana na tej samej licencji (GNU / GPL).

Glutanimate
źródło
(1) Bimber jest wielki; (2) znalazłem przyczynę błędu: w rzeczywistości skrypt wymaga dostosowania do pracy w Xfce / Thunarze ( askubuntu.com/a/280623/47206 ): linii 150 należy zastąpić : if [ -z "$pdf_file" ]; then. Czy powinienem dodać te informacje do swojej odpowiedzi, czy wolisz to zrobić?
zmodyfikowany skrypt tutaj: pastebin.com/eEWHCwK7
@cipricus Przeoczyłem odniesienie do nautilus, dziękuję! Udało mi się znaleźć bardziej zaktualizowaną wersję skryptu z obsługą wielu plików i zredagowałem moją odpowiedź, aby uwzględnić zarówno twoją sugestię, jak i nowy skrypt.
Glutanimate
1
@cipricus Ostatnia aktualizacja. Nienawidzę brzydkich ikon, więc stworzyłem nową dla księżniczki. Upewnij się, aby to sprawdzić!
Glutanimate
Świetna odpowiedź !, ale może lepiej byłoby podzielić odpowiedź na dwie odpowiedzi, jedną dla Skryptu Nautliusa i jedną dla Księżycowego Księcia. Esp. ostatni działa świetnie!
matematyka
0

Wiersz polecenia Ghostscript

Tak proste:

ps2pdf "argument.pdf"

Wygeneruje argument.pdf.pdfplik, który będzie (w większości przypadków) mniejszy niż oryginalny.

Skrypt Nemo

Otwórz edytor tekstu i napisz:

ps2pdf "$*"

Zapisz go w /home/youruser/.local/share/nemo/scripts, z intuicyjną nazwą, powiedzmy „zmniejsz rozmiar pliku PDF”; nie ma potrzeby używania rozszerzenia pliku.

Następnie zastosuj chmod +x "reduce PDF size".

Musisz tylko otworzyć Nemo, przejść do pliku, kliknąć plik PDF prawym przyciskiem myszy, wybrać skrypty, a następnie „zmniejszyć rozmiar PDF”.

Skutki uboczne: Nie rozpoznaje udziałów samby, generując nowy uszkodzony plik.

kokbira
źródło