太长不看

太长不看

我一直在尝试寻找一种方法来从终端创建一个仅包含一个字符串的简单 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"命令中的标记将把enscriptenscript标准输入重定向到字符串,并且该-p -标记将使enscript命令打印到标准输出;

使用<()而不是()将使整个<()标记被替换为包含在内部运行的命令的标准输出的文件描述符<()(又称为进程替换),使用-而不是output.pdf将使ps2pdfPDF 打印到标准输出而不是文件。

但这种方法的问题在于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

我需要创建一个页面大小刚好与文本匹配的小型 PDF 文件,即一个小标签大小的 PDF。我认为目标与所述问题相符。一行代码即可完成,如下所示:

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

这将生成一个如下所示的小文件:

在此处输入图片描述

答案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

相关内容