4

byte[]我有一个需要发送到签名硬件的 pdf 文件(从iText 生成的文件中获得)。

由于与java打印机驱动程序不兼容,我无法直接发送PDF,所以我需要先将其转换为图像。我已成功将每个 PDF 页面转换为 jpg 文件,但客户不喜欢解决方案,因为签名不在所有文档中,仅在单个页面中。

由于我还没有找到任何免费库,我决定分四步完成:

STEP1 : 使用 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.");

完毕。希望对有同样问题的其他人有所帮助。

4

1 回答 1

4

不久前我有同样的问题。我从这里得到了很多帮助: Multiple page tif

Allso 检查: JAI(Java 高级图像)

这是将 pdf 页面转换为 png 图像的 conde 片段(使用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。

于 2015-01-05T11:25:43.003 回答