Обрезать PDF и добавить поля
У меня есть PDF с размером CropBox 6 дюймов в ширину и 9 дюймов в высоту. Мне нужно добавить его в стандартный PDF-файл размером с букву. Если я изменю размер CropBox, то метки обреза станут видимыми. Поэтому в идеале я хотел бы обрезать только видимую часть страницы, а затем дополнить боковые стороны, чтобы общая высота и ширина были размером с букву.
Возможно ли это с помощью PDFBox или другого Java-класса?
3 ответа
Вы нашли ответ на свою проблему? Я столкнулся с тем же сценарием на этой неделе.
У меня есть стандартный формат PDF A (8,5" x 11"), содержащий заголовок, нижний колонтитул и форму. Я не контролирую генерацию этого PDF, поэтому верхний и нижний колонтитулы немного грязные, и мне нужно их удалить. Мой первый подход состоял в том, чтобы извлечь форму в Box (любой тип работы с Box), а затем экспортировать ее в виде новой страницы PDF. Проблема в том, что мой новый ящик имеет определенный размер (скажем, 6" x 7"), и после тщательного изучения документов я не смог найти способ встроить его в PDF размером 8,5 "x 11"; выходной PDF был того же размера, что и моя коробка. Все сценарии приводили либо к пустому файлу 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