본문 바로가기

ANDROID

[안드로이드] 여러 페이지를 담은 PDF 파일 생성하기

기존 프로젝트를 수행하면서 1개 페이지의 PDF를 만들어 본 적은 있었는데, 


여러 페이지를 담은 PDF파일을 만들 수 있는지는 바로 쉽게 확신이 가지는 않았다. 


초반에 자료검색을 하면서 이런 저런 사례들을 보았지만, 


어쨌든 가능하다는 점을 확인하고 나서는 기존 코드를 사용해보기로 했다.


그랬는데 결과가 생각보다 순조롭게 나온 탓에 어깨춤을 출 뻔 했다.



우선 내가 원하고자 한 목표와 과정은 다음과 같다.



GOAL? 


     fragment로 존재하는 다수 페이지의 레이아웃을 캡처해 1개의 PDF 파일로 생성한다



HOW?


1. 레이아웃의 맨 바탕에 해당하는 어미 View를 id를 달아 참조해 View[] 배열에 담는다.



2. 저장한 View를 비트맵화 하여 Bitmap[] 배열에 담는다. 


비트맵배열[k] = Bitmap.createBitmap(뷰배열[k].getDrawingCache());



3. PdfDocument 변수 생성 (안드로이드 기본 API임)


PdfDocument document = new PdfDocument();



4. 만들 페이지 수 만큼 PdfDocument.PageInfo 생성


PdfDocument.PageInfo pageinfo

 = new PdfDocument.PageInfo.Builder(비트맵의width, 비트맵의height, 페이지넘버).create();



5. 각 페이지를 위한 PdfDocumnet.Page를 만들고 startPage로 페이지당 작업 시작


PdfDocument.Page page = document.startPage(pageinfo);


Canvas canvas = page.getCanvas();

Paint paint = new Paint();

paint.setColor(Color.parseColor("#ffffff");

canvas.drawPaint(paint);

paint.setColor(Color.BLUE);

canvas.drawBitmap(비트맵배열[k], 0, 0, null);

document.finishPage(pageinfo);


...


// 여기서 중요한 점은 document.startPage 를 해주었으면 finishPage를 필히 해주어야만 

// 다음 페이지를 쓸 수 있다는 점.


6. Pdf를 저장할 디렉토리 및 파일명 선정


String path = Environment.getExternalStorageDirectory().toString() + "디렉토리및파일명";

File filePath = new File(path);


7. 지정 위치에 파일 생성 및 도큐멘트 클로징


document.writeTo(new FileOutputStream(path)); // FOS를 사용하므로 try catch 문으로 잡아줘야함

document.close()