首先,感谢所有在这里发帖的人。
我有一个名为pdfScale的小脚本,它吸收了此处发布的部分答案。所以我决定退回我的 2 美分。我使用了一些库尔特和蒂姆的答案。不过和蒂姆的更相似。我已经玩了几天了,这是我对此处发布的方法的部分结论:
按名称设置纸张尺寸-sPAPERSIZE
- 很容易只通过论文名称(例如a4)
- 可能无法产生 100% 准确的点大小
- 可翻转横向 <> 纵向
以 PS-points 为单位设置纸张大小-dDEVICEWIDTHPOINTS
,-dDEVICEHEIGHTPOINTS
- 确保你得到你想要的点数
- 您可以自己翻转 WIDTH <> HEIGHT
- 你需要知道点的大小
- 围绕它编写脚本并不容易,因为您将需要以磅为单位的新页面大小,并且如果您想检测横向/纵向,还需要源的页面大小。
- 您也可以设置自定义纸张(您真正想要的任何尺寸)。
- 我使用的是
-dDEVICEWIDTH
,-dDEVICEHEIGHT
而不是更长的积分版本,但它们似乎都做同样的事情(都获得积分)。
因为我的 bash 脚本已经能够获取源页面大小,并且我喜欢能够设置自定义页面大小的想法,所以我决定专注于以磅为单位设置页面大小。我还已经在我的脚本中包含了GS 纸张尺寸(带有名称和尺寸)。所以获取这些信息也很容易。
-dFIXEDMEDIA
正如前面所指出的,在这两种情况下似乎都必须 使用。
所以这就是我的方法(以脚本方式)
- 获取源 PDF 页面大小(用于翻转检测)
- 以磅为单位获取目标的页面大小(例如 A4 > 595x842)
- 检查它们是否具有相同的方向或必要时翻转目标
- 使用点或翻转点运行 GS
当我试图解决自动旋转问题时,我发现了另一个 Kurt response。这是关于使用-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'
请注意,我也在使用-dFIXEDMEDIA
AND -dPDFFitPage
。因为这适合页面,所以我的脚本的另一部分可能很方便在调整大小后缩放 PDF 中的内容(特别是如果 PDF 的比例发生了很大变化)。这就是我在脚本中调整大小后总是运行缩放的原因之一(在混合模式下)。
关于使用纸张名称时的分数问题,在将转换从毫米/英寸四舍五入到点之前,我遇到了这种情况。在我开始对它们进行四舍五入后,它们似乎总是需要的。不过,GS 会降低这些值似乎很奇怪。
所以我的结论是,困难的部分是找到一个适用于不同尺寸和方向的不同文档的解决方案。我仍然不确定我使用的是正确的解决方案。但是通过让用户更改翻转检测和 GS 自动旋转,我希望至少在大多数情况下都能找到解决方案。
我还重建了这个过程中的大部分代码,现在很容易阅读。如果您想自己自动执行此类任务,检查它可能很有用。当然,仅缩放/调整 PDF 大小也很有用:
https://github.com/tavinus/pdfScale
PS:pdfScale 起源于这个 StackOverflow 线程。