简体   繁体   中英

Creating PDF in Swift, UIView to View using UIViewRepresentable

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM