裁剪PDF并添加边距

3
我有一个CropBox尺寸为6英寸宽x 9英寸高的PDF文件。我需要将它添加到标准的信纸大小的PDF文件中。如果我改变CropBox尺寸,那么裁剪标记就会变得可见。所以理想情况下,我希望能够裁剪出页面上可见的部分,然后填充两侧,使总高度和宽度达到信纸大小。
使用PDFBox或其他Java类是否可以实现这一点?

除了更改裁剪框,您还可以在每个页面的内容流前面添加一个沿着当前裁剪框边界的剪切路径。 - mkl
@mkl 我应该在这里使用哪个类?这是 PDPage 下的某个东西吗? - Jordan Reiter
微笑 这就是为什么我将其作为评论而不是答案。我知道在 PDF 方面添加剪切路径可能是一种解决方案,但我对 PDFBox 不太了解,因此无法轻易地说出如何在 PDFBox 中实现。 - mkl
3个回答

3
你解决了你的问题吗?这个星期我面对着同样的情况。
我有一个标准的信纸大小(8.5" x 11")的PDF A文件,其中包含页眉、页脚和表单。由于我无法控制PDF A的生成,所以页眉和页脚有点混乱,需要删除它们。我的第一个尝试是将表单提取到一个框中(任何类型的框都可以),然后将其导出为新的PDF页面。问题是,我的新框的大小是一定的(假设为6"x7"),并且经过对文档的彻底研究,我无法找到一种将其嵌入到8.5" x 11"的PDF B中的方法;输出的PDF大小与我的框一样大小。所有的情况要么导致正确大小的空白PDF文件,要么导致大小错误的包含表单的PDF文件。
然后我别无选择,只能使用另一种方法。虽然不太干净,但是在使用PDF时,黑魔法和变通方法是主要话题。我只是保留了原始的PDF A文件,并清空了所有不想要的部分。也就是说,我创建了矩形,填充了白色,并覆盖了我想要隐藏的部分。结果是,我得到了一个正确尺寸的PDF文件,只包含我的表单。太棒了!从技术上讲,页眉和页脚仍然存在于页面中,没有办法真正删除它们;我只能将它们隐藏起来(只要你没有隐藏敏感数据,这对最终用户没有任何影响)。
我知道你的问题是两年前提交的,但是我很难在网上找到一个合适的答案,所以我想回馈社区,并希望我能帮助未来的开发人员节省一些时间。如果你确实找到了一种提取框并将其嵌入标准尺寸页面的方法,请发布你的答案!
顺便说一下,这是我的代码:
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;

import java.awt.Color;
import java.io.*;
import java.util.List;

// This code doesn't actually extract PDF elements per say
// It fills 2 rectangles in white to hide the header and the footer of our PDF page
public class ex {

    // Arbitrary values obtained in a very obscure way
    static int PAGE_WIDTH = 615;
    static int PAGE_HEIGHT = 815;

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException, COSVisitorException {

        File inputFile = new File("C:\\input.pdf");
        File outputFile = new File("C:\\output.pdf");

        PDDocument inputDoc = PDDocument.load(inputFile);
        PDDocument outputDoc = new PDDocument();

        List<PDPage> pages = inputDoc.getDocumentCatalog().getAllPages();

        PDPageContentStream pageCS = null;

        // Lets paint our pages white !
        for (PDPage page : pages) {
            pageCS = new PDPageContentStream(inputDoc, page, true, false);
            pageCS.setNonStrokingColor(Color.white);
            // Top rectangle
            pageCS.fillRect(0, 0, PAGE_WIDTH, 30);
            // Bottom rectangle
            pageCS.fillRect(0, PAGE_HEIGHT-30, PAGE_WIDTH, 30);
            pageCS.close();
            outputDoc.addPage(page);
        }

        // Save to file
        outputFile.delete();
        outputDoc.save(outputFile);

        // Wait until the end to close all documents, or else you get an error
        inputDoc.close();
        outputDoc.close();
    }
}

2

我稍微修改了John的答案,也许这会帮助某些人。

我已经改变了循环,创建一个新的矩形,具有所需的尺寸。然后将矩形设置到页面上,然后添加到新文档中。我使用这个代码片段来裁剪长扫描文档中的黑色边框。

请注意,这将改变页面的大小。

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;


import java.io.File;
import java.io.IOException;
import java.util.List;

public class Main {


    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException, COSVisitorException {

        File inputFile = new File("/path/to/your/file");
        File outputFile = new File("/path/to/your/file");

        PDDocument inputDoc = PDDocument.load(inputFile);
        PDDocument outputDoc = new PDDocument();

        List<PDPage> pages = inputDoc.getDocumentCatalog().getAllPages();

        // Lets paint our pages white !
        for (PDPage page : pages) {
            PDRectangle rectangle=new PDRectangle();
            rectangle.setLowerLeftX(0);
            rectangle.setLowerLeftY(0);
            rectangle.setUpperRightX(500);
            rectangle.setUpperRightY(680);

            page.setMediaBox(rectangle);
            page.setCropBox(rectangle);
            outputDoc.addPage(page);
        }

        // Save to file
//        outputFile.delete();
        outputDoc.save(outputFile);

        // Wait until the end to close all documents, or else you get an error
        inputDoc.close();
        outputDoc.close();
    }
}

1
除了在PDPage构造函数中添加矩形外,您还可以将CropBox设置为任何大小:
PDRectangle box = new PDRectangle(pageWidth, pageHeight);
page.setMediaBox(box); // MediaBox > BleedBox > TrimBox/CropBox

你的回答与问题有何关联?特别是,这如何使得裁切标记不可见? - mkl
你的评论和我的回答有什么关系?这个问题是我在寻找类似问题时遇到的。未来的访问者可能会觉得它很有用。至少在pdfbox的sdk 2.x中,我没有裁剪标记。 - Baked Inhalf
“我没有裁切标记,至少在pdfbox的sdk 2.x版本中没有。”这仅仅意味着你没有带有裁切标记的PDF文件。特别是放大媒体和裁剪框,可以使之前隐藏在框外的内容变得可见。这就是OP的问题所在。在您的使用案例中,似乎从未必须处理此类PDF文件。 - mkl
OP在4年前被问到了!我的贡献是为了那些可能遇到裁剪框问题的新访客,因为这与之密切相关。讨论结束 :) - Baked Inhalf
你似乎误解了Stack Overflow的格式。它是一个问答格式。相关的内容可能会作为评论或附加在主题回答后面的PS发布。 - mkl
显示剩余2条评论

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