当前位置: 首页 > 知识库问答 >
问题:

从Itext PDF字节数组转换为多页TIFF文件

廖永长
2023-03-14

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

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

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

STEP1:使用itext生成PDF并持久化它。

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

步骤2:从PDF多页转换为列表

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:现在我迭代列表

    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.");

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

共有1个答案

李烨
2023-03-14

不久前我也遇到了同样的问题。我从这里得到了很多帮助:多页提示

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。

 类似资料:
  • 问题内容: 我有以下代码,我试图通过测试,但似乎无法理解Java世界中各种编码形式。 我想我的问题是:将任意字节的字节数组转换为Java字符串,然后将同一Java String转换为另一个字节数组的正确方法是什么,该字节数组将具有与原始字节相同的长度和相同的内容数组? 问题答案: 尝试特定的编码: ideone链接

  • 问题内容: 我正在尝试将字节数组转换为ZIP文件。我使用以下代码获取字节: 但是我现在的问题是将字节数组转换回ZIP文件-如何完成? 注意:指定的ZIP包含两个文件。 问题答案: 要从字节中获取内容,可以使用

  • 问题内容: 我有一个接收a的函数,但是我所拥有的a是进行此转换的最佳方法是什么? 我想我可以走很长一段路,然后将其放入字符串并放入字节中,但这听起来很难看,而且我认为还有更好的方法可以做到。 问题答案: 我同意Brainstorm的方法:假设您要传递机器友好的二进制表示形式,请使用该库。OP建议可能会有一些开销。纵观源的实施,我看到它做了一些运行时的决策最大的灵活性。 对?Write()接受一个非

  • 问题内容: 我正在使用JAI加载多页TIFF图像 但是,在最后一行中,我得到了一个运行时错误: 在尝试设置BufferedImage之后,我清除了RenderedImage,因此,如果存在另一种方法,则我不必完全“需要” RenderedImage。 我尝试过: 这给出了ArrayIndexOutOfBoundsException。我不确定为什么op1会精确设置pg1的宽度和高度,但是可能有一个非

  • 问题内容: 我发现了将文件转换为字节数组并将字节数组写入存储中文件的多种方法。 我想要的是转换为字节数组,然后将字节数组转换回。 我不想像以下那样将其写出到存储中: 我想以某种方式执行以下操作: 问题答案: 我认为您误解了班级的真正含义。它只是系统上文件的表示,即文件名,路径等。 您甚至看过该课程的Javadoc 吗?在这里看看, 如果检查它具有的字段或方法或构造函数参数,您会立即得到暗示,它只是

  • 我试图让用户从gallery中选择一幅图像,在imageView中显示它,同时创建同一文件的字节数组。 调试后: 'new File(filepath)'使用有效的文件系统路径执行没有问题。 但是它总是跳过'ByteArrayOutputStream baos=new ByteArrayOutputStream();'到带有java.ioFileNotFoundException的IOExcept