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)
Respuestas
¿Demasiados anuncios?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é.
Esto puede hacerse de la siguiente manera:
- 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).
- Convertir un archivo de texto a Latin1, utilizando
recode
- Llame a
a2ps
sobre el resultado - Convertir el archivo PS resultante en PDF, utilizando
ps2pdf
de la instalación de LaTeX - Opcionalmente, utilice
gs
convertir el PDF resultante a PDF-1.3 para reducir su tamaño de archivo - 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