最近有个朋友想做一个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. 在Visual Sutdio 2017中使用boost库

    在Visual Sutdio 2017中使用boost库     转载 https://blog.csdn.net/u011054333/article/details/78648294 对C++有一 ...

  2. Go版GTK:环境搭建(windows)

    Go版GTK:环境搭建(windows) https://blog.csdn.net/tennysonsky/article/details/79221507 所属专栏: Go语言开发实战     1 ...

  3. Largest Rectangle in a Histogram POJ - 2559 (单调栈)

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...

  4. HashMap 源码阅读

    前言 之前读过一些类的源码,近来发现都忘了,再读一遍整理记录一下.这次读的是 JDK 11 的代码,贴上来的源码会去掉大部分的注释, 也会加上一些自己的理解. Map 接口 这里提一下 Map 接口与 ...

  5. Why Did the Cow Cross the Road III HYSBZ - 4991 -CDQ-逆序数

    HYSBZ - 4991 题意: 第一列 1-n的排列 ,第二列 1-n的排列.  相同数字连边  ,问  有多少组 数字 是有交点的并且 绝对值之差>K思路:处理一下 1-n 在第一列的位置, ...

  6. java多线程之守护线程(Daemon)

    https://blog.csdn.net/u010739551/article/details/51065923/

  7. ubantu 执行sudo apt-get update 出现校验不符问题

    一直被这个问题困扰,今天安装mongodb时,看了别人博客暂时解决了,不知道会不会出什么问题. 直接打开软件更新器: 然后点击其他软件,去掉两个独立的多选项: 再执行一遍 sudo apt-get u ...

  8. python 条件与循环

    一.if语句   1.1 功能 计算机又被称作电脑,意指计算机可以像人脑一样,根据周围环境条件(即expession)的变化做出不同的反应(即执行代码) if语句就是来控制计算机实现这一功能   1. ...

  9. Asp.Net判断文件是否存在

    在上传文件时经常要判断文件夹是否存在,如果存在就上传文件,否则新建文件夹再上传文件 判断语句为 if (System.IO.Directory.Exists(Server.MapPath(" ...

  10. 基于CC2530/CC2430 的温度采集系统--DS18B20

    DS18B20是常用的温度传感器.CC2530 采集DS18B20 可以实现温度采集系统等等. 模块链接:https://item.taobao.com/item.htm?id=54130861732 ...