2015-01-05 2 views
2

iText에서 생성 한 byte[]에서 가져온 pdf 파일이 있습니다. 서명 하드웨어에 보내야합니다.Itext에서 변환 PDF 바이트 배열을 다중 페이지 TIFF 파일

Java 프린터 드라이버와의 일부 비 호환성으로 인해 PDF를 직접 보낼 수 없으므로 이전에 이미지로 변환해야합니다. 나는 각 PDF 페이지를 jpg 파일로 변환하는데 성공했지만, 고객은 솔루션의 원인 시그니처가 모든 문서에있는 것이 아니라 개별 페이지에서만 나타나는 것을 좋아합니다.

내가 어떤 자유 라이브러리를 찾을 수없는 것, 나는 4 단계를하기로 결정 :

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 단계로 multipaged :가 지금은 개인 TIFF의로 변환 List<java.awt.Image> 반복.

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 파일

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

에서 multipaged TIFF를 만들 수 있습니다. 같은 문제가있는 다른 사람에게 도움이되기를 바랍니다.

+0

그대로 PDF에 서명하고 변환 만하는 것이 더 이상적이지 않습니까? – mkl

+0

어떤 줄부터 예외가 있습니까? 'ImageIO.read'? PDFBox에서 내 보낸 JPEG가 없거나 읽을 수없는 것 같습니다. 이것은 루프의 첫 번째 파일이나 나중에 (임의의?) 지점에서 발생합니까? 그렇다면 읽을 수없는 샘플 파일을 첨부하십시오. :-) – haraldK

+0

@mkl 서명 할 장치는 java/system에서 프린터로 볼 수 있습니다. –

답변

4

나는 이전에 같은 문제가있었습니다. 확인 ALLSO Multiple page tif

: 여기 JAI (Java Advance Image)

가 PNG 이미지로 PDF 페이지를 변환 할 수있는 콘데 조각입니다 (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로 변환했습니다.

+0

고마워요! 이제는 다양한 TIFF 파일을 하나의 다중 TIFF 파일로 변환 할 수있었습니다 ... 문제는 이제 PDF에서 TIFF로 변환됩니다 ... –

+0

pdf 페이지를 png로, png를 tiff로 변환하는 데 itext를 사용했습니다. 업데이트 된 답변을보십시오. – Kiki

+0

PDF에서 JPG/PNG 로의 변환이 문제가되지 않습니다. 문제는 PNG/JPG/TIFF, TIFF가 추가 라이브러리가 필요하거나 그렇게하는 것입니다 ... PNG를 PDF/TIFF 형식으로 변환하는 데 성공 했습니까? ?? –

관련 문제