Come generare un PDF (valido) con "a2ps foo.txt"?

0

Ho installato a2ps su Mac OS X 10.10.4 tramite brew. Il mio ~/.a2psrc contiene Options: --medium=Letter -P pdf . Ma quando faccio a2ps foo.txt non viene generato alcun file PDF (usato per lavorare su Ubuntu / Debian Linux). Quando faccio a2ps -o foo.pdf foo.txt ottengo un PDF, ma non può essere aperto (forse è corrotto?). Tuttavia, su a2ps -o foo.pdf foo.txt ottengo un PS che posso quindi convertire in PDF (e aperto). Come posso rendere a2ps foo.txt per produrre un PDF valido su Mac OS X? Nota che sto cercando specificamente la riga di comando a2ps , nessuna GUI o altri programmi (ovviamente è facile generare un PDF da un file di testo con altri strumenti)

    
posta Marius Hofert 21.07.2015 - 14:09
fonte

2 risposte

4

L'utilità a2ps serve per la formattazione dei file per la stampa su una stampante PostScript, quindi il suo nome non è a2pdf .

Il file che hai creato sotto Linux (o OS X), che è un file .pdf , è in effetti un file PostScript e molte distribuzioni Linux aprilo comunque. Questo ti porta a credere che fosse un documento PDF quando in realtà non lo è.

Guardando il file creato sotto Linux in un editor esadecimale inizia la sua intestazione con, ad es., %!PS-Adobe-3.0 e un documento PDF inizia con, ad es., %PDF-1.6% .

Ecco perché non è possibile aprire "Il file" nomefile.pdf "potrebbe essere danneggiato o utilizzare un formato file che Anteprima non riconosce." messaggio di errore sotto OS X quando si prova ad aprire un documento PostScript con un'estensione documento PDF con nome errato.

Aggiornamento: installazione di a2pdf

Dopo aver fatto una piccola ricerca ho trovato a2pdf . Ulteriori ricerche hanno richiesto di avere Font :: TTF :: Font e PDF :: API2 anche installato. Così ho scaricato tutti e tre i pacchetti master.zip (per a2pdf) , Font-TTF-1.04.tar.gz e PDF-API2-2.023.tar.gz

Successivamente ho estratto tutti e tre e li ho installati nello stesso modo nel seguente ordine: Font :: TTF :: Font, PDF :: API2 poi master.zip (per a2pdf). Ho fatto questo in un terminale usando i seguenti comandi.

$ cd $target_directory
$ perl Makefile.PL
$ make
$ sudo make install

Ho quindi testato, dalla mia Home directory, con: a2pdf filename.txt > filename.pdf

Crea nomefile.pdf e l'ho quindi aperto in Anteprima come un documento PDF .

Detto questo, ci sono altri moduli che possono essere installati per fare cose come evidenziazione della sintassi , ad es. Perl :: Tidy . Quindi dovrai fare un po 'più di ricerche per utilizzare le funzionalità complete di a2pdf .

Nota: ho Xcode e Command Line Tools per Xcode installati e finché hai installato Command Line Tools per Xcode, che è un prerequisito Homebrew, puoi installare tutto questo dal Terminale alla vecchia maniera, se non disponibile da Homebrew, che non credo che sia.

    
risposta data 21.07.2015 - 15:04
fonte
1

Questo può essere fatto come segue:

  1. Salva il file di testo nella codifica UTF-8, anche se 'a2ps supporta solo Latin1 (Questo è fatto principalmente perché UTF-8 è standard al giorno d'oggi.)
  2. Converti file di testo in Latin1, utilizzando recode
  3. Chiama a2ps sul risultato
  4. Converti il file PS risultante in PDF, utilizzando ps2pdf dall'installazione di LaTeX
  5. Opzionalmente, usa gs per convertire il PDF risultante in PDF-1.3 per ridurre le dimensioni del file
  6. Copia il PDF-1.3 nella directory in cui risiede il file di testo

In Linux, questo può essere fatto dallo script seguente.

Il modo più semplice per chiamarlo è txt2pdf file.txt , assumendo che venga salvato in ~/bin/txt2pdf o in qualche altra posizione standard. Produce file.txt.pdf

 #!/bin/bash

 maketempdir () {
     local result
     if ! result="$(mktemp -d)"; then
         fail 'Cannot create temp directory'
     fi
     echo "$result"
 }

 trycd () {
     if [ "$#" -ne 1 ]; then
         fail 'trycd needs exactly one argument'
     fi

     if ! cd "$1" ; then
         debugoutput 'tried to cd to '"$(readlink -f "$1")"
         fail 'cannot cd to '"$1"
     fi
 }

 fail () {
     #
     # print an error message, then exit with a code
     #
     # $1: error message
     # $2: exit code
     #
     if [ -z "$1" ]; then fail 'Unspecified error' '1'; fi
     if [ -z "$2" ]; then fail "$1" '1';                fi
     yellow "$(bold "$(printf '\n!!!!! %s\n\n' "$1")")" >&2
     sleep 0.2
     exit "$2"
 }

 yellow() {
     local yellow='\e[0;93m'
     local normal='\e[0m'
     echo -ne "${yellow}"    # echo -n: Kein Zeilenumbruch am Ende
     echo -nE "$@"           # echo -e: Escape-Sequenzen interpretieren
     echo -e "${normal}"     # echo -E: Escape-Sequenzen nicht interpretieren
 }

 # tput zu benutzen wäre nicht schlecht. Damit kriegt man aber nur ein
 # blasses Gelb und kein Kanariengelb hin.
 # Außerdem werden Zeilenumbrüche verschluckt, vermutlich wegen des
 #    echo -nE "$@"

 bold() {
     local bold=$(tput bold)
     local normal=$(tput sgr0) 
     echo -ne "${bold}"        # auf Fettschrift umschalten
     echo -nE "$@"             # Text ausgeben
     echo -e "${normal}"       # auf normale Schrift umschalten
 }

 # http://stackoverflow.com/questions/5947742/
 # how-to-change-the-output-color-of-echo-in-linux
 # 2017-01-07

 debugoutput() {
     if [ "$#" -ne 1 ]; then
         fail 'debugoutput needs exactly one argument'
     fi
     printf '%s\n' "$1" >&2
 }


 tempdir="$(maketempdir)"
 readonly tempdir

 wd=$(readlink -e $(pwd))
 readonly wd

 trycd "$dir"
 trycd "$wd"

 orientation=null
 verbose=null

 case "$#" in

     1)
         exec "$0" --portrait "$1"
         ;;

     2)
         ## 1. Fall: "$1" ist --verbose, "$2" ist die Eingabedatei
         ## 2. Fall: "$1" ist die Ausrichtung, "$2" ist die Eingabedatei

         case "$1" in

             --verbose)
                 orientation='--portrait'
                 verbose=true
                 ;;
             --portrait|--landscape)
                 orientation="$1"
                 verbose=false
                 ;;
             *)
                 fail 'Erster Parameter muss Ausrichtung angeben oder --verbose lauten'
                 ;;
         esac
         infile="$2"
         ;;

     3)

         case "$1" in

             --portrait|--landscape)
                 orientation="$1"
                 ;;
             *)
                 fail 'Erster Parameter muss Ausrichtung angeben'
                 ;;
         esac

         case "$2" in            
             --verbose)
                 orientation="$1"
                 verbose=true
                 ;;
             *)
                 fail 'Zweiter Parameter muss --verbose lauten'
                 ;;
         esac

         infile="$(readlink -e "$3")"

         if [ -z "$infile" ]; then
             fail 'Eingabedatei '"$3"' existiert nicht'
         fi

         if [ ! -f "$infile" ]; then
             fail 'Eingabedatei '"$infile"' existiert nicht'
         fi
         ;;

     *)
         cat <<EOF
 Usage: $0 dateiname
 Usage: $0 [--portrait | --landscape] dateiname
 Usage: $0 --verbose dateiname
 Usage: $0 [--portrait | --landscape] --verbose dateiname
 EOF
         exit 1
         ;;
 esac

 readonly infile
 # readonly orientation # später
 readonly verbose
 # echo 'orientation='"$orientation"
 # echo 'verbose='"$verbose"
 # echo 'infile='"$infile"

 ###### 1. Schritt: Eingabedatei nach latin1 konvertieren

 bn=$(basename "$infile")
 tempfilename="$tempdir"'/'"$bn"'.txt' # will be latin1 after recode
 if ! cp -a "$infile" "$tempfilename"; then
     fail 'Cannot copy '"$bn"' to tempdir'
 fi

 if ! recode UTF-8..Latin1 "$tempfilename"; then
     fail 'Cannot recode '"$tempfilename"' from UTF-8 to Latin1' 
 fi

 psout="${tempfilename%.*}"'.ps'

 ###### 2. Schritt: a2ps aufrufen

 case "$orientation" in

     --portrait)
         a2ps -q -Eplain -R --encoding=latin1 --columns=1 -l 85 -o "$psout" "$tempfilename"
         ;;

     --landscape)
         a2ps -q -Eplain -r --encoding=latin1 --columns=1 -l 115 -o "$psout" "$tempfilename"
         ;;

 esac

 ###### 3. Schritt: ps nach PDF konvertieren

 pdfout="${psout/.ps/.pdf}"

 if ! ps2pdf "$psout" "$pdfout"; then
     fail 'Konnte PS nicht nach PDF konvertieren'
 fi

 ###### 4. Schritt: Erzeugte PDF-Datei so klein wie möglich machen

 smallout="${pdfout/.pdf/.small.pdf}"
 out="${smallout/.small/}"

 if ! gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dNOPAUSE\
      -dQUIET -dBATCH -sOutputFile="$smallout" "$pdfout"
 then
     fail 'Konnte PDF-Datei nicht verkleinern'
 fi

 if ! mv -f "$smallout" "$out"; then
     fail 'Konnte Ausgabedatei nicht erstellen'
 fi

 ###### 5. Schritt: PDF in das Verzeichnis kopieren, in dem die Eingabedatei liegt

 if ! cp -a "$out" "$wd"; then
     fail 'Konnte Ausgabedatei nicht in Eingabeverzeichnis schreiben'
 fi

 if [ "$verbose" = 'true' ]; then
     echo "$wd"/"$(basename "$out")"
 fi

 if ! rm -rf "$tempdir"; then
     fail 'Konnte temporäres Verzeichnis nicht löschen'
 fi
    
risposta data 05.12.2018 - 20:13
fonte

Leggi altre domande sui tag