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

时间:2018-05-18 22:27:45

标签: pdf ios-charts

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

据我了解,有几个选择:

  1. 使用pdf文档的图形上下文绘制图表 - 当使用图表库时,不清楚这是否可行
    1. 以某种方式使用UIView生成图形并从中生成PDF图像数据,将此图像嵌入到pdf报告中
  2. 似乎选项1可能是获得最佳分辨率/控制的首选方式 - 有些推测 - 这样做意味着您应该能够指定确切的位置和大小并获得正确的字体大小,线条粗细等..

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

    任何人都可以就以下内容提出任何建议:

    1. 是否可以使用图表在PDF文档中生成图形,如果可以,如何生成?
    2. 如果不是其他选项,则不要编写自定义绘图代码。

1 个答案:

答案 0 :(得分:1)

好的,这就是我所做的

选项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:绘制PDF页面CGContect

解决方案是... ta da ...

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的副本。