I'm trying to create a simple PDF with Swift. I get an error: Referencing static method 'buildBlock' on 'Optional' requires that 'UIView' conform to 'View'
Probably doing a ton of stuff wrong. I think I need to be able to somehow change the UIView to a view to be displayed.
My Code below:
import SwiftUI
import PDFKit
public var documentData: Data?
let pdfView = PDFView()
func myPDF() -> Data {
let pdfMetaData = [
kCGPDFContextCreator: "my PDF",
kCGPDFContextAuthor: "etienne"
]
let format = UIGraphicsPDFRendererFormat()
format.documentInfo = pdfMetaData as [String: Any]
let pageWidth = 8.5 * 72.0
let pageHeight = 11 * 72.0
let pageRect = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)
let renderer = UIGraphicsPDFRenderer(bounds: pageRect, format: format)
let data = renderer.pdfData { (context) in
context.beginPage()
let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 72)
]
let text = "Hello World!"
text.draw(at: CGPoint(x: 0, y: 0), withAttributes: attributes)
}
return data
}
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
.onAppear(perform: {
if let data = documentData {
pdfView.document = PDFDocument(data: createFlyer())
pdfView.autoScales = true
}
})
pdfView.documentView
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
I managed to get this working with the below:
import SwiftUI
import PDFKit
public var documentData: Data?
let pdfView = PDFView()
func myPDF() -> Data {
let pdfMetaData = [
kCGPDFContextCreator: "my PDF",
kCGPDFContextAuthor: "etienne"
]
let format = UIGraphicsPDFRendererFormat()
format.documentInfo = pdfMetaData as [String: Any]
let pageWidth = 8.5 * 72.0
let pageHeight = 11 * 72.0
let pageRect = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)
let renderer = UIGraphicsPDFRenderer(bounds: pageRect, format: format)
let data = renderer.pdfData { (context) in
context.beginPage()
let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 72)
]
let text = "Hello World!"
text.draw(at: CGPoint(x: 0, y: 0), withAttributes: attributes)
}
return data
}
struct GeneratePDFView: UIViewRepresentable {
init() {
}
func makeUIView(context: UIViewRepresentableContext<GeneratePDFView>) -> GeneratePDFView.UIViewType {
let pdfView = PDFView()
pdfView.document = PDFDocument(data: myPDF())
return pdfView
}
func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<GeneratePDFView>) {
}
}
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
.onAppear(perform: {
})
GeneratePDFView()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Created a UIViewRepresentable that return the generated PDFView.
I do not really understand this. Thus any comments on this would be great.
Thank you
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.