首先,感谢所有在这里发帖的人。
我有一个名为pdfScale 的小脚本,它吸收了此处发布的部分答案。所以我决定退回我的 2 美分。我使用了一些库尔特和蒂姆的答案。不过和蒂姆的更相似。我已经玩了几天了,这是我对此处发布的方法的部分结论:
使用-sPAPERSIZE按名称设置纸张尺寸
- 很容易只传递论文名称(例如a4)
- 可能无法产生 100% 准确的点大小
- 可翻转横向纵向
以 PS 点为单位设置纸张大小-dDEVICEWIDTHPOINTS、-dDEVICEHEIGHTPOINTS
- 确保获得所需的磅数
- 您可以自己翻转宽度 高度
- You need to know the sizes in Points
- 围绕它编写脚本并不容易,因为您需要以磅为单位的新页面大小,并且如果您想检测横向/纵向,还需要源的页面大小。
- 您也可以设置自定义纸张(您真正想要的任何尺寸)。
- 我使用的是
-dDEVICEWIDTH、-dDEVICEHEIGHT,而不是更长的积分版本,但它们似乎都做同样的事情(都获得积分)。
因为我的 bash 脚本已经能够获取源页面大小,并且我喜欢能够设置自定义页面大小的想法,所以我决定专注于以磅为单位设置页面大小。我还已经在我的脚本中包含了GS Paper Sizes(带有名称和大小)。所以获取这些信息也很容易。
正如前面所指出的,在这两种情况下似乎都必须使用-dFIXEDMEDIA。
这就是我的方法(以脚本方式)
- 获取源 PDF 页面大小(用于翻转检测)
- 以磅为单位获取目标的页面大小(例如 A4 > 595x842)
- 如有必要,检查它们是否具有相同的方向或翻转目标
- 使用点或翻转点运行 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。