Tempo Di Valse

[Android] Glide with PDF -3(완결)- 본문

개발/Android

[Android] Glide with PDF -3(완결)-

TempoDiValse 2022. 2. 4. 10:29

이전 포스팅에서는 Glide 에서 PDF 를 로드할 수 있도록 도와주는 ModelLoader 와 DataFetcher 구현하는 방법에 대해 작성해보았다. 조회수 올리게 이전 포스팅을 보고 오세용

 

 

Glide with PDF -2(ModelLoader, DataFetcher)-

이전 포스팅 에서는 Glide 와 Pdfium 라이브러리를 앱에서 사용하기 위한 방법에 대해 간단하게 알아보았다. 못보고 왔다면 조회수 올리게 한번 보고 오세용 Glide with PDF -1(기초공사)- Glide 는 Android

tempodivalse.tistory.com


 

PDF 를 Glide 에서 작동시키기 위한 구현 절차를 다시 보면,

 

1. ModelLoader 를 구현한다

2. DataFetcher 를 구현한다

3. ModelLoader 에서 쓸 수 있도록 만든다

4. AppGlideModule 에 등록한다

 

였는데, 이전 포스팅 까지 해서 1,2,3 번 과정을 다루어 보았고 이제 마지막 4번 절차와 앱에서 실행하는 일만 남았다.

 

AppGlideModule 은 첫번째 포스팅이었던 기초공사 작업에서 GlideApp 을 만들게 해주었을 때 생성했던 클래스인데 기억이 나지 않는다면 한번 다시 조회수 올리게 보고오자.

 

Glide with PDF -1(기초공사)-

Glide 는 Android 에서는 거의 필수적으로 사용하는 이미지 로드 라이브러리이다. 뭐 이보다 Lightweight 하다는 Picasso 도 유명한 라이브러리 이지만, Glide 가 그나마 접근하기 쉬운 라이브러리이며 구

tempodivalse.tistory.com

 

AppGlideModule 을 상속받은 해당 클래스 내에 override 된 registerComponents() 에 지금까지 작업한 것들을 넣을 것이다.

 

방식은 registry 라는 파라미터를 이용해서 등록만 해주는 것인데, 이 파라미터에는 다양한 것들이 존재하는데 그 중에서 prepend() 메소드를 사용하여 등록을 해 주도록 한다. append() 메소드도 있긴 한데, append 메소드는 새로 만든 것을 등록하기 보다는 기존 Glide 렌더하는 기능에 추가기능을 부여하는 것을 개발할 때 사용한다고는 써있는데 잘 모르겠다. 일단 공식문서에 나와있는 대로 따라서 해보면,

override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
    registry.prepend(Uri::class.java, ByteBuffer::class.java, PDF_MODEL_LOADER_FACTORY) // PDF 로더
}
 

이런 형식이 되는데 여기서 한가지 걸리는 것은, 등록할 때에는 ModelLoader 본연의 클래스가 아닌 ModelLoaderFactory 라는 것을 구현하여 ModelLoader 를 전달해야 한다는 것이다. 파라미터 타입 값을 확인해보면,

마지막 파라미터가 ModelLoaderFactory<Model, Data> factory 로 되어있는 것을 볼 수 있다. 그래서 ModelLoader 내부에 Factory 클래스를 구현해 보도록 한다

 

class PDFModelLoader private constructor (private val context: Context) : ModelLoader<Uri, ByteBuffer>() {
    /* 코드를 짠다. 막 짠다 */
    class Factory (private val context: Context) : ModelLoaderFactory<Uri, ByteBuffer>(){
        override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<Uri, ByteBuffer> = PDFModelLoader(context)
        override fun teardown() {}
    }
}
 

Factory 클래스를 상속받으면 2가지의 override 메소드가 입력되는데, teardown 은 문서에서 빈칸으로 냅두라고 해서 냅뒀다. 무슨 역할을 하는 지는 잘 모른다. 그리고 build 에서 단순하게 ModelLoader 를 생성하고 리턴시켜주면 된다. context 는 ModelLoader 와 DataFetcher 내부에서 파일을 불러오거나 할 때 사용해야 하기 때문에 context 를 삽입했다. 그리고 Factory 클래스로만 접근하기 때문에 PDFModelLoader 는 private constructor 로 외부에서의 생성을 차단시켰다.

 

그럼 다시 AppGlideModule 클래스로 돌아와 등록을 해보면,

override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
    registry.prepend(Uri::class.java, ByteBuffer::class.java, PDFModelLoader.Factory(context)) // PDF 로더
}
 

마지막 파라미터는 Factory 클래스를 생성하면 되는 것이다.

 

여기까지 길고 긴 Glide ModelLoader 생성에 대해 알아보았다. ViewPager 에서 PDF 가 작동 되도록 실행해 보도록 하자.

 

일단 뭐, ViewPager 에 Fragment 로 View 구성이 잘 되었다면 ImageView 를 타겟 삼아 Glide 객체를 불러온다.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val uri = requireArguments().getString(KEY_PDF_URI)
    val page = requireArguments().getInt(KEY_PAGE)

    with(view){ this as ImageView
        GlideApp.with(context).asBitmap().load(Uri.parse(uri)).page(page).into(this)
    }
}
 

Uri 와 Page 번호를 받아온 후 기본 Glide 를 사용하는 방식으로 PDF 파일을 로드하면 된다. 주의할 점은 Glide.with(context) 가 아니라 GlideApp.with(context) 로 사용해야 한다는 것이다.

 

그리하여 나온 결과물은,

 

 

Glide With PDF (Preview)

 

serviceapi.nmv.naver.com

프로미 PDF 감사.


여기까지 Glide 와 PDF 연동에 대해 알아보았고, 풀 소스는 다음 링크에서 확인 해 볼 수 있다. 그럼 포스팅 끝~

 

GitHub - TempoDiValse/GlidePDF: Glide with Pdfium

Glide with Pdfium. Contribute to TempoDiValse/GlidePDF development by creating an account on GitHub.

github.com

 

반응형
Comments