裁剪PDF&添加保证金

时间:2013-05-17 16:48:31

标签: pdf pdfbox pdf-manipulation

我的PDF格式为6“宽x 9”高。我需要将它添加到标准的字母大小的PDF中。如果我更改CropBox大小,则cropmarks变为可见。理想情况下,我想要做的只是裁剪页面的可见部分,然后填充边,使总高度和宽度为字母大小。

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

3 个答案:

答案 0 :(得分:2)

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

我有一个标准的字母大小(8,5" x 11")PDF A,包含页眉,页脚和表格。我无法控制PDF的生成,因此页眉和页脚有点脏,我需要删除它们。我的第一种方法是将表单提取到Box(任何类型的框工作),然后将其导出为新的PDF页面。问题是,我的新Box是一定的大小(让我们说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();
    }
}

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

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

PDRectangle box = new PDRectangle(pageWidth, pageHeight);
page.setMediaBox(box); // MediaBox > BleedBox > TrimBox/CropBox