2013-05-17 4 views
1

У меня есть PDF с размером CropBox размером 6 "широкий x 9". Мне нужно добавить его в стандартный PDF-формат. Если я изменил размер CropBox, то обрезные метки станут видимыми. Поэтому идеально то, что я хотел бы сделать, это вырезать только видимую часть страницы, а затем наложить боковые стороны так, чтобы общая высота и ширина были буквами.Crop PDF & add margin

Возможно ли это использование PDFBox или другого класса Java?

+0

В дополнение к изменению рамки кадрирования, вы можете предварять потоки содержимого каждого страница с кликированием по текущей границе рамки обрезки. – mkl

+0

@mkl какой класс я буду использовать здесь? Это что-то под PDPage? –

+0

* Улыбка * Вот почему я сделал комментарий, а не ответ. Я знаю, что добавление обтравочного контура будет решением PDF-мудрым, но я недостаточно осведомлен о PDFBox и поэтому не могу легко сказать, как это сделать в PDFBox. – mkl

ответ

2

Вы нашли ответ на свой вопрос? На этой неделе я столкнулся с тем же сценарием.

У меня есть стандартный формат письма (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(); 
    } 
} 
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(); 
    } 
} 
0

Помимо добавления прямоугольник в конструктор PDPage вы можете сделать это сделать установить CropBox до любого размера:

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

как ваш ответ относится к вопросу? В частности, как это делает невидимые * cropmarks * невидимыми? – mkl

+0

как ваш комментарий относится к моему ответу?этот вопрос возник, когда я искал аналогичную проблему. будущие посетители могут найти это полезным. У меня нет обрезки, по крайней мере, не с sdk 2.x из pdfbox –

+0

* «У меня нет обводки, по крайней мере, не с sdk 2.x из pdfbox» * - это просто означает, что у вас нет файлов PDF с отметками обрезки. Расширяющиеся ящики, в частности медиа и обрезка, могут создавать видимые вещи, которые раньше были скрыты вне коробки. И это была проблема ОП. В ваших случаях использования вам просто не приходилось иметь дело с такими PDF-файлами. – mkl