从 Itext PDF 字节数组转换为多页 TIFF 文件
Convert from Itext PDF byte array to multipage TIFF file
我有一个 pdf 文件(从 byte[]
生成的 iText 获得)我需要发送到签名硬件。
由于与java打印机驱动程序不兼容,我无法直接发送PDF,所以我需要先将其转换为图像。我已成功将每个 PDF 页面转换为 jpg 文件,但客户不喜欢解决方案,因为签名不在所有文档中,仅在个别页面中。
由于我没有找到任何免费图书馆,我决定分四步完成:
第 1 步:使用 itext 生成 PDF 并保存它。
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.");
完成。希望对遇到同样问题的其他人有所帮助。
我刚才遇到了同样的问题。我从这里得到了很多帮助:
Multiple page tif
还要检查:
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。
我有一个 pdf 文件(从 byte[]
生成的 iText 获得)我需要发送到签名硬件。
由于与java打印机驱动程序不兼容,我无法直接发送PDF,所以我需要先将其转换为图像。我已成功将每个 PDF 页面转换为 jpg 文件,但客户不喜欢解决方案,因为签名不在所有文档中,仅在个别页面中。
由于我没有找到任何免费图书馆,我决定分四步完成:
第 1 步:使用 itext 生成 PDF 并保存它。
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.");
完成。希望对遇到同样问题的其他人有所帮助。
我刚才遇到了同样的问题。我从这里得到了很多帮助: Multiple page tif
还要检查: 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。