문서의 이전 판입니다!
목차
목적
다음의 그림을 다시 보자
통상의 문서를 머리말과 꼬리말, 본문, 그리고 좌우여백으로 이루어진다.
지금까지는 위의 구역을 나누지 않고 전체 페이지를 기준으로 좌표를 정해 왔는데, 이건 페이지가 1장일 때에나 가능하다.
왜냐하면 페이지가 여러장인 경우, 머리말과 꼬리말은 여러페이지에 반복해서 인쇄되어야 할 것이고, 페이지를 나눌떄의 기준점을 페이지의 마지막 좌표가 아니라 본문의 마지막 좌표를 기준으로 해야 하기 때문이다.
따라서 각 구역을 기준으로 상대좌표를 정하는게 합리적이다.
구역화하기
1. 절대 좌표 및 구역의 너비와 높이를 저장하는 클래스 만들기
다음과 같이 각 구역의 속성을 기억하는 클래스를 만들었다.
// Rect 좌표와 너비 높이 data class PNL(private val rect : Rect = Rect(0, 0, 100, 100), private val width : Int = 0, private val height : Int = 0) { var rectP = rect var Width = width var Height = height }
2. 각 구역의 절대 좌표 기억하기
A4종이에서 본문을 중심으로 한 각 마진을 구한 후, 이를 기초로 하여 본문 지역의 위치 속성을 다음과 같이 지정했다.
// creating a PDF Document instance val pdfDocument: PdfDocument = PdfDocument() // 여백 val marginTop = 42 val marginBottom = 50 val marginLeft = 47 val marginRight = 48 // 각 구역 좌표 var body = PNL(Rect(marginLeft, marginTop, PDF_PAGE_WIDTH - marginLeft, PDF_PAGE_HEIGHT - marginBottom), PDF_PAGE_WIDTH - (marginLeft + marginRight), PDF_PAGE_HEIGHT - (marginTop + marginBottom) )
구역화를 할 때 고려해야 할 문제점
안드로이드의 기본 PDF API(android.graphics.pdf)를 이용하여 pdf문서를 만들고자 할 때의 가장 큰 문제점은,
pdf의 페이지 작성 및 캔버스 그리기는 모두 일방향이라는 것이었다.
즉, 페이지를 먼저 만들면, 그 페이지 안에 canvas가 이미 지정되어 있고, 그 캔버스 안에 그림을 그리는 방식이다.
예를 들면 다음과 같다1).
// creating a PDF Document instance val pdfDocument: PdfDocument = PdfDocument() // create a page description val myPageInfo: PdfDocument.PageInfo = PdfDocument.PageInfo.Builder(PDF_PAGE_WIDTH, PDF_PAGE_HEIGHT, num).create() // start a page val newPage: PdfDocument.Page = pdfDocument.startPage(a4Paper(pageNum + 1)) // start canvas val canvas = newPage.canvas // draw something on the page canvas.draw(....) // finish the page pdfDocument.finishPage(page); . . . // add more pages . . . // write the document content pdfDocument.writeTo(getOutputStream()); // close the document pdfDocument.close();
2. 비트맵으로 저장하고 그리기
본문을 비트맵 그림파일의 배열로 저장한 후에, 이 것을 출력하는 방법이 있을 수 있다.
그런데 비트맵 그림은 너무도 당연하게도 확대축소시에 글자가 깨지는 문제점이 생긴다.
아래 그림을 보면 머릿말, 꼬릿말의 폰트와 본문의 폰트 해상도가 다름을 느낄 수 있다.
따라서 다른 방법을 모색해 보아야 한다.
로그인