PDF를 Compose UI를 사용하는 안드로이드 앱 내에 띄워야하는데, 여러 라이브러리들 사용에 실패하다가 유일하게 성공한 방법이다.
다음은 PdfRenderer를 사용하여 PDF의 특정 페이지를 Bitmap으로 변환하고 이를 Compose에서 이미지로 표시하는 코드이다.
나의 경우 PDF가 한 페이지라 첫 번째 페이지를 이미지로 렌더링했다.
pdfRenderer.openPage(0): 페이지 선택 부분
import android.graphics.Bitmap
import android.graphics.pdf.PdfRenderer
import android.os.ParcelFileDescriptor
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.style.TextAlign
import java.io.File
@Composable
fun PdfRender(pdfFilePath: String) {
val bitmap = remember(pdfFilePath) {
getPdfPageAsBitmap(pdfFilePath)
}
if (bitmap != null) {
Image(
painter = BitmapPainter(bitmap.asImageBitmap()),
contentDescription = "PDF Page",
modifier = Modifier.fillMaxWidth(),
contentScale = ContentScale.Crop
)
} else {
Text("전자처방전 파일이 없습니다.", textAlign = TextAlign.Center)
}
}
fun getPdfPageAsBitmap(pdfFilePath: String): Bitmap? {
val file = File(pdfFilePath)
return if (file.exists()) {
val fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
val pdfRenderer = PdfRenderer(fileDescriptor)
val page = pdfRenderer.openPage(0)
val bitmap = Bitmap.createBitmap(page.width, page.height, Bitmap.Config.ARGB_8888)
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
page.close()
pdfRenderer.close()
bitmap
} else {
null
}
}
위 Composable 함수를 실행시키면 PDF가 정상 렌더링되어 불러와진다.
PdfRender(pdfFilePath = FilePath!!)