4

署名ハードウェアに送信する必要がある pdf ファイル ( byte[]iText によって生成されたものから取得) があります。

Javaプリンタードライバーとの互換性がないため、PDFを直接送信できないため、事前に画像に変換する必要があります。各 PDF ページを jpg ファイルに変換することに成功しましたが、署名がすべてのドキュメントにあるわけではなく、個々のページにしかないという解決策が顧客に気に入られませんでした。

無料のライブラリが見つからなかったので、次の 4 つの手順で作成することにしました。

STEP1 : itextで PDF を生成し、それを永続化します。

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

STEP 2 : マルチページの PDF から 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 ++;
    }

STEP 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