最近有个朋友想做一个pdf预览,要求能够上下滑动翻页、带缩放、目录跳转功能。

因为之前我只做过简单的预览,那时直接用uiwebview实现的,这次找了下资料,发现一个比较好的库。

其原理实现:

自定义uiview来显示pdf+使用的是苹果官方的api读取目录+uiscrollview实现缩放及翻页。

不过这个库是左右翻页的,我不是很习惯,就改成了上下滑动翻页,并且在底部添加了页码显示(1/10格式)。

效果图如下:

其中几段核心代码:

1、加载pdf文件

CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (__bridge CFStringRef)@"002.pdf", NULL, NULL);
pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
CFRelease(pdfURL);

2、获取pdf文件目录

#pragma mark 获取pdf文件目录
- (NSArray *)getPDFContents: (CGPDFDocumentRef) myDocument
{ CGPDFDictionaryRef mycatalog= CGPDFDocumentGetCatalog(myDocument);
CommentNode *rootNode = [[CommentNode alloc] initWithCatalog:mycatalog];
CommentNode *rootOutlineNode = [rootNode childrenForName:@"/Outlines"];
CommentNode *pagesNode = [rootNode childrenForName:@"/Pages"];
NSArray *pagesArray = [self getPagesFromPagesNode:pagesNode];
CommentNode *destsNode = [rootNode childrenForName:@"/Dests"]; return [self getContentsForOutlineNode:rootOutlineNode pages:pagesArray destsNode:destsNode];
} - (NSArray *)getContentsForOutlineNode:(CommentNode *)rootOutlineNode pages:(NSArray *)pagesArray destsNode:(CommentNode *)destsNode
{
NSMutableArray *outlineArray = [[NSMutableArray alloc] init];
CommentNode *firstOutlineNode = [rootOutlineNode childrenForName:@"/First"];
CommentNode *outlineNode = firstOutlineNode;
while (outlineNode) {
NSString *title = [[outlineNode childrenForName:@"/Title"] value];
CommentNode *destNode = [outlineNode childrenForName:@"/Dest"];
NSMutableDictionary *outline = [NSMutableDictionary dictionaryWithDictionary:@{@"Title": title}];
int index = ;
if (destNode) {
if ([[destNode typeAsString] isEqualToString:@"Array"]) {
CGPDFObjectRef dest = (__bridge CGPDFObjectRef)[[[destNode children] objectAtIndex:] object];
index = [self getIndexInPages:pagesArray forPage:dest];
} else if ([[destNode typeAsString] isEqualToString:@"Name"]) {
NSString *destName = [destNode value];
CGPDFObjectRef dest = (__bridge CGPDFObjectRef)[[[[[destsNode childrenForName:destName] childrenForName:@"/D"] children] objectAtIndex:] object];
index = [self getIndexInPages:pagesArray forPage:dest];
}
} else {
CommentNode *aNode = [outlineNode childrenForName:@"/A"];
if (aNode) {
CommentNode *dNode = [aNode childrenForName:@"/D"];
if (dNode) {
CommentNode *d0Node = [[dNode children] objectAtIndex:];
if ([[d0Node typeAsString] isEqualToString:@"Dictionary"]) {
CGPDFObjectRef dest = (CGPDFObjectRef)[d0Node object];
index = [self getIndexInPages:pagesArray forPage:dest];
}
}
}
}
[outline setObject:@(index) forKey:@"Index"];
NSArray *subOutlines = [self getContentsForOutlineNode:outlineNode pages:pagesArray destsNode:destsNode];
[outline setObject:subOutlines forKey:@"SubContents"];
[outlineArray addObject:outline];
outlineNode = [outlineNode childrenForName:@"/Next"];
}
return outlineArray;
} - (NSArray *)getPagesFromPagesNode:(CommentNode *)pagesNode
{
NSMutableArray *pages = [NSMutableArray new];
CommentNode *kidsNode = [pagesNode childrenForName:@"/Kids"];
for (CommentNode *node in [kidsNode children]) {
NSString *type = [[node childrenForName:@"/Type"] value];
if ([type isEqualToString:@"/Pages"]) {
NSArray *kidsPages = [self getPagesFromPagesNode:node];
[pages addObjectsFromArray:kidsPages];
} else {
[pages addObject:node];
}
}
return pages;
} - (int)getIndexInPages:(NSArray *)pages forPage:(CGPDFObjectRef)page
{
for (int k = ; k < pages.count; k++) {
CommentNode *node = [pages objectAtIndex:k];
if ([node object] == page)
return k+;
}
return ;
}

源码获取:https://github.com/TangledHusky/YJ-PDFReader/tree/master

特别鸣谢:

参考文献:https://blog.csdn.net/shenshucong520/article/details/51578695

iOS实现pdf文件预览,上下翻页、缩放,读取pdf目录的更多相关文章

  1. Vue PDF文件预览vue-pdf

       最近做项目,遇到预览PDF这个功能,在网上找了找,大多推荐的是pdf.js,不过在Vue中还是想偷懒直接npm组件,最后找到了一个还不错的Vue-pdf 组件,GitHub地址:https:// ...

  2. java 文件转成pdf文件 预览

    一.前端代码 //预览功能 preview: function () { //判断选中状态 var ids =""; var num = 0; $(".checkbox& ...

  3. PDF文件预览和下载

    背景:项目中实现pdf文件的预览以及下载 环境:jdk1.8.SpringBoot2.0.Maven    PDF.js下载地址将下载的源码拷入项目中    修改viewer.js: 将default ...

  4. 利用 ICEpdf 快速实现 pdf 文件预览功能

    之前工作中,需要实现一个在线预览pdf的功能,一开始用的的 jQuery-media 插件来实现的,后来感觉有点慢,就继续寻找更好的替代品,直到遇见了 ICE pdf... ICEpdf (官网:ht ...

  5. vue中如何实现pdf文件预览?

    今天产品提出一个优化的需求,就是之前我们做的图片展示就是一个img标签搞定,由于我们做的是海外后台管理系统,那边的人上传的文件时pdf格式,vue本事是不支持这种格式文件展示的,于是就google搜索 ...

  6. 实战动态PDF在线预览及带签名的PDF文件转换

    开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是这个想法,说干就干,实践过程总是艰难的,折腾了3 ...

  7. 动态PDF在线预览

    实战动态PDF在线预览及带签名的PDF文件转换 开篇语: 最近工作需要做一个借款合同,公司以前的合同都是通过app端下载,然后通过本地打开pdf文件,而喜欢创新的我,心想着为什么不能在线H5预览,正是 ...

  8. 关于pc端 app端pdf,word xls等文件预览的功能

    第一种用H5标签<iframe>标签实现 返回的文件类型,文件流,文件流返回必须在设置 contentType对应的Mime Type, 返回文件的物理位置. 已经实测可以支持的文件类型 ...

  9. Office在线预览及PDF在线预览的实现方式史上最全大集合

    Office在线预览及PDF在线预览的实现方式大集合 一.服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office2007以上版本的一个PDF插件SaveAsPD ...

随机推荐

  1. Zookeeper的概述、安装部署及选举机制

    一.Zookeeper概述 1.Zookeeper是Hadoop生态的管理者,它致力于开发和维护开源服务器,实现高度可靠的分布式协调. 2.Zookeeper的两大功能: (1)存储数据 (2)监听 ...

  2. Stm32基础

    Stm32基础 目录 常用功能函数 跑马灯实验 蜂鸣器实验 按键实验 端口复用与重映射 常用功能函数 初始化gpio函数 作用:初始化一个或者多个io口(同一组)的工作方式和速度该函数主要是操作GPI ...

  3. [ 高危 ] mt网主站SQL注入

    rank  75 金币  75 等价RMB  750 数据包样式如下 POST /ajax.php HOST: xxx.meituan.com Cookie: xxx id=123&job= ...

  4. 附001.kubectl介绍及使用

    一 kubectl介绍 1.1 kubectl概要 kubectl控制Kubernetes集群管理器,使用Kubernetes命令行工具kubectl在Kubernetes上部署和管理应用程序.使用k ...

  5. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

  6. BZOJ.2324.[ZJOI2011]营救皮卡丘(费用流 Floyd)

    BZOJ 洛谷 首先预处理出\(dis[i][j]\),表示从\(i\)到\(j\)的最短路.可以用\(Floyd\)处理. 注意\(i,j\)是没有大小关系限制的(\(i>j\)的\(dis[ ...

  7. Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)

    题目链接 \(Description\) 给定\(n\)个正整数\(a_i\).求有多少个子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),满足\(a_{i_1},a_{i_2}, ...

  8. centos6安装openresty

    1.安装依赖库 yum install readline-devel pcre-devel openssl-devel gcc 2.下载openresty wget --no-check-certif ...

  9. 2546 ACM 01背包

    题目http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路:再01背包的问题上稍作修改 如何满足 :卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购 ...

  10. System.ServiceModel.AddressAccessDeniedException

    发生了 System.ServiceModel.AddressAccessDeniedException   HResult=0x80131501   Message=HTTP 无法注册 URL ht ...