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();
}
}
오류. 죄송합니다. 이제 C#이 아니라 java로 프로그래밍 중입니다. – pwizzle