¿Cómo generar un PDF (válido) con “a2ps foo.txt”?

0

Instalé a2ps en Mac OS X 10.10.4 a través de brew. Mi ~/.a2psrc contiene Options: --medium=Letter -P pdf . Pero cuando hago a2ps foo.txt no se genera ningún archivo PDF (esto solía funcionar en Ubuntu / Debian Linux). Cuando hago a2ps -o foo.pdf foo.txt obtengo un PDF, pero no puedo abrirlo (¿está dañado?). Sin embargo, en a2ps -o foo.pdf foo.txt obtengo una PS que luego puedo convertir a PDF (y abrir). ¿Cómo puedo hacer a2ps foo.txt para producir un PDF válido en Mac OS X? Tenga en cuenta que estoy buscando específicamente la línea de comando a2ps , no GUI u otros programas (obviamente, es fácil generar un PDF desde un archivo de texto con otras herramientas)

    
pregunta Marius Hofert 21.07.2015 - 14:09

2 respuestas

4

La utilidad a2ps es para formatear archivos para imprimir en una impresora PostScript, por lo tanto, su nombre no es a2pdf .

El archivo que creó bajo Linux (u OS X), que es un archivo .pdf , es de hecho un archivo PostScript y muchos Distros de Linux ábrelo de todos modos. Por lo tanto, hacerte creer que era un Documento PDF cuando en realidad no lo es.

Al mirar el archivo creado bajo Linux en un Editor Hex, su encabezado comienza con, por ejemplo, %!PS-Adobe-3.0 y un Documento PDF comienza con, por ejemplo, %PDF-1.6% .

Esta es la razón por la que obtiene el "No se pudo abrir el archivo" nombre de archivo.pdf ". Puede estar dañado o usar un formato de archivo que la Vista previa no reconoce" mensaje de error en OS X al intentar abrir un Documento PostScript con una extensión de nombre faltante PDF .

Actualización: Instalación de a2pdf

Después de investigar un poco, encontré a2pdf . La investigación adicional requirió tener Font :: TTF :: Font y también se ha instalado PDF :: API2 . Así que descargué los tres paquetes master.zip (para a2pdf) , Font-TTF-1.04.tar.gz y PDF-API2-2.023.tar.gz .

A continuación, extraje los tres y los instalé de la misma manera en el siguiente orden, Font :: TTF :: Font, PDF :: API2 y luego master.zip (para a2pdf). Hice esto en una Terminal usando los siguientes comandos.

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

Luego probé, desde mi directorio principal, con: a2pdf filename.txt > filename.pdf

Crea filename.pdf y luego lo abrí en Vista previa como un Documento PDF .

Dicho esto, hay otros módulos que se pueden instalar para hacer cosas como resaltado de sintaxis , por ejemplo. Perl :: Tidy . Así que tendrás que investigar un poco más para utilizar las capacidades completas de a2pdf .

Nota: tengo Xcode y las herramientas de línea de comando para Xcode instaladas y mientras tenga instaladas las herramientas de línea de comando para Xcode, que es un requisito previo de Homebrew, puede instalar todo esto desde la Terminal de la manera antigua si no está disponible de Homebrew, que no creo que sea.

    
respondido por el user3439894 21.07.2015 - 15:04
1

Esto se puede hacer de la siguiente manera:

  1. Guarde el archivo de texto en codificación UTF-8, aunque 'a2ps solo admite Latin1 (Esto se hace principalmente porque UTF-8 es estándar en la actualidad).
  2. Convierta el archivo de texto a Latin1, usando recode
  3. Llame a a2ps en el resultado
  4. Convierta el archivo PS resultante a PDF, usando ps2pdf de la instalación de LaTeX
  5. Opcionalmente, use gs para convertir el PDF resultante a PDF-1.3 para reducir el tamaño de su archivo
  6. Copie el PDF-1.3 de nuevo en el directorio donde se encuentra el archivo de texto

En Linux, esto se puede hacer mediante la siguiente secuencia de comandos.

La forma más sencilla de llamarlo es txt2pdf file.txt , asumiendo que se guarda en ~/bin/txt2pdf o en otra ubicación estándar. 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
    
respondido por el Thure Dührsen 05.12.2018 - 20:13

Lea otras preguntas en las etiquetas