반응형
pdf 파일에 jpg형식의 이미지로 저장이 되어 있으면 파일을 추출할때 이미지가 깨지는 버그가 있는 것 같다.
그래서 pdf 파일을 만들고나서 png파일로 페이지를 추출할거라면 png형식으로 다 처리 하도록 하면 될 것 같다.
내부적으로 RGB_565 형식으로 추출 하는 듯 하다.
우선 아래의 라이브러리 5개가 필요하다.
내부적으로 awt를 사용하는데 안드로이드에서는 사용할 수 없기 때문에 비슷하게 구현해둔 오픈 프로젝트를 사용한다고
어딘가에서 검색해서 찾았다.
출처를 밝히고 싶은데 그때 검색했던 곳이 생각나지 않는다...;;
그리고 jar 파일 추가 방법은 여기서 언급 하지 않고 아래 포스팅을 참고 하도록 하자...
우선 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 |