Um forro para converter uma pequena cadeia de texto em PDF

3

Estou tentando encontrar uma maneira de criar uma página simples de PDF a partir do terminal que contém apenas uma string, por exemplo, "Prelude".

Algumas informações básicas: eu uso o pdfunite para unir gráficos de música em um único PDF. Aqui está um exemplo:

 pdfunite Welcome.pdf Rooftops.pdf Announcements.pdf ChildrensPrayer.pdf ComeAliveDryBones.pdf Benediction.pdf Dismissal.pdf ~/Desktop/2016-03-12.pdf

O que estou tentando encontrar é uma maneira de criar folhas personalizadas no PDF final, tudo em um único comando, semelhante a este:

pdfunite Welcome.pdf (enscript "Have a seat" - | ps2pdf - output.pdf) Rooftops.pdf Announcements.pdf ComeAliveDryBones.pdf Benediction.pdf Dismissal.pdf ~/Desktop/2016-03-12.pdf

Essencialmente, criar um PDF que contenha o texto "Sente-se" rapidamente e insira-o no ponto correto do documento final.

Isso é possível?

    
por Jason Silver 21.03.2016 / 16:22

2 respostas

4

Tl; dr

pdfunite pode causar erro caso o descritor de arquivo que contém a saída padrão do comando em execução na substituição do comando esteja vazio no momento em que for lido.

Então é melhor você usar uma alternativa para pdfunite ; como você tem ghostscript instalado, você pode usar gs :

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=~/Desktop/2016-03-12.pdf Welcome.pdf <(enscript <<<"echo foo" -p -) Rooftops.pdf Announcements.pdf ComeAliveDryBones.pdf Benediction.pdf Dismissal.pdf

Se eu entendi corretamente, você estava muito perto:

pdfunite Welcome.pdf <(enscript <<<"Have a seat" -p - | ps2pdf - -) Rooftops.pdf Announcements.pdf ComeAliveDryBones.pdf Benediction.pdf Dismissal.pdf ~/Desktop/2016-03-12.pdf

O token <<<"Have a seat" no comando enscript redirecionará a entrada padrão de enscript para a string e o token -p - fará com que o comando enscript seja impresso na saída padrão;

Usar <() em vez de () fará com que todo o token <() seja substituído pelo descritor de arquivo que contém a saída padrão do comando executado em <() (AKA substituição de processo), usando - em vez de output.pdf fará ps2pdf imprimir o PDF na saída padrão em vez de em um arquivo.

Mas o problema com essa abordagem é que pdfunite pode resultar em erro caso o descritor de arquivo que contém a saída padrão do comando em execução na substituição do comando esteja vazio no momento em que for lido . / p>

Então é melhor você usar uma alternativa para pdfunite ; como você tem ghostscript instalado, você pode usar gs :

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=~/Desktop/2016-03-12.pdf Welcome.pdf <(enscript <<<"echo foo" -p -) Rooftops.pdf Announcements.pdf ComeAliveDryBones.pdf Benediction.pdf Dismissal.pdf
% enscript <<<"foo" -p -  | ps2pdf - foo.pdf 
[ 1 page * 1 copy ] left in -
% gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=foobar.pdf foo.pdf <(enscript <<<"bar" -p -)
[ 1 page * 1 copy ] left in -
GPL Ghostscript 9.16 (2015-03-30)
Copyright (C) 2015 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Loading NimbusMon-Bol font from /usr/share/ghostscript/9.16/Resource/Font/NimbusMon-Bol... 4726404 3142423 2470576 1091522 3 done.
Loading NimbusMon-Reg font from /usr/share/ghostscript/9.16/Resource/Font/NimbusMon-Reg... 4759732 3269347 2490768 1100127 3 done.
%

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=foobar.pdf foo.pdf <(enscript <<<"bar" -p -) corrige corretamente foo.pdf e um documento contendo a palavra "barra" gerada pelo script PostScript gerado por enscript <<<"bar" -p - .

    
por kos 21.03.2016 / 16:46
0

Sinto-me mal por não aceitar a resposta sugerida pelo @kos, mas não consegui fazê-lo funcionar, e preferi continuar com a simplicidade da pdfunite. @kos me ajudou a entender o enscript (OBRIGADO!)

Minha solução final foi escrever um script bash para criar os arquivos PDF temporários e, em seguida, reuni-los usando o pdfunite.

O comando é emitido da seguinte forma:

./charts.bash -o=output-filename.pdf ./AlmostThere.pdf ./Breathe.pdf -c="The Gospel According to Matthew" ./Doxology.pdf -c="Closing Prayer"

Aqui está o script bash (eu sou um novato, vá fácil)

#!/bin/bash
CHARTS=()
DELETEAFTER=()
for i in "$@"
do
    case $i in
        -o=*|--output=*)
        OUTPUT="${i#*=}"
    ;;
        -c=*|--create=*)
        NEWFILENAME="${i#*=}"
        NEWFILENAME=${HOME}/Desktop/${NEWFILENAME//[[:space:]]/}.pdf
        enscript <<<"${i#*=}" -p - --no-header --font=Courier25 --margins=20:20:200:0 | ps2pdf - $NEWFILENAME
        CHARTS+=("$NEWFILENAME")
    ;;
        *)
         # unknown option
        CHARTS+=("${i#*=}")
        DELETEAFTER+=("$NEWFILENAME");
    ;;
    esac
done
pdfuniteString=$(printf " %s" "${CHARTS[@]}")
pdfuniteString=${pdfuniteString:1}
wait
pdfunite $pdfuniteString ${HOME}/Desktop/${OUTPUT}
wait
for i in "${DELETEAFTER[@]}"
do
    if [ -n "$i" ]; then
        rm "$i"
    fi
done
echo Complete
    
por Jason Silver 21.03.2016 / 20:18