2013-05-17 7 views
0

У меня есть принтер, который не поддерживает функцию, в которой я нуждаюсь.Java - apache PDFBox две A3 документы для одного A2?

Принтер печатает A2 размер бумаги. Я хотел бы напечатать две страницы размером A3, что будет подходит для одной бумаги, но мой принтер этого не поддерживает.

Я уже назвал поддержку компании, но мне сказали, что мне нужно купить более новую версию, потому что мой принтер не поддерживает эту функцию. (Это очень забавно, потому что даже более старая версия этого принтера поддерживает эту функцию).

Так что я попытался использовать Apache PDFBox, где я могу загрузить свой файл в формате PDF, как это:

File pdfFile = new File(path); 
PDDocument pdfDocument = load(pdfFile); 

Файл Я загруженная размер A3. Я думаю, этого было бы достаточно, если бы я мог получить новый PDDocument с размером бумаги A2. Затем положите мой загруженный pdfFile дважды на бумагу A2.

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

С уважением.

+0

При использовании IText также был вариант, я предложил бы глядя на [NUpTool.java] (http://itextpdf.com/examples/iia.php ? id = 115). С некоторыми незначительными изменениями (вместо того, чтобы масштабировать страницы в целевом документе с размером страницы оригинального документа, вам нужно было бы сохранить масштаб и использовать целевой документ с удвоенным размером страницы оригинала). Я предполагаю, однако, что это возможно с помощью PDFBox. – mkl

ответ

0

Вы можете посмотреть на PageCombinationSample.java, который в соответствии с его JavaDoc делает почти то, что вам нужно:

Этот пример демонстрирует , как объединить несколько страниц в отдельные большие страницы (например два A4 модулей в один модуль A3) с использованием формы XObjects [PDF: 1.6: 4.9].

Форма XObjects - удобный способ представления содержимого несколько раз на нескольких страницах, как шаблонов.

Центральный код:

// 1. Opening the source PDF file... 
File sourceFile = new File(filePath); 

// 2. Instantiate the target PDF file! 
File file = new File(); 

// 3. Source page combination into target file. 
Document document = file.getDocument(); 
Pages pages = document.getPages(); 
int pageIndex = -1; 
PrimitiveComposer composer = null; 
Dimension2D targetPageSize = PageFormat.getSize(SizeEnum.A4); 
for(Page sourcePage : sourceFile.getDocument().getPages()) 
{ 
    pageIndex++; 
    int pageMod = pageIndex % 2; 
    if(pageMod == 0) 
    { 
     if(composer != null) 
     {composer.flush();} 

     // Add a page to the target document! 
     Page page = new Page(
      document, 
      PageFormat.getSize(SizeEnum.A3, OrientationEnum.Landscape) 
     ); // Instantiates the page inside the document context. 
     pages.add(page); // Puts the page in the pages collection. 
     // Create a composer for the target content stream! 
     composer = new PrimitiveComposer(page); 
    } 

    // Add the form to the target page! 
    composer.showXObject(
     sourcePage.toXObject(document), // Converts the source page into a form inside the target document. 
     new Point2D.Double(targetPageSize.getWidth() * pageMod, 0), 
     targetPageSize, 
     XAlignmentEnum.Left, 
     YAlignmentEnum.Top, 
     0 
    ); 
} 
composer.flush(); 

// 4. Serialize the PDF file! 
serialize(file, "Page combination", "combining multiple pages into single bigger ones", "page combination"); 

// 5. Closing the PDF file... 
sourceFile.close(); 
+0

В примечании: Это использует pdfclown, но не файл pdfbox, как задано в вопросе. Получил меня на короткое мгновение, когда я искал соответствующие классы в pdfbox и не нашел их ... Поэтому ответ может быть подходящим для оригинального плаката, но не для людей, у которых уже есть много кода в зависимости от pdfbox. – cello

+0

@cello О, ты прав. На самом деле я понятия не имею, почему я обратился к PdfClown для примера ... особенно после того, как я упомянул iText в комментарии к исходному вопросу ... – mkl