Преобразование из массива байтов Itext PDF в многостраничный файл TIFF

76
3

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

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

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

STEP1: сгенерируйте PDF с помощью itext и сохраните его.

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

ШАГ 2: преобразование из PDF, перемноженное в 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: создать многостраничный 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.");

СДЕЛАННЫЙ. Надеюсь, что это поможет кому-то еще с той же проблемой.

спросил(а) 2021-01-25T21:18:02+03:00 5 месяцев назад
1
Решение
89

Некоторое время назад у меня была такая же проблема. Я получил большую помощь отсюда: Несколько страниц tif

Allso check: JAI (Java Advance Image)

Вот фрагмент conde для преобразования 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.

ответил(а) 2021-01-25T21:18:02+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема