2015-01-05 6 views
2

У меня есть файл pdf (полученный из byte[], сгенерированный iText) Мне нужно отправить оборудование подписи.Преобразование из Itext PDF массив байтов в многостраничный файл TIFF

Из-за некоторой несовместимости с драйвером java-принтера я не могу отправить PDF напрямую, поэтому мне нужно преобразовать его в изображения раньше. Мне удалось преобразовать каждую страницу PDF в файл jpg, но клиент не любит, чтобы сигнатуры решений были не во всем документе, а только на отдельных страницах.

Как я не нашел бесплатную библиотеку, я решил сделать это в четыре этапа:

STEP1: генерировать PDF с IText и сохраняются его.

FileOutputStream fos = new FileOutputStream("tempFile.pdf"); 
fos.write(myByteArray); 
fos.close(); 
fos.flush(); 

ШАГ 2: конвертировать из PDF в multipaged List<java.awt.Image>

List<Image> images = null; 

Ghostscript.getInstance(); // create gs instance 

PDFDocument lDocument = new PDFDocument(); 
lDocument.load(new File("tempFile.pdf")); 

SimpleRenderer renderer = new SimpleRenderer(); 

renderer.setResolution(300); 

try 
{ 
    images = renderer.render(lDocument); 
} 
catch (RendererException | DocumentException e) 
{ 
    e.printStackTrace(); 
} 

Шаг 3: Теперь я перебирать List<java.awt.Image> преобразовать в отдельный TIFF-х.

int filename = 1; 

    TIFFEncodeParam params = new TIFFEncodeParam(); 

    Iterator<Image> imageIterator = images.iterator(); 

    while (imageIterator.hasNext()) { 
     BufferedImage image = (BufferedImage) imageIterator.next(); 

     FileOutputStream os = new FileOutputStream(/*outputDir + */ filename + ".tif"); 

     JAI.create("encode", image , os, "TIFF", params); 

     filename ++; 
    } 

ШАГ 4: создать multipaged TIFF из различных отдельных TIFF файлов

BufferedImage image[] = new BufferedImage[paginas]; 
    for (int i = 0; i < paginas; i++) { 
     SeekableStream ss = new FileSeekableStream((i + 1) + ".tif"); 
     ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null); 
     PlanarImage pi = new NullOpImage(decoder.decodeAsRenderedImage(0),null,null,OpImage.OP_IO_BOUND); 
     image[i] = pi.getAsBufferedImage(); 
     ss.close(); 
    } 

    TIFFEncodeParam params = new TIFFEncodeParam(); 
    params.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE); 
    OutputStream out = new FileOutputStream(nombre +".tif"); 
    ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params); 
    List <BufferedImage>list = new ArrayList<BufferedImage>(image.length); 

    for (int i = 1; i < image.length; i++) { 
     list.add(image[i]); 
    } 

    params.setExtraImages(list.iterator()); 
    encoder.encode(image[0]); 
    out.close(); 

    System.out.println("Done."); 

DONE. Надеюсь, что это поможет кому-то еще с той же проблемой.

+0

Не имеет смысла подписывать PDF как есть и конвертировать только для печати? – mkl

+0

С какой строки вы получаете исключение? 'ImageIO.read'? Кажется, что ваши экспортированные PDFBox файлы JPEG не найдены или не читаются. Это происходит для первого файла в цикле или в некоторой (случайной?) Точке позже? Если да, попробуйте подключить образец файла, который не читается. :-) – haraldK

+0

@mkl устройство для подписывания просматривается системой java/system в качестве принтера. –

ответ

4

У меня был такой же вопрос некоторое время назад. Я получил много помощи здесь: Multiple page tif

Allso проверить: JAI (Java Advance Image)

Вот Конде врезку для преобразования PDF Количество страниц в формате PNG изображений (с использованием org.apache.pdfbox библиотеки):

PDDocument document = null; 
    document = PDDocument.load(pdf1); 

    int pageNum = document.getNumberOfPages(); 

    PDFImageWriter writer = new PDFImageWriter(); 
    String filename = pdf1.getPath() + "-"; 
    filename = filename.replace(".pdf", ""); 
    writer.writeImage(document, "png", "", 1, Integer.MAX_VALUE, filename); 

    document.close(); 

И после того, как что я преобразовал каждое изображение PNG в TIFF, а затем из нескольких изображений TIFF в один многостраничный TIFF.

+0

Спасибо! Это помогло, теперь я могу конвертировать из разных TIFF-файлов в один многостраничный TIFF ... проблема теперь конвертируется из PDF в TIFF ... –

+0

Я использовал itext для преобразования pdf-страниц в png и от png до tiff. Посмотрите на обновленный ответ. – Kiki

+0

преобразование из PDF в JPG/PNG не является проблемой, проблема заключается в PNG/JPG/PDF в TIFF, поскольку TIFF, похоже, нуждается в дополнительных библиотеках или так ... вам удалось преобразовать PNG в TIFF в itext/pdfbox? ?? –

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