Один лайнер для преобразования маленькой текстовой строки в PDF

Я пытался найти способ создать простую страницу PDF из терминала, который содержит только одну строку, например, "Вводную часть".

Некоторый фон: Я использую pdfunite для присоединения к музыкальным чартам вместе в единственный PDF. Вот пример:

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

То, что я пытаюсь найти, является способом создать пользовательские листы в заключительном PDF все в одной единственной команде, подобной этому:

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

В сущности создание PDF, который содержит текст, "Имеет место" на лету и вставку его в корректное пятно заключительного документа.

Действительно ли это возможно?

2
задан 21 March 2016 в 18:38

3 ответа

Tl; доктор

pdfunite пусть ошибка в случае, если дескриптор файла, содержащий стандартный вывод выполнения команды в замене команды, пуст к тому времени, когда это читается.

Таким образом, Вы - более обеспеченное использование альтернативы pdfunite; так как Вы имеете ghostscript установленный Вы могли использовать 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

Если я понял правильно, что Вы были достаточно близки:

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

<<<"Have a seat" маркер в enscript команда перенаправит enscriptстандартный вход к строке и -p - маркер сделает enscript управляйте печатью к стандартному выводу;

Используя <() вместо () сделает целое <() маркер быть замененным дескриптором файла, содержащим стандартный вывод выполнения команды внутри <() (Иначе обработайте замену), с помощью - вместо output.pdf сделает ps2pdf распечатайте PDF к стандартному выводу вместо в файл.

Но проблема с этим подходом - это pdfunite пусть ошибка в случае, если дескриптор файла, содержащий стандартный вывод выполнения команды в замене команды, пуст к тому времени, когда это читается.

Таким образом, Вы - более обеспеченное использование альтернативы pdfunite; так как Вы имеете ghostscript установленный Вы могли использовать 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 -) правильно цепочки foo.pdf и документ, содержащий слово "панель", сгенерированная с помощью сценария PostScript, сгенерированного enscript <<<"bar" -p -.

4
ответ дан 2 December 2019 в 01:57

Я пытаюсь создать маленький файл PDF с размером страницы, просто соответствующим тексту, т.е. небольшому PDF размера маркировки. Я думаю, что цель соответствует этому вопросу, как указано. В одной строке это может быть сделано следующим образом:

echo "foobar" | enscript --no-header -p out.ps && ps2pdf out.ps && pdfcrop out.pdf out.pdf

Это приводит к небольшому файлу, который похож на это:

enter image description here

1
ответ дан 2 December 2019 в 01:57

я чувствую плохо не принятие ответа, предложенного @kos, но я не мог заставить это работать, и я предпочел продолжать простоту pdfunite. @kos помог мне понять enscript (СПАСИБО!)

, Мое конечное решение состояло в том, чтобы записать сценарий удара для создания временных файлов PDF, затем представить их в виде строки вместе использующий pdfunite.

команда дается следующим образом:

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

Вот сценарий удара (я - новичок, пойдите легкие)

#!/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
0
ответ дан 2 December 2019 в 01:57

Другие вопросы по тегам:

Похожие вопросы: