【问题标题】:Is it possible to use iOS Charts (Daniel Gindi) to generate graphs in pdf document on iOS是否可以使用 iOS Charts (Daniel Gindi) 在 iOS 上的 pdf 文档中生成图表
【发布时间】:2018-05-18 22:27:44
【问题描述】:

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

据我了解,有几种选择:

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

似乎选项 1 可能是获得最佳分辨率/控制的首选方式 - 有点推测 - 这样做意味着您应该能够指定确切的位置和大小并获得正确的字体大小、线条粗细等..

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

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

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

【问题讨论】:

    标签: pdf ios-charts


    【解决方案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 的副本。

    【讨论】:

    • 但是它将如何绑定数据?你确定它会生成带有图中数据的 pdf 吗?
    • 如果我知道如何将 pdf 附加到我的答案中,我会附加输出。我将附上一个放大视图的 png,以便您自己查看。 graphController 提供数据源。为了完整起见,我也会发布控制器类。
    • @CodeChanger - 我已经用生成的 PDF 文件的链接更新了我的答案 - 你可以自己查看。我会在某个时候发布更多代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多