
이론학습 컨텐츠 MVP 용으로 빠른 결과물을 만들어 내기 위해 안드로이드 앱 내부에서 pdf를 보여주기로 하였다.
기존에 PDF 형태로 되어있는 리소스를 간편하게 프로토타입으로 만들어 표현할 수 있습니다.
AndroidStudio 버전 : Ladybug | 2024.2.1 Patch 3
Gradle 버전: 8.9
Build time: 2024-07-11 14:37:41 UTC
Revision: d536ef36a19186ccc596d8817123e5445f30fef8Kotlin: 1.9.23
Groovy: 3.0.21
Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023
Launcher JVM: 21.0.5 (Oracle Corporation 21.0.5+9-LTS-239)
Daemon JVM: 'C:\Program Files\Java\jdk-21' (from org.gradle.java.home)
OS: Windows 11 10.0 amd64
버전 카탈로그를 사용하고 있으므로 해당 기준으로 글을 작성합니다.
- 버전, 라이브러리를 libs.versions.toml 파일에 설정한다.
```markup
[versions]
...
androidPdfViewer = "3.2.0-beta.1"
....
[libraries]
...
androidPdfViewer = { module = "com.github.barteksc:android-pdf-viewer", version.ref = "androidPdfViewer" }
...
```
앱 수준 build.gradle 에 위 라이브러리를 dependencies 블록에 implementation 한다.
dependencies {
...
// pdfViewer
implementation(libs.androidPdfViewer)
...
}
repositories{} 블록과 dependencyResolutionManagement{} 블록에*maven*("https://repository.liferay.com/nexus/content/repositories/public") 를 추가한다.
```xml
pluginManagement {
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
maven("https://repository.liferay.com/nexus/content/repositories/public")
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven("https://repository.liferay.com/nexus/content/repositories/public")
}
}
rootProject.name = "Hamo"
include(":app")
```해당 pdf 파일을 AndroidView 아래에서 보여준다.
AndroidView(
factory = { ctx ->
val frameLayout = FrameLayout(ctx)
val pdfView = PDFView(ctx, null)
val resId = context.resources.getIdentifier("theory_learning", "raw", context.packageName)
if (resId != 0) {
val inputStream = context.resources.openRawResource(resId)
val tempFile = File(context.cacheDir, "temp_selected.pdf")
// 스트림을 임시 파일로 복사
inputStream.use { input ->
tempFile.outputStream().use { output ->
input.copyTo(output)
}
}
pdfView.fromFile(tempFile)
.defaultPage(0)
.enableSwipe(true) // 스와이프로 넘기지 않음
.swipeHorizontal(true) // eBook 형식 (가로 스크롤)
.scrollHandle(DefaultScrollHandle(ctx)) // 스크롤 핸들 추가
.enableDoubletap(false) // 더블탭 확대
.pageFitPolicy(com.github.barteksc.pdfviewer.util.FitPolicy.WIDTH) // 너비 맞춤
.fitEachPage(true) // 모든 페이지 동일한 크기로 맞춤
.spacing(10) // 페이지 간격 추가
.nightMode(false) // 야간 모드 비활성화
.load()
frameLayout.addView(pdfView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
} else {
Log.e("PDFView", "selected.pdf 리소스를 찾을 수 없음!")
}
frameLayout
},
modifier = Modifier
.fillMaxSize()
.clip(RoundedCornerShape(topStart = 24.dp, topEnd = 24.dp)) // 🔹 상단 모서리 둥글게
.background(Color.White) // 배경 설정
)

