진이의 Developer Story

Apache PDFBOX (pdf to image) 본문

Java/Spring

Apache PDFBOX (pdf to image)

JIN3260 2016. 10. 27. 16:28

파일업로드를 할때 PDF를 업로드할 경우, 이미지 형식으로 변환하여 올려달라는 요청을 받았습니다. (PDF뷰어가 설치되지 않은 PC도 있기 때문에 몇몇 이용자는 볼 수 없다는 이유였습니다.)

 

그런고로 PDF 파일 형식을 이미지로 바꾸는 작업을 하게 되었습니다.

생각보다는 간단하네요.

 

일반적으로 변환을 하게 되면 페이지 당 1개의 이미지 파일이 생성됩니다.

저는 하나의 이미지에 합쳐서 출력했습니다.


MultipartFile file; // 스프링 MultipartFile

/*
 * 파일이 PDF라면 이미지로 변환
 */
if ("application/pdf".equals(file.getContentType())) { // 파일타입이 pdf형식 일 경우, 
	PDDocument document = PDDocument.load(file.getInputStream()); // document 생성
	List<PDPage> pdPages = document.getDocumentCatalog().getAllPages(); // 모든 페이지를 가져와서 List에 담습니다.
	List<BufferedImage> bufferedImages = new ArrayList<BufferedImage>(); // 변환될 이미지 객체를 담을 List 선언
	int width = 0, height = 0; // 병합될 이미지 파일의 너비와 높이 값을 담을 변수
	for (PDPage pdPage : pdPages) { // 한 페이지씩 꺼내와서
		BufferedImage bim = pdPage.convertToImage(BufferedImage.TYPE_INT_RGB, 300); // 이미지로 변환
		bufferedImages.add(bim); // 그리고 이미지 List에 담습니다.

		if (bim.getWidth() > width) width = bim.getWidth(); // 병합될 이미지의 최대 너비를 구합니다.
		height += bim.getHeight(); // 병합될 이미지의 최대 높이를 구합니다.
	}

	BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 병합될 이미지 객체 생성
	Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics(); // 그래픽 객체를 생성하고,

	graphics.setBackground(Color.WHITE); // 배경을 흰색으로 지정합니다.

	int idx = 0; // 이 부분부터 이미지를 하나로 병합하는 과정입니다.
	for (BufferedImage obj : bufferedImages) { // 이미지 List에서 이미지를 하나씩 꺼내와서
		if (idx == 0) height = 0; // 첫 번째 이미지의 경우 높이를 0으로 설정합니다.
		graphics.drawImage(obj, 0, height, null); // 그래픽 객체에 꺼내온 이미지를 그려줍니다.

		height += obj.getHeight(); // 높이값을 이미지의 높이만큼 더합니다.
		idx++;
	}

	fileExt = "jpg"; // 파일 형식은 jpg (png나 bmp 같은 다른 포맷도 됩니다)
	ImageIO.write(bufferedImage, fileExt, new File(filePath)); // 마지막으로 병합된 이미지를 생성합니다.
	graphics.dispose(); // 그래픽 리소스 해제
} else {
	pdf가 아닐 경우의 처리...
}

 

생각보다 간단하네요~^^

 

Comments