在应用程序 Jetpack Compose 中加载或显示 PDF

问题描述 投票:0回答:1

如何使用 url 在我的应用程序而不是外部应用程序中加载或显示 pdf,我想使用这个官方 androidx 库,任何人都可以指导我使用 jetpack compose

https://developer.android.com/jetpack/androidx/releases/pdf#1.0.0-alpha01

应用程序级别builde.gradle

dependencies {
    implementation("androidx.pdfviewer:pdfviewer:1.0.0-alpha04")
}

PDFViewer 可组合

未解决的参考 PDFView

@Composable
fun PdfViewer(uri: Uri) {
   AndroidView(
       factory = { context ->
           PDFView(context).apply {
               fromUri(uri).defaultPage(0) // Set default page to 0
               this.load() // Call load() on the PDFView instance
           }
       },
       modifier = Modifier.fillMaxSize()
   )
}
kotlin android-jetpack-compose android-jetpack androidx
1个回答
0
投票

androidx.pdfviewer:pdfviewer
不提供任何您可以使用的
View
。相反,它提供了您应该使用的
PdfViewerFragment

要使用

PdfViewerFragment
并在 Compose 中显示它,您将需要以下依赖项:

implementation("androidx.pdf:pdf-viewer-fragment:1.0.0-alpha04")
implementation("androidx.fragment:fragment-compose:1.8.5")

接下来,您的

style
中定义的应用程序
theme.xml
必须扩展任何
Material3
主题:

<style name="Theme.ComposePlayground" parent="Theme.Material3.Light.NoActionBar" />

最后,您可以使用

AndroidFragment
可组合项来显示
PdfViewerFragment

@Composable
fun PdfViewer(modifier: Modifier = Modifier, uri: Uri) {
    AndroidFragment<PdfViewerFragment>(
        arguments = bundleOf("documentUri" to uri),
        modifier = modifier
    )
}

PdfViewerFragment
从片段
Uri
捆绑中获取
arguments
。请注意,目前只有
Uri

开头
  • content://
  • file://

支持,因此无法打开在线PDF。

示例:

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DocumentViewer() {
    var documentUri by remember { mutableStateOf<Uri?>(null) }
    val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) {
        documentUri = it
    }

    Column(
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        CenterAlignedTopAppBar(
            title = { Text("Document Viewer") }
        )
        FilledTonalButton(
            onClick = {
                launcher.launch(arrayOf("application/pdf"))
            }
        ) {
            Text(text = "Select Document")
        }
        documentUri?.let {
            PdfViewer(
                modifier = Modifier.weight(1f).fillMaxWidth(),
                uri = it
            )
        }
    }
}

输出:

Screen Recording

注:

PdfViewerFragment
仍处于早期开发阶段,可能存在错误。此外,可以使用它的 API 级别也有很多限制。我在
API35
上测试了它,但如果您想将其与较旧的
minSdk
一起使用,您可能需要使用 SDK Extensions。 linter 会告诉您是否需要使用它。

© www.soinside.com 2019 - 2024. All rights reserved.