기존 프로젝트를 수행하면서 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()
'ANDROID' 카테고리의 다른 글
[안드로이드] 데이터바인딩을 Fragment에 적용할 때의 유의할 점. (0) | 2019.10.03 |
---|---|
[안드로이드] API 버전에 구애받지 않는 Notification 설정하기 (0) | 2019.09.18 |
[안드로이드] 사용자 정의 matrix를 사용해 ImageView의 Bitmap 조정하기 (0) | 2018.12.03 |
[안드로이드] List나 Arraylist를 다룰 때의 사소한 주의점 (0) | 2018.11.27 |
[안드로이드] 뷰 객체의 좌표값 얻을 때의 간단한 팁 (0) | 2018.10.23 |