You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何从二进制Data对象展示PDF文件

在SwiftUI中展示PDF Data

借助iOS 11+支持的PDFKit框架,有两种简单方案可以实现需求,下面是具体代码实现:

方法一:封装UIKit的PDFView为SwiftUI视图

这种方式支持完整的PDF交互(缩放、翻页等),是最常用的方案。创建一个遵循UIViewRepresentable的自定义视图,包装UIKit的PDFView:

import SwiftUI
import PDFKit

struct PDFViewer: UIViewRepresentable {
    let pdfData: Data
    
    func makeUIView(context: Context) -> PDFView {
        let pdfView = PDFView()
        pdfView.autoScales = true // 自动适配屏幕缩放
        pdfView.displayMode = .singlePageContinuous // 连续单页显示
        pdfView.displayDirection = .vertical // 垂直滚动
        
        // 将Data转换为PDF文档并设置到视图
        if let document = PDFDocument(data: pdfData) {
            pdfView.document = document
        }
        return pdfView
    }
    
    func updateUIView(_ uiView: PDFView, context: Context) {
        // 数据更新时重新加载文档
        if let document = PDFDocument(data: pdfData) {
            uiView.document = document
        }
    }
}

在SwiftUI主视图中使用

直接在你的页面里调用这个自定义视图,传入已解码的PDF Data:

struct ContentView: View {
    // 替换为你从后端解码得到的实际PDF Data
    let pdfData: Data
    
    var body: some View {
        if pdfData.isEmpty {
            Text("无效的PDF数据")
        } else {
            PDFViewer(pdfData: pdfData)
                .edgesIgnoringSafeArea(.all) // 可选:全屏显示,忽略安全区域
        }
    }
}

方法二:简易单页预览(适合少页数PDF)

如果只需要快速预览PDF的单页内容,可以将PDF页面转为图片后展示:

import SwiftUI
import PDFKit

struct SimplePDFPreview: View {
    let pdfData: Data
    
    var body: some View {
        Group {
            if let document = PDFDocument(data: pdfData),
               let firstPage = document.page(at: 0),
               let pageImage = firstPage.thumbnail(of: UIScreen.main.bounds.size, for: .mediaBox) {
                Image(uiImage: pageImage)
                    .resizable()
                    .scaledToFit()
            } else {
                Text("无法加载PDF")
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者visandres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:58:10