是否可以使用 iOS 图表 (Daniel Gindi) 在 iOS 上的 pdf 文档中生成图表

Is it possible to use iOS Charts (Daniel Gindi) to generate graphs in pdf document on iOS

我正在使用 iOS Charts (Daniel Gindi) 在 iOS 应用程序中生成图表,我希望能够生成一份 PDF 报告,这些图表包含在报告正文中。任何人都可以解释如何去做这件事。理想情况下,我不想从应用程序中显示的 UIView 生成图像,因为 size/resolution 不适合 PDF 文档。

据我了解,有以下几种选择:

  1. 使用 pdf 文档的图形上下文来绘制图形 - 目前尚不清楚这在使用图表库时是否可行
    1. 使用 UIView 以某种方式生成图形并从中生成 PDF 图像数据,将此图像嵌入到 pdf 报告中

似乎选项 1 可能是获得最佳效果的首选方法 resolution/control - 有点推测 - 这样做意味着您应该能够指定确切的位置和大小并获得正确的字体大小,线条粗细等。

使用选项 2 意味着您必须弄清楚 UIView 和 PDF 页面视图之间的比例,我不确定它们如何相互映射。

任何人都可以提供以下任何建议:

  1. 是否可以使用图表在 PDF 文档中生成图表,如果可以的话如何?
  2. 如果没有,除了编写自定义绘图代码之外还有哪些其他选项。

好的,这就是我所做的

选项 1:使用 UIView.layer 在 PDF CGContect 上呈现

func drawLineGraph(x: CGFloat, y: CGFloat)->CGRect{

    let width = (pageSize.width - 2*kBorderInset - 2*kMarginInset)/2.0 - 50.0

    let renderingRect = CGRect(x: x, y: y + 50.0, width: width, height: 150.0)

    // Create a view for the Graph
    let graphController = LineChartController(rect: renderingRect, building: self.building)

    if let currentContext = UIGraphicsGetCurrentContext() {

        let frame = graphController.chartView.frame
        currentContext.saveGState()
        currentContext.translateBy(x:frame.origin.x, y:frame.origin.y);
        graphController.chartView.layer.render(in: currentContext)
        currentContext.restoreGState()
    }
    return renderingRect
}

graphController 只是一个对象,其功能与通常包含图形的父对象 ViewController 基本相同。设置图形参数和数据。

完成后调用下面的函数在 PDF 页面上下文中呈现。

需要一些翻译才能将图表放在正确的位置。

选项 2:在 CGContect PDF 页面上绘图

解决方案是……太……

func drawBarGraph(x: CGFloat, y: CGFloat)->CGRect{

        let width = (pageSize.width - 2*kBorderInset - 2*kMarginInset)/2.0 - 50.0

        let renderingRect = CGRect(x: x + width + 50, y: y + 50.0, width: width, height: 150.0)

        // Create a view for the Graph
        let graphController = BarChartController(rect: renderingRect, building: self.building)

        if let currentContext = UIGraphicsGetCurrentContext() {

            let frame = graphController.chartView.frame
            currentContext.saveGState()
            currentContext.translateBy(x:frame.origin.x, y:frame.origin.y)

            //graphController.chartView.layer.render(in: currentContext)
            graphController.chartView.draw(frame)

            currentContext.restoreGState()   

        }
        return renderingRect
    }

由于当前上下文设置为 PDF 页面的上下文,只需调用图表 draw() 函数直接传递框架矩形。

我错过了什么,能这么简单吗?

您可以找到 generated PDF here as well as sample code 的副本。