iOS开发之Quartz2D生成PDF-Part1

iOS开发之Quartz2D生成PDF-Part2 iOS开发之Quartz2D生成PDF-Part2在上一节当中,我们创建了一个基于Quartz2D的PDF,并在PDF中添加一线条。 在这一节,主要是添加一个logo,和绘制一个table。添加logo下载图片资源,然后添加到工程当中。在`PDFRenderer.m`文件中添加下面方法: //绘制图像 + (void)drawImage:(UIImage*)image inRect:(CGRect 阅读详情

iOS开发之Quartz2D生成PDF-Part1

使用iOS的Quartz2D 生成PDF文件

首先创建一个工程,导入CoreText.framework框架。在PDFViewController.h文件中引入CoreText文件

#import <CoreText/CoreText.h>

在PDFViewController.m文件中创建一个新方法:

-(void)drawText
{
    NSString* fileName = @"Invoice.PDF";

    NSArray *arrayPaths =
    NSSearchPathForDirectoriesInDomains(
                                        NSDocumentDirectory,
                                        NSUserDomainMask,
                                        YES);
    NSString *path = [arrayPaths objectAtIndex:0];
    NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];

    NSString* textToDraw = @"Hello World";
    CFStringRef stringRef = (__bridge CFStringRef)textToDraw;

    // 使用 Core Text Framesetter.
    CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, stringRef, NULL);
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);

    CGRect frameRect = CGRectMake(0, 0, 300, 50);
    CGMutablePathRef framePath = CGPathCreateMutable();
    CGPathAddRect(framePath, NULL, frameRect);

    // 获取将要被渲染的帧
    CFRange currentRange = CFRangeMake(0, 0);
    CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
    CGPathRelease(framePath);

    // 创建一个PDF的上下文,页面大小默认为 612 x 792
    UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);

    // 标记新页面的开头
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);

    // 获取上下文.
    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    // 把文字变成矩阵已知状态。这将确保没有旧缩放因子被留在原处。
    CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);

    //文本坐标翻转
    CGContextTranslateCTM(currentContext, 0, 100);
    CGContextScaleCTM(currentContext, 1.0, -1.0);

    // 绘制帧
    CTFrameDraw(frameRef, currentContext);

    CFRelease(frameRef);
    CFRelease(stringRef);
    CFRelease(framesetter);

    //关闭PDF上下文
    UIGraphicsEndPDFContext();

}

此方法有点长,在此分段解释下:

在沙盒目录下创建PDF文件,并命名为Invoice.pdf

NSString* fileName = @"Invoice.PDF";

NSArray *arrayPaths =
NSSearchPathForDirectoriesInDomains(
                                    NSDocumentDirectory,
                                    NSUserDomainMask,
                                    YES);
NSString *path = [arrayPaths objectAtIndex:0];
NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];

下面的代码块是创建一个已“Hello,world”为内容的PDF,将string转换为CFStringRef格式

NSString* textToDraw = @"Hello World";
CFStringRef stringRef = (__bridge CFStringRef)textToDraw;

CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, stringRef, NULL);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);

然后是创建一个CGRect用于定义文本的大小

CGRect frameRect = CGRectMake(0, 0, 300, 50);
CGMutablePathRef framePath = CGPathCreateMutable();
CGPathAddRect(framePath, NULL, frameRect);

CFRange currentRange = CFRangeMake(0, 0);
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
CGPathRelease(framePath);

接下来,我们创建一个PDF上下文和标记的PDF的起始页。 PDF的每个页面都有开始并调用UIGraphicsBeginPDFPageWithInfo 。

UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);

UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);

CGContextRef currentContext = UIGraphicsGetCurrentContext();

由于Core Graphics 的坐标是从左下角开始,而UIKit的坐标是从左上角开始,所以需做一个变换:

CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);

CGContextTranslateCTM(currentContext, 0, 100);
CGContextScaleCTM(currentContext, 1.0, -1.0);

我们绘制文本实际帧,释放Core Graphics对象,并关闭PDF上下文至此PDF写入到沙盒目录下。

CTFrameDraw(frameRef, currentContext);

CFRelease(frameRef);
CFRelease(stringRef);
CFRelease(framesetter);

UIGraphicsEndPDFContext();
使用UIWebView展示PDF文件

在PDFViewController.m中的drawText方法后添加下面方法:

-(void)showPDFFile
{
    NSString* fileName = @"Invoice.PDF";

    NSArray *arrayPaths =
    NSSearchPathForDirectoriesInDomains(
                                        NSDocumentDirectory,
                                        NSUserDomainMask,
                                        YES);
    NSString *path = [arrayPaths objectAtIndex:0];
    NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];

    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

    NSURL *url = [NSURL fileURLWithPath:pdfFileName];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView setScalesPageToFit:YES];
    [webView loadRequest:request];

    [self.view addSubview:webView];    
}

在viewDidLoad中添加

- (void)viewDidLoad
{
    [self drawText];
    [self showPDFFile];

    [super viewDidLoad];
}
工业排程中遗传算法落地的四大支柱与12个实战陷阱 遗传算法作为经典启发式优化方法,其核心原理在于模拟自然选择过程实现解空间搜索,但在实际工业场景中,简单套用标准框架极易遭遇早熟收敛、非法解泛滥、结果不稳定等工程瓶颈。本文聚焦产线柔性排程这一典型离散优化问题,深入解析如何通过重构选择策略、工艺感知交叉、邻域导向变异及分层动态适应度函数,系统性提升算法鲁棒性与可解释性。内容深度融合种群多样性控制、硬软约束协同建模等关键技术,并覆盖冷启动、数据噪声、人机协同等真实部署盲区,为智能制造领域算法工程师提供可复用、可验证、带油渍味的GA工程化实践指南。 阅读详情

相关推荐

iOS开发教程之在 Swift 中使用 PDFKit 动态生成 PDF(教程含源码)

在开发 Swift 应用程序时,动态生成 PDF 报告非常有用。您的用户将能够在旅途中创建他们自己的个性化报告,他们将能够非常轻松地导出这些报告。

iCloudEnd的博客 2211

iOS Swift 绘制PDF,超长字符串分页绘制

最近自己做个小项目,需要把数据绘制成PDF打印出来。 在研究PDF绘制的过程中,发现国内在这方面很难搜到优质有深度的内容,尤其是超长字符串分页绘制,基本没找到解决方案(我使用的原生方法绘制,所以不考虑使用HTML的情况)。无奈去google,在stackover上找到一篇帖子,根据它的思路,终于实现了基础功能。 使用PDFKit,绘制部分基本都是CoreGraphics,多行文字分页绘制使用了CoreText。 具体代码如下: 这是数据模型,主要记录每天早中晚饭,几点,吃的什么。 /// 组数据

pilgrim1385的专栏 955

Quartz如何从入门到精通.pdf

Quartz如何从入门到精通

Quartz2D 之 绘制文本

1. 基础概念 1.1. 字体(Font)   同一大小、同一样式的字形的集合。 1.2. 字符(Character)   字符表示信息本身,一般指某种编码,如Unicode编码。 1.3. 字形(Glyphs)   字符+字体就会有个对应的图片,这个图片就是字形。 1.3. 字形描述集(Glyphs Metris)   字形的各个参数: 边框(Bounding Box)...

weixin_33701617的博客 122

ios-PDF文件的生成、显示(已封装).zip

用的ipadair模拟器,工程要用pdf文件。没找到好的,只好自己写了一个。两个方法,一个生成,保存到本地的,一个从本地获取显示到webview上的。使用的时候绝对简单。

iOS多张图片生成pdf文件

iOS(OC)实现通过多张图片生成一个完成的PDF文件,pdf单页宽高克自己调整

Quartz 2D编程指南(13) - PDF文档的创建、显示及转换

PDF文档存储依赖于分辨率的向量图形、文本和位图,并用于程序的一系列指令中。一个PDF文档可以包含多页的图形和文本。PDF可用于创建跨平台、只读的文档,也可用于绘制依赖于分辨率的图形。          Quartz为所有应用程序创建高保真的PDF文档,这些文档保留应用的绘制操作,如图13-1所示。PDF文档的结果将通过系统的其它部分或第三方法的产品来有针对性地进行优化。Quartz创建的PDF

cpskiss的专栏 1818

IOS生成pdf文档

IOS中生成PDF文档代码 使用Quartz2D绘图

iOS 创建PDF文件

PDF 创建,PDFKit ,UIGraphicsPDFRendererFormat

HumorousGhost 2285

VS2019中C++动态链接库(DLL)的创建与调用

VS2019中C++动态链接库(DLL)的创建与调用,及一些进阶技巧。

qq_42232522的博客 7562

openwrt编译及第一个安装包教程

Date: 2017.03.14 Made:SuperDeverloper Email: na1206@live.com Target: For mt7688 based board说明:本人在学习过程中走了不少弯路,希望本文档能为后来者提供便利。欢迎复制和使用本文档。本文档记录了搭建openwrt编译环境以及快速创建ipk包(openwrt上的安装程序)。本文档在实际应用中做过几次修改,以帮

SuperDevloper的博客 1万+

IOS之Quartz2D绘图6.PDF文档生成

使用quartz2d生成pdf文档,我们需要创建pdf文档的上下文 UIGraphicsBeginPDFContextToFile 第一个参数为PDF文档存储路迹,通过下面代码获取document的路径 NSArray*array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

Steven Chen 1128

【外挂编程】外挂编程技术揭秘(二)

引言: 经过上一篇文章大家可能对外挂有了一个初步的认识,之前的内容比较简单,应该大家很容易掌握。我写作过程中我发现三个篇幅可能写不完,后续还可能要多加几个篇幅,这篇我们就先以内存挂为主吧。话不多说了,让我们开始吧。 文章中代码github地址: https://github.com/Diamonds-ZhaoYu/hz_example 环境要求: 系统:Windows 语言...

c-rain 4033

Quartz 2D

1.1 The Graphics Context所有的东西都是画在CGContextRef类型的对象上Quartz 2D中一些数据类型 CGPathRef:用于绘画的线 CGImageRef:一个矢量图片 CGLayerRef:一个绘画层,可以重复绘画和离屏绘画 CGPatternRef:用于重复绘画的 CGShadingRef和CGFrandientRef:用于渐变绘画 CGFunctionRef

xinxisxx的专栏 732

新手必看:如何用PhaGCN2和vConTACT2搞定宏病毒组注释(附避坑指南)

本文为宏病毒组研究新手提供了使用PhaGCN2和vConTACT2进行病毒注释的完整实战指南。内容涵盖从Conda环境配置、软件安装、参数解析到结果解读的全流程,并重点分享了整合双工具进行交叉验证的策略与常见报错解决方案,旨在帮助研究者高效、准确地完成病毒分类注释工作。

j2k3l4的博客 797

告别误唤醒!S32K3xx低功耗设计避坑指南:Fast Standby模式与WISR寄存器操作详解

本文深入解析了NXP S32K3xx系列MCU在低功耗设计中常见的误唤醒问题,并提供了基于Fast Standby模式的解决方案。文章重点剖析了DCMRWF5寄存器的配置方法、WISR/WISR_64唤醒中断状态寄存器的标志位处理策略,以及如何利用32KB Standby SRAM保存唤醒状态,从而帮助开发者构建稳定可靠的汽车电子低功耗系统。

weixin_29163857的博客 361

Quartz-2D绘图之图形上下文详解

上一篇文章大概描述了下Quartz里面大体所包含的东西,但是对具体的细节实现以及如何调用相应API却没有讲。这篇文章就先讲讲图形上下文(Graphics Context)的具体操作。 所谓Graphics Context,其实就是表示了一个绘制目标,也就是你打算绘制的地方,它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息。Graphics Context定义了基本的绘制属性,如颜色...

weixin_30287169的博客 198

VIO实战前传:手把手教你解读Kalibr双目IMU标定报告与参数应用

本文详细解析Kalibr双目IMU联合标定报告的核心参数与应用方法,涵盖重投影误差分析、IMU误差指标解读、关键变换矩阵原理及VINS-Fusion实战配置。通过手把手教学帮助开发者准确理解标定结果,解决VIO算法落地中的参数配置难题,提升视觉惯性里程计的系统稳定性与精度。

weixin_42699679的博客 331

在iOS5中使用Quartz 2D创建PDF-第一部分

翻译自:How To Create a PDF with Quartz 2D in iOS 5 有时候在app中可能会需要使用app中的数据来创建PDF。例如,你有一个app允许用户签一个合同,你就可能希望用户得到最终的PDF。 但是如何使用程序来生成PDF呢?在iOS中使用Quartz2D会很容易的做到。 在这个教程中,你会亲自体验到,使用 Quartz2D 创建一个简单的 PDF。我们生成

了凡 1088

fNIRS 公开数据集整理

关注“心仪脑”查看更多脑科学知识的分享。 关键词:数据整理、fNIRS 之前我们向大家推送了 Public Neuroscience Dataset 系列主题的第一期:《EEG公开数据集》,我们同时意识到大家对于神经科学公开数据集的需求。本期是该系列主题的第二期,我们在延续第一期初衷的基础上,整理了功能性近红外光谱(fNIRS)技术的公开数据集。 fNIRS 是一种非侵入性、便携且价格低廉的光学神经成像技术,它具有可观的空间和时间分辨率。因fNIRS技术问世较EEG晚了许多,所以应用此技术开展研究发.

psybrain的博客 4271

车载软件架构 —— AUTOSAR Vector SIP包(三)

### 上一篇文章中介绍了AUTOSAR基础软件供应商Vector公司的开发工具链,本文将继续介绍Vector公司的AUTOSAR产品。 ### -> 1、Vector SIP包中的StartApplication ### -> 2、StartApplication如何开始使用

Soly_kun的博客 828

iOS PDF文件生成

1.把scrollView上面的内容生成PDF文件,代码如下: (NSString *)createPDF { NSDate*printTime = [NSDatedate]; NSString*fileName = [NSStringstringWithFormat:@"%@%@%@.pdf",self.user.real_name,self.title, [self.dateHourMinuteFormatterstringFromDate:printTime]]; NSURL*storeURL =

ioslingbing的博客 899

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

UIKit Graphics System--Creating and Configuring the PDF Context学习笔记3

Generating PDF Content  UIkit框架通过提供一系列的函数用于创建一个PDF。通常情况下创一个PDF文档需要一下几个步骤: 1、通过UIGraphicsBeginPDFContextToFile创建一个PDF context,并且将这个context和一个系统目录下文件名关联 2、通过UIGrapicsBeginPDFPage函数打开或者创建PDF的新一页,关闭之

709

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【深度解析】PDF凭什么是macOS原生格式?一文吃透开放标准与Quartz图形系统的渊源,附跨平台避坑手册

摘要:PDF不仅是一种文档格式,更是一套开放标准的矢量图形语言,其前身PostScript奠定了跨平台一致性的基础。macOS通过Quartz图形系统深度集成PDF,将其作为系统级元文件格式,实现剪贴板矢量数据交换和UI渲染。开发者在使用PDFKit时需注意坐标翻转和字体嵌入等细节,而跨平台协作中要检查字体、颜色空间和兼容性问题。命令行工具如Ghostscript可辅助修复PDF结构,避免依赖重型软件。

民乐团扒谱机的博客 414

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ios开发之--PDF文件生成

写项目的时候,碰到一个需求,就是在手机端根据指定的文件内容生成PDF文件,并可以保存到手机上,因为以前只是听说过,没有真正的去了解过这个需求,通过查阅资料,可以实现这个功能,话不多说,代码如下: -(void)creatPDFfile { // 1.创建media box CGFloat myPageWidth = self.view.bounds.size.width...

weixin_34174105的博客 342

Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts)

一个Graphics Context表示一个绘制目标。它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息。Graphics Context定义了基本的绘制属性,如颜色、裁减区域、线条宽度和样式信息、字体信息、混合模式等。 我们可以通过几种方式来获取Graphics Cont

跑吧的专栏 4823
上一篇: iOS 绘制1像素线条总结
下一篇: iOS开发之Quartz2D生成PDF-Part2
Cola-Bean
博客等级 码龄13年 5粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值