[Android] 앱 내부에 pdf 표시

Berry Studio·2025년 2월 21일

라이브러리 활용

목록 보기
1/1
post-thumbnail

이론학습 컨텐츠 MVP 용으로 빠른 결과물을 만들어 내기 위해 안드로이드 앱 내부에서 pdf를 보여주기로 하였다.

이론학습 컨텐츠를 PDF 로 표현하기로 한 이유?

기존에 PDF 형태로 되어있는 리소스를 간편하게 프로토타입으로 만들어 표현할 수 있습니다.

AndroidStudio 버전 : Ladybug | 2024.2.1 Patch 3

Gradle 버전: 8.9

Build time: 2024-07-11 14:37:41 UTC
Revision: d536ef36a19186ccc596d8817123e5445f30fef8

Kotlin: 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

1.PDFViewer 라이브러리 import

버전 카탈로그를 사용하고 있으므로 해당 기준으로 글을 작성합니다.

  1. 버전, 라이브러리를 libs.versions.toml 파일에 설정한다.
```markup
[versions]
...
androidPdfViewer = "3.2.0-beta.1"
....

[libraries]
...
androidPdfViewer = { module = "com.github.barteksc:android-pdf-viewer", version.ref = "androidPdfViewer" }
...
```
  1. 앱 수준 build.gradle 에 위 라이브러리를 dependencies 블록에 implementation 한다.

    dependencies {
    		...
        // pdfViewer
        implementation(libs.androidPdfViewer)
        ...
    }

    ⚠️Error! - 라이브러리 import 불가!

    1. 프로젝트 수준 setting.gradle 에
      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")
      ```

2. PDFViewer 사용

  1. 보여줄 pdf 파일을 raw 폴더 아래에 준비한다.

image.png

  1. 해당 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) // 배경 설정
      )

    ❕Tip - raw 폴더의 리소스를 바로 접근하여 보여줄 수 없음

    • raw 폴더의 리소스를 바로 접근하여 보여주도록 코드를 작성하였지만 파일을 가져와서 보여주지 못했습니다.
      • 위 부분에 대한 원인은 라이브러리가 파일을 어떻게 가져오는지 살펴보고 이를 분석해보아야 이를 알 수 있을 듯 합니다.
    • 그래서 스트림을 임시파일로 복사하여 정상적으로 사용할 수 있었습니다.

🖥️결과화면


🔗참조링크

profile
Android 개발자

0개의 댓글