Как создать PDF-файл, содержащий виды с размерами, превышающими размер экрана устройства? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть несколько UIViews с чистым фоновым цветом и черными контурами границ, размеры которых меняются в зависимости от значений, вводимых в текстовых полях длины, ширины и высоты. Эти взгляды являются подпредставлениями UIScrollView. После изменения размеров представлений я создаю PDF-файл из содержимого представления прокрутки, что приводит к векторизации контуров, которые я могу использовать и манипулировать в Adobe Illustrator.

Этот процесс работает нормально, когда я использую небольшие размеры для видов (например, 15 x 15), но когда я использую более идеальные размеры для своей цели (например, 3000 x 3000), виды выходят за границы экрана, и в результате Созданный PDF-файл содержит лишь небольшую часть просмотров.

В идеале мне нужно иметь возможность создавать гораздо более крупные виды и при этом создавать файл PDF, содержащий их. Я предполагаю холст, который изменяет размеры (уменьшает?) На основе его содержимого и сохраняет масштаб его подпредставлений, так что результирующие представления в PDF будут масштабированы при просмотре в Adobe Illustrator. Это мой код:

override func viewDidLoad() {
        super.viewDidLoad()

        lengthTextField.delegate = self
        widthTextField.delegate = self
        heightTextField.delegate = self
        scrollView.delegate = self

        scrollView.autoresizingMask = [UIView.AutoresizingMask.flexibleWidth,UIView.AutoresizingMask.flexibleHeight]
        scrollView.minimumZoomScale = 1
        scrollView.maximumZoomScale = 50
        scrollView.zoomScale = 1

        self.setupGestureRecognizer()

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        scrollView.contentSize = CGSize(width: 5000, height: 5000)
    }

    func setupGestureRecognizer() {

    }

    @IBAction func viewPDF(_ sender: Any) {

        createPDFfrom(aView: self.scrollView.subviews[0], saveToDocumentsWithFileName: "MC.pdf")

        // Create and add a PDFView to the view hierarchy.
        let pdfView = PDFView(frame: self.scrollView.subviews[0].bounds)
        pdfView.autoScales = true
        view.addSubview(pdfView)

        // Create a PDFDocument object and set it as PDFView's document to load the document in that view.
        let documentsDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let filePath = (documentsDirectory as NSString).appendingPathComponent("MC.pdf") as String
        let pdfDocument = PDFDocument(url: URL(fileURLWithPath: filePath))!
        pdfView.document = pdfDocument

        let document = NSData(contentsOfFile: filePath)

        let vc = UIActivityViewController(activityItems: [document as Any], applicationActivities: nil)
        self.present(vc, animated: true, completion: nil)

    }

    func createPDFfrom(aView: UIView, saveToDocumentsWithFileName fileName: String)
    {
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil)
        UIGraphicsBeginPDFPage()

        guard let pdfContext = UIGraphicsGetCurrentContext() else { return }

        aView.layer.render(in: pdfContext)
        UIGraphicsEndPDFContext()

        if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
            let documentsFileName = documentDirectories + "/" + fileName
            debugPrint(documentsFileName)
            pdfData.write(toFile: documentsFileName, atomically: true)
        }
    }

    @IBAction func updateDimensions(_ sender: Any) {

        guard let length = NumberFormatter().number(from:
            lengthTextField.text ?? "") else { return }

        guard let width = NumberFormatter().number(from:
            widthTextField.text ?? "") else { return }

        guard let height = NumberFormatter().number(from:
            heightTextField.text ?? "") else { return }

        let flapHeight = CGFloat(truncating: width)/2

        let lengthFloat = CGFloat(truncating: length)
        let widthFloat = CGFloat(truncating: width)
        let heightFloat = CGFloat(truncating: height)

        UIView.animate(withDuration: 0.3) {
            self.faceAWidthConstraint.constant = lengthFloat
            self.faceAHeightConstraint.constant = heightFloat
            self.faceBWidthConstraint.constant = widthFloat
            self.faceA1HeightConstraint.constant = flapHeight
            self.view.layoutIfNeeded()
        }
    }

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return scrollView.subviews[0]
    }
}

1 Ответ

0 голосов
/ 09 апреля 2019

Я думаю, что если вы используете UIGraphicsPDFRenderer, это может работать лучше:

let url = URL(fileURLWithPath: filePath)
let pdfGenerator = UIGraphicsPDFRenderer(bounds: .init(x: 0, y: 0, width: 612, height: 792))
pdfGenerator.writePDF(to: url) { context in
  let cgContext = context.cgContext
  aView.layer.render(in: cgContext)
}

Если представления все еще выходят за границы PDF, вы можете масштабировать контекст:

cgContext.scaleBy(x: 0.25, y:0.25)
...