我一直在尝试寻找一种方法来从终端创建一个仅包含一个字符串的简单 PDF 页面,例如“Prelude”。
一些背景知识:我使用 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
本质上,动态创建包含文本“Have a sit”的 PDF 并将其插入到最终文档的正确位置。
这可能吗?
答案1
太长不看
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 -)
正确地通过 生成的 PostScript 脚本生成链条foo.pdf
和包含单词“bar”的文档enscript <<<"bar" -p -
。
答案2
答案3
我很遗憾没有接受@kos 建议的答案,但我无法让它工作,我更喜欢继续使用 pdfunite 的简单性。@kos 帮助我理解了 enscript(谢谢!)
我的最终解决方案是编写一个 bash 脚本来创建临时 PDF 文件,然后使用 pdfunite 将它们串在一起。
命令发出如下:
./charts.bash -o=output-filename.pdf ./AlmostThere.pdf ./Breathe.pdf -c="The Gospel According to Matthew" ./Doxology.pdf -c="Closing Prayer"
这是 bash 脚本(我是新手,慢慢来)
#!/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