안드로이드 개발 팁 #93 - PDF 파일 내용을 이미지로 보여주기

in hive-139150 •  22 hours ago 

PDF 파일 내용을 이미지로 보여주기

No. 92
2025. 01. 31 (금) | Written by @dorian-mobileapp

개요

  • PDF 파일의 내용을 비트맵 리스트로 생성하는 Context 확장 함수 정의
  • LazyColumn, Image 컴포저블 함수를 활용하여 비트맵들을 보여주기
  • 이 기능을 구현한 이유

PDF 파일의 내용을 비트맵 리스트로 생성하는 Context 확장 함수 정의

  • PDF 파일을 앱의 cache 폴더로 복사
    • isFileCopiedToCacheDir, copyFileToCacheDir 메소드
  • PDF 파일 디스크립터를 갖는 PdfRenderer 객체 생성
  • PdfRenderer 객체 활용하여 각 페이지에 대한 비트맵 생성
fun Context.loadBitmapsFromAssetPDF(pdfFileName: String): List<Bitmap> {
    val bitmaps = mutableListOf<Bitmap>()

    if (!isFileCopiedToCacheDir(pdfFileName)) {
        copyFileToCacheDir(pdfFileName)
    }

    val file = File(this.cacheDir, pdfFileName)
    val fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    val pdfRenderer = PdfRenderer(fileDescriptor)
    for (i in 0 until pdfRenderer.pageCount) {
        pdfRenderer.openPage(i).use { page ->
            val bitmap = Bitmap.createBitmap(page.width, page.height, Bitmap.Config.ARGB_8888)
            page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
            bitmaps.add(bitmap)
        }
    }

    pdfRenderer.close()
    fileDescriptor.close()
    return bitmaps
}

LazyColumn, Image 컴포저블 함수를 활용하여 비트맵들을 보여주기

// 프리뷰 모드일 때에는 Context 사용 불가하므로 테스트용 비트맵 리스트 대신 로딩
val bitmaps = when (LocalInspectionMode.current) {
    true -> getBitmapsForPreview()
    else -> LocalContext.current.loadBitmapsFromAssetPDF(fileName)
}

LazyColumn(
    modifier = Modifier
        .fillMaxSize()
        .padding(10.dp)
) {
    items(bitmaps.size) { i ->
        Image(
            bitmap = bitmaps[i].asImageBitmap(),
            contentDescription = "${i}번째 페이지 이미지",
            modifier = Modifier
                .aspectRatio(bitmaps[i].width.toFloat() / bitmaps[i].height.toFloat())    // 비율 유지
                .fillMaxWidth()
                .padding(PaddingValues(bottom = 5.dp))
        )
    }
}

이 기능을 구현한 이유

구글 문서 앱으로 PDF를 보여줄 수 있으나, 일부 안드로이드 기기에서는 이 앱이 없을 수 있습니다. 이 경우에는 PDF로부터 이미지들을 로딩하여 화면에 보여주기로 했습니다.


지난 안드로이드 개발 팁


Layout provided by Steemit Enhancer hommage by ayogom


Posted through the ECblog app (https://blog.etain.club)
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

안녕하세요.
SteemitKorea팀에서 제공하는 'steemit-enhancer'를 사용해 주셔서 감사합니다. 개선 사항이 있으면 언제나 저에게 연락을 주시면 되고, 관심이 있으신 분들은 https://cafe.naver.com/steemitkorea/425 에서 받아보실 수 있습니다. 사용시 @응원해 가 포함이 되며, 악용시에는 모든 서비스에서 제외될 수 있음을 알려드립니다.

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.


안녕하세요.
이 글은 SteemitKorea팀(@ayogom)님께서 저자이신 @dorian-mobileapp님을 응원하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!

Upvoted! Thank you for supporting witness @jswit.

image.png