2016-08-15 12 views
0

У меня есть документ в формате pdf с одной или несколькими страницами A4. В результате pdf-документ должен быть бумагой A3, где каждая страница содержит две из первой (нечетные слева, даже с правой стороны). Я уже получил это, чтобы сделать страницы А4 в изображениях, и нечетные страницы успешно помещены в первые части новых страниц A3, но я не могу получить четные страницы.PDFBox: поместите две страницы А4 на один A3

 
public class CreateLandscapePDF {

public void renderPDF(File inputFile, String output) { PDDocument docIn = null; PDDocument docOut = null; float width = 0; float height = 0; float posX = 0; float posY = 0; try { docIn = PDDocument.load(inputFile); PDFRenderer pdfRenderer = new PDFRenderer(docIn); docOut = new PDDocument(); int pageCounter = 0; for(PDPage pageIn : docIn.getPages()) { pageIn.setRotation(270); BufferedImage bufferedImage = pdfRenderer.renderImage(pageCounter); width = bufferedImage.getHeight(); height = bufferedImage.getWidth(); PDPage pageOut = new PDPage(PDRectangle.A3); PDImageXObject image = LosslessFactory.createFromImage(docOut, bufferedImage); PDPageContentStream contentStream = new PDPageContentStream(docOut, pageOut, AppendMode.APPEND, true, true); if((pageCounter & 1) == 0) { pageOut.setRotation(90); docOut.addPage(pageOut); posX = 0; posY = 0; } else { posX = 0; posY = width; } contentStream.drawImage(image, posX, posY); contentStream.close(); bufferedImage.flush(); pageCounter++; } docOut.save(output + "\\LandscapeTest.pdf"); docOut.close(); docIn.close(); } catch(IOException io) { io.printStackTrace(); } }

}

Я использую Apache PDFBox 2.0.2 (pdfbox-приложение-2.0.2.jar)

+0

Почему вы создаете страницу A3 для каждой страницы источника? Было бы логично создать его только каждые 2 страницы. Вы добавляете его каждые 2 страницы. Btw добавление страницы должно быть сделано после закрытия контента, но не раньше. –

+1

Btw, шаги для более продвинутого решения можно найти здесь: https://stackoverflow.com/questions/26256546/how-to-insert-an-pdpage-within-another-pdpage-with-pdfbox –

+0

@TilmanHausherr Вы могли бы хотите сделать это [закрыть/дублировать] (http://stackoverflow.com/questions/38952984/pdfbox-put-two-a4-pages-on-one-a3#). Кстати, интересуется [PDFBox stackoverflow documentation] (http://stackoverflow.com/documentation/pdfbox)? – mkl

ответ

0

Большое спасибо за вашу помощь и ссылку на другой вопрос - я думаю, что я его уже прочитал, но еще не смог использовать код. Но, наконец, PDFClown выполнил эту работу, хотя я думаю, что не очень приятно использовать PDFBox и PDFClown в той же программе. В любом случае, вот мой рабочий код, чтобы объединить страницы А4 на бумаге A3.

public class CombinePages { 

public void run(String input, String output) { 
    try { 
     Document source = new File(input).getDocument(); 
     Pages sourcePages = source.getPages(); 

     Document target = new File().getDocument(); 
     Page targetPage = null; 

     int pageCounter = 0; 
     double moveByX = .0; 
     for(Page sourcePage : source.getPages()) { 

      if((pageCounter & 1) == 0) { 
       //even page gets a blank page 
       targetPage = new Page(target); 
       target.setPageSize(PageFormat.getSize(PageFormat.SizeEnum.A3, PageFormat.OrientationEnum.Landscape)); 
       target.getPages().add(targetPage); 
       moveByX = .0; 
      } else { 
       moveByX = .50; 
      } 

      //get content from source page 
      XObject xObject = sourcePages.get(pageCounter).toXObject(target); 
      PrimitiveComposer composer = new PrimitiveComposer(targetPage); 
      Dimension2D targetSize = targetPage.getSize(); 
      Dimension2D sourceSize = xObject.getSize(); 
      composer.showXObject(xObject, new Point2D.Double(targetSize.getWidth() * moveByX, targetSize.getHeight() * .0), new Dimension(sourceSize.getWidth(), sourceSize.getHeight()), XAlignmentEnum.Left, YAlignmentEnum.Top, 0); 
      composer.flush(); 
      pageCounter++; 
     } 
     target.getFile().save(output + "\\CombinePages.pdf", SerializationModeEnum.Standard); 
     source.getFile().close(); 
    } catch (FileNotFoundException fnf) { 
     log.error(fnf); 
    } catch (IOException io) { 
     log.error(io); 
    } 

} 

}

+1

Вы можете взглянуть на образец SuperimposePage.java в пакете примеров PDFBox. Это показывает, как «монтировать» PDF на другой. –