令人信服的 pdfbook 假设 letterpaper

令人信服的 pdfbook 假设 letterpaper

我有一本半尺寸的小册子letterpaper

\documentclass{book}
\usepackage[paperheight=8.5in,paperwidth=5.5in]{geometry}

\usepackage{mwe}
\begin{document}
\lipsum[1-13]
\end{document}

但是,当我运行pdfbook生成的 PDF 时,无论原始页面大小如何,我得到的 PDF 总是 11.7 x 8.27 英寸。如何使用pdfbook(或pdfjam) 简单(且适当地)将这些页面合并在一起,而无需尝试更改纸张大小?

理想的

编译上述 MWE 后,我得到了一个大小恰好是信纸一半的 PDF。我想运行pdfbook(或自定义调用pdfjam),以便这些页面以正确的配置在长边上设置为两页,以将其装订成一本书。


$ pdfbook -p letter test.pdf out.pdf
          ----
  pdfjam: This is pdfjam version 2.08.
  pdfjam: Reading any site-wide or user-specific defaults...
          (none found)
  pdfjam ERROR: no PDF/JPG/PNG file found at -p

答案1

这里的基本问题是pdfjam表现出非标准行为,并且记录得相当差。由于pdfbook基本上是 的一个最小包装器pdfjam,它继承了这些缺陷,同时进一步掩盖了问题的根源。

在这种情况下,您可以使用以下方法解决问题

pdfbook --paper letter --outfile out.pdf -- in.pdf

请注意,--输入 pdf 之前的 是必需的。这对于 shell 脚本来说根本不是正常行为。pdfjam解析选项非常奇怪。我不想说它很危险,但我不相信它不危险。但是,只要你不传递任何危险的东西,它应该(希望)是相当安全的。

弄清楚这一点需要一点侦查工作。和的手册页pdfbook并没有提供太多信息。基本上,我首先阅读了显示如何调用的pdfjam脚本。这相对简单。然后我直接切换到测试,试图缩小问题范围。pdfbookpdfjampdfjam

pdfjam --help

是我发现的最有用的文档来源。其中包括以下内容:

Usage: pdfjam [OPTIONS] [--] [FILE1 [SEL1]] [FILE2 [SEL2]]...

 --paper PAPERSPEC  (or simply --PAPERSPEC)
              Specify a LaTeX paper size, for example
              '--paper a4paper' or simply '--a4paper' for ISO A4 paper.
              If the LaTeX 'geometry' package is installed, a wider range
              of paper sizes is available.  For details see documentation
              for LaTeX and/or the 'geometry' package.
              [Default for you at this site: paper=a4paper]
 --papersize '{WIDTH,HEIGHT}'
              Specify a custom paper size, e.g.,
                  --papersize '{10in,18cm}'
              (Note the braces, and the comma!)
              If the 'geometry' package is not found, this has no effect.

* '--' can be used to signal that there are no more options to come.

这并没有告诉你,该脚本正在以非标准方式解析选项,并且- 是必不可少的如果传递了某些选项。通常,只有在--传递给 shell 脚本的主要参数之一可能被误认为是选项(例如文件名以 开头-)或者您希望防止误用(例如调用 shell 时)时才需要。但是,在 的情况下pdfjam,如果您写

pdfjam --paper letter --outfile out.pdf in.pdf

您将收到错误。使用 进行调试表明,在调用 提供的 PDF 合并命令时,--no-try脚本正在传递类似的东西作为可选参数。然后它尝试合并和。显然,这些都不起作用。paper letter--outfilepdfpagesout.pdfin.pdf

回顾pdfjam其本身,你可以看到它是如何解析选项的:

for arg
do
    case $arg in
        --quiet | -q | --configpath)
            verbose=false ;
            ;;
        --version | -V)
            echo "$version"
            exit 0 ;
            ;;
        --batch)
            batch=true ;
            ;;
        --help | -u | -h)
            help=true ;
            ;;
        --vanilla)
            vanilla=true ;
            ;;
        *)
            ;;
    esac
done

然后,它会在文件后面单独解析任何剩余的选项。我不太清楚它为什么这样做,但结果是它基本上无法区分选项和参数。如果你没有明确告诉它选项已经完成,它就无法正确解析任何剩余的选项。这实际上非常糟糕,因为它让任意的东西被传递下去,pdfpages即使它毫无意义。虽然我不知道这是否会被利用,但它是那种可以让脚本容易受到攻击的东西。

此外,包括

* '--' can be used to signal that there are no more options to come.

不构成此行为的正确文档,因为这是 shell 脚本的标准行为。不标准的是,这是必需的即使你的第一个参数有一个不奇怪的名字即,即使in.pdf文件名不是以 开头-

在我看来,这是有缺陷的行为。 Shell 脚本不应该有这样的行为。此外,它用于/var/tmp临时文件。这也是非标准且有问题的。它应该/tmp这样使用,例如,在重新启动时删除它创建的临时文件。尽管这些文件只有在传递时才会保留--no-tidy,但这种行为仍然是意料之外的,而且我认为对于这种类型的脚本来说,这是不可取的。

pdfjam因此,在使用和包装器(例如)时,我会非常小心pdfbook。例如,我会避免将其他进程的输出通过管道传输到,pdfjam并且只手动调用脚本或其包装器。

相关内容