2014-11-08 3 views
2

Я создал документ с iText, и я хотел бы преобразовать этот документ (который сохраняется как файл PDF) в изображение. Для этого я использую PDFBox, который хочет использовать PDDocument. Я использую следующий код:PDFBox: конвертировать документ в PDDocument

@SuppressWarnings("unchecked") 
public static Image convertPDFtoImage(String filename) { 

    Image convertedImage = null; 

    try { 

     File sourceFile = new File(filename); 
     if (sourceFile.exists()) { 

      PDDocument document = PDDocument.load(filename); 
      List<PDPage> list = document.getDocumentCatalog().getAllPages(); 
      PDPage page = list.get(0); 

      BufferedImage image = page.convertToImage(); 

      //Part where image gets scaled to a smaller one 
      int width = image.getWidth()*2/3; 
      int height = image.getHeight()*2/3; 
      BufferedImage scaledImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
      Graphics2D graphics2D = scaledImage.createGraphics(); 
      graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
      graphics2D.drawImage(image, 0, 0, width, height, null); 
      graphics2D.dispose(); 

      convertedImage = SwingFXUtils.toFXImage(scaledImage, null); 

      document.close(); 

     } else { 
      System.err.println(sourceFile.getName() +" File not exists"); 
     } 

    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return convertedImage; 
} 

На данный момент я загружаю документ из сохраненного файла. Но я хотел бы выполнить это внутри внутри Java.

Так что мой вопрос: как я могу конвертировать документ в PDDocument?

Любая помощь очень ценится!

ответ

1

Что вы можете сделать, так это сохранить файл itext в ByteArrayOutputStream, преобразовать его в ByteArrayInputStream.

Document document = new Document(); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PdfWriter writer = PdfWriter.getInstance(document, baos); 
document.open(); 
document.add(new Paragraph("Hello World!")); 
document.close(); 
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
PDDocument document = PDDocument.load(bais); 

Конечно, файл не должен быть слишком большим или проблемы с памятью.

+0

Спасибо за ваш ответ! Теперь я использую это для сохранения PDF-файла с помощью iText: 'PdfWriter writer = PdfWriter.getInstance (документ, новый FileOutputStream (pdfName));'. Могу ли я легко изменить это с помощью вашего ответа, заменив 'new FileOutputStream()' на 'new ByteArrayOutputStream();'? – bashoogzaad

+0

Я пробовал выше, и это сработало, поэтому вы можете обновить приведенный выше ответ! – bashoogzaad

+0

Спасибо :-) Еще одна вещь: масштабирование действительно не нужно. Если вы знаете, что предпочитаете 2/3 рендеринга PDFBox по умолчанию, вы можете использовать меньшие dpi. Пунктиром метода без параметров является 96. Таким образом, 96 * 2/3 = 64. Поэтому сделайте этот вызов с помощью PDFBox: page.convertToImage (BufferedImage.TYPE_INT_RGB, 64); –

Смежные вопросы