앞선 글에서는 iText7 라이브러리를 이용하는 PDF 생성 방법을 알아보았습니다. 하지만 AGPL 라이센스 정책으로는 수익을 목적으로 하는 상용 앱에서는 사용할 수 없습니다. 무료로 사용하고자 한다면 라이브러리를 이용한 소스코드 전체를 공개해야 하기 때문입니다.
따라서, PDF 생성기능을 프로그램 내에서 주된 기능으로 사용한다면 유료로 사용하는 것도 나쁘지 않지만 단순한 PDF 출력만을 사용하고자 한다면 다른 라이브러리를 찾는 것이 좋을것 같습니다.
그래서 블로그를 작성하고 난 뒤에 좀더 라이브러리를 찾아보았고, PDFBox라는 라이브러리를 찾았습니다. PDFBox는 Apache 재단에서 제공하는 라이브러리 입니다. 따라서 Apache Lisense 2.0을 따릅니다. 하지만 이 라이브러리는 안드로이드는 지원하지 않았습니다. 마침 누군가가 안드로이드용으로 수정해서 배포하였고, 써보니 좋은것 같아 소개합니다.
PDFBox는 iText7보다는 편하지 않습니다. ‘그린다’라는 표현이 좀더 와닿는것 같았습니다. 하지만 못쓸지경은 아니기 때문에 단순한 PDF 출력용으로는 훌륭한 것 같습니다.
라이브러리 위치
사용법
먼저 jcenter()를 추가해줍니다.
settings.gradle.kts :
pluginManagement { repositories { google { content { includeGroupByRegex("com\\.android.*") includeGroupByRegex("com\\.google.*") includeGroupByRegex("androidx.*") } } jcenter() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { jcenter() google() mavenCentral() } }
libs.versions.toml :
[versions] pdfbox = "2.0.27.0" jp2 = "1.0.3" [libraries] pdfbox = { group = "com.tom-roush", name = "pdfbox-android", version.ref = "pdfbox"} jp2-android = { group = "com.gemalto.jp2", name = "jp2-android", version.ref = "jp2"}
build.gradle.kts :
implementation(libs.pdfbox) implementation(libs.jp2.android)
activity_main.xml :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="4dp" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btn_write_pdf" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Write PDF" /> </LinearLayout>
MainActivity.kt
class MainActivity : AppCompatActivity() { private val FILE_TYPE = "FileType" private val FILE_TYPE_PDF = 101 lateinit var btnWritePdf: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) PDFBoxResourceLoader.init(applicationContext); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } btnWritePdf = findViewById(R.id.btn_write_pdf) btnWritePdf.setOnClickListener { writePdf() } } private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { result.data.also { intent -> intent?.data?.also { url -> requestWritePdfData(url) } } } } private fun requestWritePdfData(uri: Uri) { lifecycleScope.launch(Dispatchers.IO) { contentResolver.openFileDescriptor(uri, "w").use { descriptor -> if (descriptor != null) { FileOutputStream(descriptor.fileDescriptor).use { stream -> val document = PDDocument() val page = PDPage(PDRectangle.A4) document.addPage(page) val textPosition = (page.bBox.height * (90f / 100f)) val content = PDPageContentStream(document, page) content.setFont(PDType1Font.HELVETICA_BOLD, 12F) content.beginText() content.newLineAtOffset(50F, textPosition) content.showText("Hello, World") content.endText() content.close() document.save(stream) document.close() } } } } } private fun writePdf() { val fileName = "PdfSample" val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "application/pdf" putExtra(FILE_TYPE, FILE_TYPE_PDF) putExtra(Intent.EXTRA_TITLE, "$fileName.pdf") } launcher.launch(intent) } }
위 코드를 작성 후에 빌드하신 뒤 버튼을 누르면 파일명을 선택하는 화면이 뜹니다.
적절한 파일명 입력한 뒤에 [SAVE] 버튼을 누르면 저장됩니다. 저장된 파일은 Device Explorer로 들어가서 받아와 열어보시면 PDF 파일이 만들어 진 것을 확인할 수 있습니다.
Hi, i think that i noticed you visited my site so i got here
to return the favor?.I am attempting to to find issues to enhance my site!I suppose its adequate to use a few of
your concepts!!