2011-09-16 254 views
32

我正在尝试缩放PDF,例如A4尺寸的小尺寸A4。使用Ghostscript调整PDF大小

这适用于纵向文档。文档正确放大,然后将填充添加到顶部。

虽然没有添加横向文档填充。因此,文档最终会成为A4的正确高度,但不够宽,因为文档边没有添加填充(正如我所希望的那样)。

这是我使用它有对于A4文件的工作:

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

回答

7

您的命令不会做任何缩放可言,它只是需要一个PDF文件,并将其转换成PDF文件。

我建议你尝试添加-dPDFFitPage这将缩放页面的PDF文件,以匹配当前的页面尺寸(如-sPAPERSIZE在这种情况下指定)。

这通常是打算用具有一个定义的纸张尺寸,因此可能无法与没有一个固定的页面大小pdfwrite设备很好地工作的打印机,但其worht一试工作。

+0

感谢您的回复,我已经使用了-dPDFFITPAGE参数,但这并没有得到它的工作。 – Matt

+0

有些方法(丑陋的)可以扩展PDF输入,但通常不是必需的。你能分享一个示例文件来看看吗? – KenS

+0

@Matt:我认为它会工作,如果你添加'-dFIXEDMEDIA'开关... –

42

您应该添加-dFIXEDMEDIA开关:

gs \ 
-o output.pdf \ 
-sDEVICE=pdfwrite \ 
-sPAPERSIZE=a4 \ 
-dFIXEDMEDIA \ 
-dPDFFitPage \ 
-dCompatibilityLevel=1.4 \ 
    input.pdf 

-dFIXEDMEDIA始终是必需的,如果你需要强制一个特定的文件/页面/纸张大小,而忽略了纸/页/媒体文件中指定的大小。由于PDF始终定义了纸张/页面/介质大小(PostScript可能具有或可能不具有......)。

(我-o ...更短,从加入-dBATCH -dNOPAUSE节省一个 - 但仅限于较新版本的Ghostscript作品)

+3

谢谢,A5和单行:'gs -sDEVICE = pdfwrite -sPAPERSIZE = a5 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel = 1.4 -o out.pdf in.pdf' – Dorian

+1

谢谢, 有用!我使用A3:'gs -o outputA3.pdf -sDEVICE = pdfwrite -sPAPERSIZE = a3 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel = 1.4 input.pdf' – Tenaciousd93

+0

如何防止此命令发生的大量质量下降? – JohnnyFromBF

-1

这是一个耻辱,pstops,一个非常有用的包的特征为 缩放和结合postscript的页面,似乎不可用于pdf的 。有一个叫做pdftopdf的程序,但它确实(就我所知, )和pstops一样。 你可以制作一个ps文件(我打印到evince文件中),使用pstops,然后使用ps2pdf,但这非常笨拙。

5

看来,输出的大小可以(最好)被迫通过指定点的大小和未使用-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

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

我这个叫pdfScale小脚本,它吸收了张贴在这里的答案的一部分。所以我决定发回我的2美分。我正在使用库尔特和蒂姆的答案。更类似于蒂姆的。我跟这个玩了几天,这是我在这里张贴的方式部分结论:

设置纸张尺寸的名称与-sPAPERSIZE

  • 易刚通过的文件名(如。 A4)
  • 可能无法产生100%的准确点尺寸
  • 可能翻转景观<>肖像

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

  • 可以确保得到你点所需的大小
  • 可以翻转WIDTH <> HEIGHT自己
  • You need to know the sizes in Points
  • 没那么容易来编写脚本,因为如果要检测横向/纵向,您将需要新的页面大小,并且还需要源的页面大小。
  • 您也可以设置自定义的论文(任何您想要的尺寸)。
  • 我使用的是-dDEVICEWIDTH,-dDEVICEHEIGHT而不是更长的积分版本,但他们都似乎做同样的事情(都获得积分)。

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

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

所以这是我的方法如何去(以脚本的方式)

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

当我试图修复自动旋转问题时,I found this other Kurt response。 这是关于使用-dAutoRotatePages。在这里只复制他的一部分答案:

  • -dAutoRotatePages=/None - 保留每个页面的方向;
  • -dAutoRotatePages=/All - 根据“多数决定”的种类旋转所有页面(或无);
  • -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内的内容。这就是我在脚本中调整大小后(在混合模式下)始终运行缩放的原因之一。

关于使用纸张名称时的分数问题,在我将毫米/英寸转换为点之前,发生了这种情况。在我开始四舍五入之后,他们似乎永远都是需要的人。看起来奇怪的是,GS会落实这些价值。

所以我的结论是,难的部分是找到一种解决方案,可以在不同尺寸和方向的不同文档上进行全面的工作。我仍然不确定我是否正在使用适当的解决方案。但通过让用户更改翻转检测和GS自动旋转,我希望至少在大多数情况下都有解决方案。

我也重建了过程中的大部分代码,现在很容易阅读。如果你想自己自动执行这样的任务,检查它可能会有用。也有用,只是规模/调整PDF文件以及课程:

https://github.com/tavinus/pdfScale

PS:pdfScale它起源on this StackOverflow thread

相关问题