1 votos

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

He instalado a2ps en Mac OS X 10.10.4 mediante brew. Mi ~/.a2psrc contiene Options: --medium=Letter -P pdf . Pero cuando lo 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 se puede abrir (¿tal vez esté dañado?). Sin embargo, en a2ps -o foo.pdf foo.txt Obtengo un PS que luego puedo convertir en 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 comandos a2ps No hay interfaz gráfica de usuario ni otros programas (obviamente, es fácil generar un PDF a partir de un archivo de texto con otras herramientas)

4voto

user3439894 Puntos 5883

El a2ps es para formatear archivos para imprimir en una impresora PostScript, de ahí que su nombre no sea a2pdf .

El archivo que ha creado en Linux (o en OS X), que es un archivo mal llamado .pdf es, de hecho, un PostScript y muchas distribuciones de Linux lo abrirán de todos modos. Por lo tanto, lo que lleva a creer que es un Documento PDF cuando en realidad no lo es.

Si observamos el archivo creado en Linux en un editor hexadecimal, su cabecera comienza, por ejemplo, con %!PS-Adobe-3.0 y un Documento PDF comienza con, por ejemplo, %PDF-1.6% .

Por eso aparece el mensaje "El archivo "filename.pdf" no pudo ser abierto. Puede estar dañado o utilizar un formato de archivo que Preview no reconoce". Documento PostScript con un mal llamado Documento PDF extensión.

Actualización: Instalación de a2pdf

Después de investigar un poco he encontrado a2pdf . Es necesario seguir investigando para tener Fuente::TTF::Fuente y PDF::API2 también se ha instalado. Así que descargué los tres paquetes master.zip (para a2pdf) , Fuente-TTF-1.04.tar.gz y PDF-API2-2.023.tar.gz .

Luego extraje los tres y los instalé de la misma manera en el siguiente orden, Font::TTF::Font, PDF::API2 y luego el master.zip (para a2pdf). Lo hice en un Terminal usando los siguientes comandos.

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

Luego probé, desde mi Directorio de Inicio, con: a2pdf filename.txt > filename.pdf

Crea nombre de archivo.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 todas las capacidades de a2pdf .

Nota: Tengo Xcode y Command Line Tools para Xcode instalados y mientras tengas Command Line Tools para Xcode instalado, que es un prerrequisito de Homebrew, puedes instalar todo esto desde la Terminal a la vieja usanza si no está disponible desde Homebrew, que no creo que lo esté.

1voto

Thure Dührsen Puntos 11

Esto puede hacerse de la siguiente manera:

  1. Guardar el archivo de texto en codificación UTF-8, aunque `a2ps sólo soporta Latin1 (Esto se hace principalmente porque UTF-8 es el estándar hoy en día).
  2. Convertir un archivo de texto a Latin1, utilizando recode
  3. Llame a a2ps sobre el resultado
  4. Convertir el archivo PS resultante en PDF, utilizando ps2pdf de la instalación de LaTeX
  5. Opcionalmente, utilice gs convertir el PDF resultante a PDF-1.3 para reducir su tamaño de archivo
  6. Copie el PDF-1.3 en el directorio en el que se encuentra el archivo de texto

En Linux, esto se puede hacer mediante el siguiente script.

La forma más sencilla de llamarlo es txt2pdf file.txt suponiendo que se guarde en ~/bin/txt2pdf o algún otro lugar 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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X