2011-09-16 3 views
1

PDF로 이미지를 축소하기 위해 스캔 한 PDF를 축소하기 위해 더 작은 단색 (2 색 B & W) 버전으로 대체하는 유틸리티를 개발 중입니다. 아래 프로그램 (전체)은 현재 큰 .png 파일로 모든 이미지를 in 디렉토리로 내보내고 사용자가이 파일을 가져 와서 필요한 이미지 조작을 수행하고 결과를 동일한 이름으로 복사하지만 현재는 .jb2 확장자, out 디렉토리 이 프로그램을 다시 실행하면 원본 이미지를 대체하여 수정 된 파일을 스트림으로 다시 복사해야합니다.iText를 통해 PDF로 JBIG2DECODE 스트림으로 흑백 이미지를 추가하는 방법

말할 필요도없이, 작동하지 않습니다. 스트림 헤더는 모두 정확하지만 스트림이 올바르게 JBIG2DEOCDE 형식을 따르도록 압축되지 않았으므로 수정 된 이미지가 판독기에 표시되지 않습니다. 기존 스트림을 대체 할 것이므로 document.add(Image)을 사용할 수 없으므로이 모든 스트림을 수동으로 처리해야합니다. 이 작업을 위해 iText 시설이 누락되었을 수 있지만 이러한 이미지를 스트림으로 가져 오려면 어떻게해야합니까?

형식은 .jb2 형식이지만 iText는이 형식을 사용합니다. 그러나 마찬가지로 더 일반적인 형식 인 .gif을 쉽게 사용할 수 있습니다. 중요한 부분은 B & W 2 색 팔레트가 포함 된 이미지를 PDF에 넣고 흑백 텍스트 이미지에 적합한 압축 형식을 사용하고 싶습니다 (JBIG2를 선호하지만 CCITT 3 또는 4 또는 RLE는 저를 위해 너무 일하십시오). 목표는 최대 공간 절약입니다. 처리 시간 요구 사항이 없습니다.

다른 방법으로, 내가하려는 일을 수행 할 좋은 유틸리티 프로그램을 아는 사람도 있습니다. PDF 파일의 기존 이미지를 대체 파일 (대체 파일은 외부 응용 프로그램에서 처리 할 수 ​​있도록 만들어야 함)로 바꾸고 싶습니다. 대체 파일을 압축하는 방법을 제어해야합니다. 또한 배치 모드 처리에 적합한 방식으로 수행해야합니다. 일반적으로 페이지 당 수백 개의 페이지와 한 개의 이미지가있는 PDF를 처리하기 때문입니다. 내 PDF 크기를 줄이려고하지만 압축을 완전히 제어해야하며 모든 손실 압축을 직접 수행하고 싶습니다. Acrobat의 Reduce Size PDF 기능은 항상 내 이미지를 망가 뜨립니다.

public class Test { 
    public static void main(String[] args) throws IOException, DocumentException 
    { 
     PdfReader pdf = new PdfReader("data\\in.pdf"); 
     int n = pdf.getXrefSize(); 
     for (int i = 0; i < n; i++) { 
      PdfObject object = pdf.getPdfObject(i); 
      if (object == null || !object.isStream()) continue; 
      PRStream stream = (PRStream)object; 
      if (!stream.contains(PdfName.WIDTH)) continue; 
      PdfImageObject image = new PdfImageObject(stream); 
      BufferedImage bi = image.getBufferedImage(); 
      if (bi == null) continue; 
      File in = new File("data\\in\\" + i + ".png"); 
      if (!in.exists()) { 
       ImageIO.write(bi, "png", in); 
      } 
      File out = new File("data\\out\\" + i + ".jb2"); 
      if (!out.exists()) continue; 
      Image img = Image.getInstance("data\\out\\" + i + ".jb2"); 
      byte[] data = new byte[(int)out.length()]; 
      new FileInputStream(out).read(data); 
      stream.clear(); 
      stream.setData(data, false, PRStream.NO_COMPRESSION); 
      stream.put(PdfName.TYPE, PdfName.XOBJECT); 
      stream.put(PdfName.SUBTYPE, PdfName.IMAGE); 
      stream.put(PdfName.FILTER, PdfName.JBIG2DECODE); 
      stream.put(PdfName.WIDTH, new PdfNumber((int)img.getWidth())); 
      stream.put(PdfName.HEIGHT, new PdfNumber((int)img.getHeight())); 
      stream.put(PdfName.BITSPERCOMPONENT, new PdfNumber(1)); 
      stream.put(PdfName.COLORSPACE, PdfName.DEVICEGRAY); 
     } 
     new PdfStamper(pdf, new FileOutputStream("data\\out.pdf")).close(); 
    } 
} 

답변

0

나는 당신을 도울 수있는 library 코드 플렉스에 서면으로 작성했습니다.

jbig2를 사용하여 스캔 한 PDF를 OCRing 및 압축하는 데 사용되며 pdf에 추가되기 전에 이미지에서 일부 처리를 수행 할 대리인이 있습니다.

+0

오류. 죄송합니다. 이제 C#이 아니라 java로 프로그래밍 중입니다. – pwizzle