如何将PDF文件中的页面图像向左或向右移动?

10
我们有一堆扫描的页面(大约600页),每个PDF查看器都会在右侧边缘显示零边距的图像,但左侧会留出约2英寸的边距。(可能在扫描时使用了错误的设置...)
我们希望打印这些页面,最好是作为小册子。是否有一种方法可以永久地将所有页面图像向中心移动,并使PDF以更令人愉快的方式显示这些页面?Ghostscript可以吗?是否可以通过某些其他方法来执行此操作,例如利用某些PDF处理库进行编程处理?

这不是一个编程问题,将其移动到SuperUser会更有益。 - Robino
@Robino 对不起,难道后置语言不是一种编程语言吗? - ebyrob
@ebyrob 的目标是以特定的方式修改 PDF。虽然可以使用编程语言来解决问题,但这并不涉及编程。 - Robino
1
按照这个逻辑,登上月球与轨道力学无关。另外,PDF(虽然经过压缩和混淆)基本上也是一种编程语言。我们当然不会期望用户比程序员更好地理解*.doc格式。 - ebyrob
2个回答

13
如果你不想编写自己的程序代码(如Nikolaus所建议的那样),而是使用Ghostscript命令行,你需要了解以下3点:
  1. PostScript有一个setpagedevice运算符,它接受一个PageOffset参数;
  2. 如果您在命令行中使用-c ...,Ghostscript会处理PostScript代码片段;
  3. 即使是直接的PDF => PDF转换,Ghostscript也可以评估和应用(某些)PostScript代码。
现在尝试使用以下命令行将所有页面图像向左移动1英寸(== 72pt):
gswin32c.exe ^
  -sDEVICE=pdfwrite ^
  -o c:/path/to/output/pdf-shifted-by-1-inch-to-left.pdf ^
  -dPDFSETTINGS=/prepress ^
  -c "<</PageOffset [-72 0]>> setpagedevice" ^
  -f c:/path/to/input/pdf-original.pdf

(我加入了-dPDFSETTINGS=/prepress以确保不会损失扫描图片的质量...)


我现在遇到了一个新问题。它与字体提取有关。我将另外发一个问题来询问这个。 - simplybest55
@社区:不需要--Ghostscript不需要反斜杠而不是正斜杠。您可以保持它们不变,它仍然可以正常工作。(换成反斜杠也没有关系...但是,对于某些版本,您可能需要改为双重反斜杠...)而且,不需要将连字符(-)更改为正斜杠(/)--这甚至可能会有害!我会撤销您的修改,抱歉! - Kurt Pfeifle
我在启动该命令时遇到了错误 **** 无法打开初始设备,退出。 有任何想法吗? - Stéphane
@Stéphane:你的“-o…”参数是否指向一个你没有写入权限的输出目录? - Kurt Pfeifle
嗯,那是/tmp指向的...无论如何,我最终使用了convert命令,但它并不完美。我还修改了原始的odt文档以添加边距。谢谢。 - Stéphane

3
你可以使用iText来移动、缩放或裁剪PDF页面。
你需要为源文件定义一个PdfReader,为目标文件定义一个Document,然后遍历Reader中的页面,在Document中创建一个新页面,并将sourcePage作为模板添加到新页面中(在任何想要的位置进行移动、缩放等操作)。
    PdfReader reader = new PdfReader( input );
    int n = reader.getNumberOfPages();

    Rectangle psize = reader.getPageSize(1);
    float width = psize.getHeight();
    float height = psize.getWidth();

    Document document = new Document(new Rectangle(height, width));
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream( output ));

    document.open();

    PdfContentByte cb = writer.getDirectContent();

    int i = 0;
    while (i < n) {
        i++;
        document.newPage();
        PdfImportedPage page = writer.getImportedPage(reader, i);
        cb.addTemplate(page, factor, 0, 0, factor, left, down);
    }

    document.close();

不错且功能强大的方法。与此同时,我将选择在https://github.com/LibrePDF/OpenPDF中免费获取。 - Stephan Herrmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接