2

我有一个裁剪框大小为 6" 宽 x 9" 高的 PDF。我需要将它添加到标准字母大小的 PDF 中。如果我更改 CropBox 大小,则裁剪标记变得可见。所以理想情况下,我想做的是只裁剪页面的可见部分,然后填充两侧,使总高度和宽度为字母大小。

这可以使用 PDFBox 或其他 Java 类吗?

4

3 回答 3

2

您找到问题的答案了吗?本周我一直面临同样的情况。

我有一个标准字母大小 (8,5" x 11") PDF A,包含页眉、页脚和表单。我无法控制该 PDF 的生成,因此页眉和页脚有点脏,我需要删除它们。我的第一种方法是将表单提取到 Box 中(任何类型的框都可以),然后将其导出为新的 PDF 页面。问题是,我的新盒子有一定的尺寸(比如说 6" x 7"),在对文档进行深入研究后,我无法找到将其嵌入 8,5" x 11" PDF B 的方法;输出的 PDF 与我的 Box 大小相同。所有场景要么导致正确大小的空白 PDF 文件,要么导致包含我的表单但尺寸错误的 PDF。

然后我别无选择,只能使用另一种方法。它不是很干净,但是,嘿,在使用 PDF 时,黑魔法和变通方法是主要话题。我只是保留了原始 PDF A,并删除了所有不需要的部分。这意味着,我创建了矩形,用白色填充它们,并覆盖了我想要隐藏的部分。结果是一个正确尺寸的 PDF 文件,仅包含我的表单。万岁!从技术上讲,页眉和页脚仍然存在于页面中,无法真正删除它们;我只能隐藏它们(只要您不隐藏敏感数据,这对最终用户没有任何影响)。

我知道您的问题是 2 年前提交的,但我很难在网上找到我的问题的正确答案,所以我回馈社区,希望我能帮助未来的开发人员节省一些时间。如果您确实找到了一种提取框并将其嵌入标准尺寸页面的方法,请发布您的答案!

顺便说一下,这是我的代码:

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();
    }
}
于 2015-10-02T14:57:41.710 回答
1

我已经采用了约翰的回答,也许这会对某人有所帮助。

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

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

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();
    }
}
于 2016-04-28T18:18:23.063 回答
0

除了向 PDPage 构造函数添加一个矩形之外,您还可以将 CropBox 设置为任意大小:

PDRectangle box = new PDRectangle(pageWidth, pageHeight);
page.setMediaBox(box); // MediaBox > BleedBox > TrimBox/CropBox
于 2017-12-12T15:17:17.997 回答