使用Ghostscript调整PDF大小

Mat*_*att 37 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
Run Code Online (Sandbox Code Playgroud)

Kur*_*fle 52

你应该添加-dFIXEDMEDIA开关:

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dFIXEDMEDIA \
 -dPDFFitPage \
 -dCompatibilityLevel=1.4 \
  input.pdf
Run Code Online (Sandbox Code Playgroud)

-dFIXEDMEDIA如果您需要强制特定纸张/页面/介质尺寸并忽略文档中指定的纸张/页面/介质尺寸,则始终需要.因为PDF始终定义了纸张/页面/介质尺寸(PostScript可能具有或可能没有...).

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

  • 谢谢,对于A5和单行:`gs -sDEVICE = pdfwrite -sPAPERSIZE = a5 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel = 1.4 -o out.pdf in.pdf` (5认同)

Gus*_*ves 9

首先,感谢发布在这里的每个人.

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

用名称设置纸张尺寸 -sPAPERSIZE

  • 容易传递纸质名称(例如a4)
  • 可能无法生成100%准确的分数
  • 可翻转风景<>人像

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

  • 确保您获得所需的磅数
  • 你可以自己翻转WIDTH <> HEIGHT
  • 你需要知道点数的大小
  • 围绕它编写脚本并不是那么容易,因为如果要检测横向/纵向,则需要以磅为单位的新页面大小,并且还需要源的页面大小.
  • 您也可以设置自定义纸张(您想要的任何尺寸).
  • 我正在使用-dDEVICEWIDTH,-dDEVICEHEIGHT而不是更长的点数版本,但他们似乎都做同样的事情(都获得积分).

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

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

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

  1. 获取源PDF页面大小(用于翻转检测)
  2. 获取目标页面大小(例如A4> 595x842)
  3. 如有必要,检查它们是否具有相同的方向或翻转目标
  4. 使用点或翻转点运行GS

当我试图修复自动旋转问题时,我发现了另一个Kurt响应.这是关于使用-dAutoRotatePages.只需复制他的部分答案:

  • -dAutoRotatePages=/None - 保留每页的方向;
  • -dAutoRotatePages=/All - 根据"多数决定"的类型,旋转所有页面(或不旋转);
  • -dAutoRotatePages=/PageByPage - 单独自动旋转页面.

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

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

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

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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

https://github.com/tavinus/pdfScale

PS:pdfScale起源于这个StackOverflow线程.


Ken*_*enS 7

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

我建议你尝试添加-dPDFFitPage,它将缩放PDF文件中的页面以匹配当前页面大小(在这种情况下由-sPAPERSIZE指定).

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


小智 6

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

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \
 -dFIXEDMEDIA \
 -dCompatibilityLevel=1.4 \
  input.pdf
Run Code Online (Sandbox Code Playgroud)

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