У меня есть файл 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. Надеюсь, что это поможет кому-то еще с той же проблемой.
Не имеет смысла подписывать PDF как есть и конвертировать только для печати? – mkl
С какой строки вы получаете исключение? 'ImageIO.read'? Кажется, что ваши экспортированные PDFBox файлы JPEG не найдены или не читаются. Это происходит для первого файла в цикле или в некоторой (случайной?) Точке позже? Если да, попробуйте подключить образец файла, который не читается. :-) – haraldK
@mkl устройство для подписывания просматривается системой java/system в качестве принтера. –