我有一个裁剪框大小为 6" 宽 x 9" 高的 PDF。我需要将它添加到标准字母大小的 PDF 中。如果我更改 CropBox 大小,则裁剪标记变得可见。所以理想情况下,我想做的是只裁剪页面的可见部分,然后填充两侧,使总高度和宽度为字母大小。
这可以使用 PDFBox 或其他 Java 类吗?
我有一个裁剪框大小为 6" 宽 x 9" 高的 PDF。我需要将它添加到标准字母大小的 PDF 中。如果我更改 CropBox 大小,则裁剪标记变得可见。所以理想情况下,我想做的是只裁剪页面的可见部分,然后填充两侧,使总高度和宽度为字母大小。
这可以使用 PDFBox 或其他 Java 类吗?
您找到问题的答案了吗?本周我一直面临同样的情况。
我有一个标准字母大小 (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();
}
}
我已经采用了约翰的回答,也许这会对某人有所帮助。
我已经更改了循环以创建一个具有所需尺寸的新矩形。然后将矩形设置为页面,然后添加到新文档中。我使用这个片段从长扫描文档中裁剪出黑色边框。
请注意,这将改变页面的大小。
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();
}
}
除了向 PDPage 构造函数添加一个矩形之外,您还可以将 CropBox 设置为任意大小:
PDRectangle box = new PDRectangle(pageWidth, pageHeight);
page.setMediaBox(box); // MediaBox > BleedBox > TrimBox/CropBox