Обрезать 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
Другие вопросы по тегам