Android

android에서 pdf파일 페이지를 png파일로 저장하기.

Ohjeonghak 2013. 12. 4. 11:33
반응형

pdf 파일에 jpg형식의 이미지로 저장이 되어 있으면 파일을 추출할때 이미지가 깨지는 버그가 있는 것 같다.

그래서 pdf 파일을 만들고나서 png파일로 페이지를 추출할거라면 png형식으로 다 처리 하도록 하면 될 것 같다.

내부적으로 RGB_565 형식으로 추출 하는 듯 하다.

 

우선 아래의 라이브러리 5개가 필요하다.

내부적으로 awt를 사용하는데 안드로이드에서는 사용할 수 없기 때문에 비슷하게 구현해둔 오픈 프로젝트를 사용한다고

어딘가에서 검색해서 찾았다.

출처를 밝히고 싶은데 그때 검색했던 곳이 생각나지 않는다...;;

 

andpdfviewer.jar

apache-mime4j-0.6.jar

gson-1.5.jar

httpmime-4.0.1.jar

Micro_PJAWT.jar 

 

그리고 jar 파일 추가 방법은 여기서 언급 하지 않고 아래 포스팅을 참고 하도록 하자...

http://kuroikuma.tistory.com/64

 

 

 

우선 PdfConverter 클래스를 만들었다.

 

import com.lowagie.text.Image;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFImage;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFPaint;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

import net.sf.andpdf.refs.HardReference;
import android.graphics.Bitmap;
import android.graphics.RectF;
import android.util.Log;

public class PdfConverter {

	FileChannel channel;
	RandomAccessFile raf;
	PDFFile pdffile;

	public void convertPDF(String path, String filename) {

		try {
			PDFImage.sShowImages = true;
			PDFPaint.s_doAntiAlias = true;
			HardReference.sKeepCaches = false;

			File file = new File(path + "⁄" + filename);
			if (file.exists()) {
				Log.i("file", "exist!!");
			} else {
				Log.i("file", "no exist!!");
			}
			raf = new RandomAccessFile(file, "r");
			channel = raf.getChannel();
			net.sf.andpdf.nio.ByteBuffer buf = net.sf.andpdf.nio.ByteBuffer
					.NEW(channel.map(FileChannel.MapMode.READ_ONLY, 0,
							channel.size()));
			pdffile = new PDFFile(buf);
			int pageTotalcount = pdffile.getNumPages(); //PDF Total Page
														//Count
			for (int i = 0; i < pageTotalcount; i++) {
				//pagecount = i + 1;
				PDFPage page = pdffile.getPage(i + 1, true); //1번부터 마지막
																//페이지까지
																//가져옴.
				int wi = (int) page.getWidth();
				int hei = (int) page.getHeight();
				int wantWidth = 2560; //원하는 가로사이즈를 넣으면 비율에 맞게 세로사이즈가 설정됨.
				int wantHeight = wantWidth * hei ⁄ wi;
				RectF rect = new RectF(0, 0, (int) page.getWidth(),
						(int) page.getHeight());
				
				Bitmap image = page.getImage(wantWidth, wantHeight, rect, true, true);
				//image = Bitmap.createScaledBitmap(image, 480, 800, false);

				String image_path = "⁄storage⁄sdcard0⁄사용자경로/"
						+ filename + "_" + Integer.toString(i + 1) + ".png"; // ⁄sdcard⁄pdf⁄test_1.png
				//이런식으로 저장.
				File imageFile = new File(image_path);
				
				try {
					if (imageFile.exists()) {
						imageFile.delete();
					}
					imageFile.createNewFile();
					FileOutputStream fos = new FileOutputStream(imageFile);
					image.compress(Bitmap.CompressFormat.PNG, 0, fos);

					fos.flush();
					fos.close();
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			}
		} catch (IllegalArgumentException iae) {
			Log.e("Error", iae.toString());
		} catch (FileNotFoundException e) {
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}
}

 

그리고 메인에서 이렇게만 해주면 된다.

 

		//PDF to IMG
		PdfConverter pdfConverter = new PdfConverter();

		try {

			pdfConverter.convertPDF(Environment.getExternalStorageDirectory()
					.getAbsolutePath() + "⁄사용자경로/", "pdf파일.pdf");
		} catch (IllegalArgumentException iae) {
			Log.e("Error", iae.toString());
		} catch (Exception e) {
			Log.e("Error", e.toString());
		}

 

이게 끝이다.

반응형

'Android' 카테고리의 다른 글

일반 이클립스에 android sdk연동하기  (0) 2014.07.06
Android DB SQLite 예제  (6) 2014.02.13
android에서 png를 pdf로 만들기.  (0) 2013.12.04
프로젝트에 jar 파일 추가하기.  (0) 2013.12.04
SurfaceView 기본 구조.  (0) 2013.12.04