Вы нашли ответ на свой вопрос? На этой неделе я столкнулся с тем же сценарием.
У меня есть стандартный формат письма (8,5 "x 11") PDF A, содержащий заголовок, нижний колонтитул и форму. У меня нет контроля над созданием этого PDF-файла, поэтому верхний и нижний колонтитулы немного грязны, и мне нужно их удалить. Мой первый подход состоял в том, чтобы извлечь форму в ящик (любой тип работы с ящиками), а затем экспортировать его как новую страницу PDF. Проблема в том, что мой новый ящик - это определенный размер (скажем, 6 "x 7"), и после тщательного изучения документов я не смог найти способ вставить его в 8,5 "x 11" PDF B; выходной файл 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();
}
}
В дополнение к изменению рамки кадрирования, вы можете предварять потоки содержимого каждого страница с кликированием по текущей границе рамки обрезки. – mkl
@mkl какой класс я буду использовать здесь? Это что-то под PDPage? –
* Улыбка * Вот почему я сделал комментарий, а не ответ. Я знаю, что добавление обтравочного контура будет решением PDF-мудрым, но я недостаточно осведомлен о PDFBox и поэтому не могу легко сказать, как это сделать в PDFBox. – mkl