10

我们有一堆扫描的页面(大约 600 个),每个 PDF 查看器都会在右侧边缘显示零边距的图像,但在左边大约 2 英寸的边距。(大概在扫描时,使用了错误的设置......)

我们想打印这些页面,最好是作为小册子。有没有办法将所有页面图像永久地移向中心并让 PDF 以更令人愉悦的方式显示这些页面?Ghostscript 可以做到这一点吗?可以使用其他方法来做到这一点,例如在某些 PDF 处理库的帮助下以编程方式吗?

4

2 回答 2

11

如果您不想编写自己的程序代码(如 Nikolaus 建议的那样),而是使用 Ghostscript 命令行,您需要了解 3 件事:

  1. PostScript 有一个setpagedevice带参数的运算符PageOffset
  2. 如果您在命令行中传递 PostScript 代码片段,Ghostscript 将处理它们-c ...
  3. Ghostscript 可以评估和应用(一些)PostScript代码,即使是直接PDF=>PDF转换。

现在尝试使用此命令行将所有页面图像向左移动 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我为了不丢失扫描的任何图片质量而放入...)

于 2010-08-14T13:59:09.670 回答
1

您可以使用 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();
于 2010-08-10T10:19:50.100 回答