使用Ghostscript调整PDF大小

时间:2011-09-16 14:55:39

标签: pdf resize ghostscript page-size

我正在尝试缩放PDF,例如A4尺寸小到A4。

这适用于肖像文档。文档按比例放大,然后将填充添加到顶部。

在横向文档中,不会添加填充。因此,文档最终将是A4的正确高度,但不够宽,因为文档方面没有添加填充(正如我所希望的那样)。

这是我用它来处理A4肖像文档的原因:

gs \
 -sOutputFile=output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
 -dPDFFitPage \
  input.pdf

5 个答案:

答案 0 :(得分:52)

您应该添加-dFIXEDMEDIA开关:

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dFIXEDMEDIA \
 -dPDFFitPage \
 -dCompatibilityLevel=1.4 \
  input.pdf
如果您需要强制使用特定纸张/页面/介质尺寸并忽略文档中指定的纸张/页面/介质尺寸,则始终需要

-dFIXEDMEDIA。因为PDF始终定义了纸张/页面/介质尺寸(PostScript可能具有,或者可能没有...)。

(我的-o ...更短,可以节省一个添加-dBATCH -dNOPAUSE - 但仅适用于更新版本的Ghostscript。)

答案 1 :(得分:7)

您的命令根本不进行任何缩放,它只需要一个PDF文件并将其转换为PDF文件。

我建议您尝试添加-dPDFFitPage,它将缩放PDF文件中的页面以匹配当前页面大小(在本例中由-sPAPERSIZE指定)。

这通常适用于具有指定纸张尺寸的打印机,因此可能无法与没有固定页面尺寸的pdfwrite设备一起使用,但尝试一下。

答案 2 :(得分:6)

通过指定点的大小而不使用-dPDFFitPage,似乎可以(最好)强制输出的大小。我得到了分数点大小,这很糟糕。以下是使用按需印刷服务进行A5打印。 "真" A5是420x595点。我发现使用-sPAPERSIZE = a5给出了小数点页面大小,但这可能是因为原始版本很难。

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \
 -dFIXEDMEDIA \
 -dCompatibilityLevel=1.4 \
  input.pdf

为了测试这一点,我发现使用PDFshuffler我能够导出单个页面,然后使用pdfinfo我能够获得这些页面的精确大小。这证实明确使用设备参数有帮助。

答案 3 :(得分:6)

首先,感谢发布在这里的所有人。

我有一个名为pdfScale的小脚本,它吸收了这里发布的部分答案。所以我决定回复我的2美分。我正在使用Kurt和Tim的答案。更像Tim的相似之处。我已经玩了几天了,这是我对这里发布的方法的部分结论:

使用-sPAPERSIZE

按名称设置纸张尺寸
  • 轻松传递纸质名称(例如a4)
  • 可能无法产生100%准确的分数
  • May Flip Landscape<>肖像

在PS点设置纸张尺寸-dDEVICEWIDTHPOINTS-dDEVICEHEIGHTPOINTS

  • 确保您获得所需的磅数
  • 您可以翻转WIDTH<>自己高手
  • You need to know the sizes in Points
  • 围绕它编写脚本并不容易,因为如果要检测横向/纵向,则需要新的页面大小,并且还需要源页面大小。
  • 您也可以设置自定义论文(您想要的任何尺寸)。
  • 我使用-dDEVICEWIDTH-dDEVICEHEIGHT代替较长的积分版本,但他们似乎都做同样的事情(两者都得分)。

因为我的bash脚本已经能够获取源页面大小,并且我喜欢能够设置自定义页面大小的想法,所以我决定专注于以点数设置页面大小。我还在我的脚本中包含了GS Paper Sizes(名称和大小)。所以获得这些信息也很容易。

如前所述,使用-dFIXEDMEDIA似乎是两种情况都必须的。

这就是我的方法(以脚本方式)

  1. 获取源PDF页面大小(用于翻转检测)
  2. 以磅为单位获取目标页面大小(例如,A4> 595x842)
  3. 检查它们是否具有相同的方向或必要时翻转目标
  4. 使用积分或翻转点运行GS
  5. 当我尝试修复自动轮播问题时,I found this other Kurt response。 这是关于使用-dAutoRotatePages。只需复制他的部分答案:

    • -dAutoRotatePages=/None - 保留每页的方向;
    • -dAutoRotatePages=/All - 根据一种"多数决定&#34 ;;
    • 旋转所有页面(或无)
    • -dAutoRotatePages=/PageByPage - 单独自动轮换页面。

    我的脚本默认为PageByPage,但可以调整。它在我的测试中运作良好。使用-dAutoRotatePages似乎也减少了预翻页面大小的需要,即使它不是一回事。我保留了两种选择。

    我的小应用程序最初是为了缩放PDF而创建的(不改变页面大小)。然后我现在添加了一个,另一个或两个的功能。我仍然无法在一次GS电话会议中完成所有工作。

    这就是我要求调整大小,将变量更改为实际值。这适用于A4纵向尺寸PageByPage自动旋转:

    gs \
    -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
    -dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
    -dColorConversionStrategy=/LeaveColorUnchanged \
    -dSubsetFonts=true -dEmbedAllFonts=true \
    -dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 \
    -dAutoRotatePages='/PageByPage' \
    -dFIXEDMEDIA -dPDFFitPage \
    -sOutputFile='../myOutputFile.pdf' \
    -f '../input.pdf'
    

    请注意,我还在使用-dFIXEDMEDIA-dPDFFitPage。因为这适合页面,我的脚本的另一部分可能很方便在调整大小后缩放PDF内的内容(特别是如果PDF的比例发生了很大变化)。这是我在脚本中调整大小后(在混合模式下)总是运行缩放的原因之一。

    关于使用Paper Name时的分数问题,在我将转换从mm /英寸舍入到点之前,我已经发生了这种情况。在我开始围绕它们之后,它们似乎永远是所需要的。看起来很奇怪,GS会为这些价值奠定基础。

    所以我的结论是,困难的部分是找到一个解决方案,在不同的文档上使用不同的大小和方向。我仍然不确定我是否使用了正确的解决方案。但是,通过让用户更改翻转检测和GS自动旋转,我希望至少能够为大多数情况提供解决方案。

    我还在这个过程中重建了大部分代码,现在很容易阅读。如果您想自己自动执行此类任务,可能需要检查它。当然,缩放/调整PDF大小也很有用:

    https://github.com/tavinus/pdfScale

    PS:pdfScale的起源on this StackOverflow thread

答案 4 :(得分:-1)

pstops的功能令人遗憾,这是一个非常有用的包 缩放和组合postscript页面似乎不可用 对于pdfs。有一个名为pdftopdf的程序,但确实如此(就我而言) 可以看到)做与pstops相同的事情。     你可以制作一个ps文件(我在evince中打印到文件),使用pstops,和 那么ps2pdf,但这很笨拙。

相关问题