OHPDFImage 3.2.1

OHPDFImage 3.2.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2015年5月

Olivier Halligon维护。



  • 作者
  • Olivier Halligon

该库旨在轻松将 PDF 文档加载为矢量图像使用。

安装

安装此库的推荐方法是使用 CocoaPods。只需将其添加到您的 Podfile

pod 'OHPDFImage'

将 PDF 文件添加到您的项目

如果您打算将 PDF 作为矢量图像使用,您应将其添加为项目的资源。特别是,您不应该将 PDF 添加到您的 Images.xcassets 资源目录中。

不要使用资源目录对 PDF 文件进行操作

Xcode 6 接受将 PDF 文件添加到资源目录,但这样做时,它会实际上在编译时重建 PNG 资产,而不是嵌入原始的 PDF 矢量图像,而是将位图嵌入最终应用程序中。这就是为什么您应该将 PDF 文件作为标准资源添加,而不是添加到 xcassets 目录中的原因。

从 Photoshop 导出 PDF 文件

如果您的矢量图像已使用 Photoshop 创建,您想要将其导出为 PDF,您可以选中“另存为…”菜单项,选择“Photoshop PDF”文件格式以创建 PDF。
在这种情况下,请注意选择 “高质量打印”预设,它是唯一可以保存 PDF 透明度/alpha 通道的预设。

将 PDF 作为图像使用

UIImage 类别

如果您只想将 PDF 作为原始图像使用,您可以使用

self.imageView.image = [UIImage imageWithPDFNamed:@"vector_image"
                                        fitInSize:self.imageView.bounds.size];

这将加载 PDF,使用其第一页创建一个 OHVectorImage,然后将其矢量图像渲染为请求的大小为 UIImage,确保保持其宽高比。

注意:页面被缓存,所以,即使使用相同的 PDF 名称请求图像(即使大小不同),也将使用缓存版本而不是从磁盘再次加载。因此,只有将矢量图像转换为位图图像的过程会被重新创建。

通过 OHVectorImage 类获得更多控制

如果您需要对矢量图像的渲染有更多选项,您可以直接操作 OHVectorImage 对象。这里是在使用 OHVectorImage 时可以做的事情。

  • 更改生成的图像的背景颜色 使用 backgroundColor 属性(nil 生成透明图像);
  • 重新着色图像 使用 tintColor 属性(在这种情况下 PDF 仅用作蒙版,仅使用其 alpha 通道);
  • 添加投影 使用 shadow 属性(一个 NSShadow 对象,允许您自定义阴影偏移、模糊半径和颜色);
  • 在渲染时向图像添加内边距UIEdgeInsets
    • 以将图像向任何方向翻译,
    • 或将边距添加到图像(当您添加投影以确保其不被裁剪时很有用),
    • 或通过使用负内边距来减少/移除原始 PDF 中存在的边距
    • ...
  • 在矢量图像渲染之前自定义图形上下文,使用 prepareContextBlock 属性
    • 这主要用于高级使用,例如在渲染 PDF 向量图像之前将自定义转换或添加自定义剪切路径应用到 CGContextRef

投影和内边距

投影值(偏移量和模糊半径)以及内边距以矢量图像的坐标系表示(即具有与使用其 nativeSize 渲染矢量图像相同的比例),以便它们可以是无缩放依赖的。

这样,如果您添加了具有 shadowOffset = (CGSize){2,2}blurRadius = 3 的投影,则可以安全地使用 inset = (UIEdgeInsets){ .right = 5, .bottom = 5 } 来确保阴影不会被裁剪,而无需担心图像将渲染的大小。

保持宽高比

  • 当您使用预期的尺寸调用 -[OHVectorImage renderAtSize:] 时,它不会尝试保持宽高比,只是简单地使用给定的尺寸按原样使用,在必要时拉伸图像(“按需缩放”行为)。

  • 如果您想保持原始 PDF 的宽高比,您可以使用 -[OHVectorImage sizeThatFits:] 来计算适合给定大小的大小,然后使用这个大小调用 -[OHVectorImage renderAtSize:]

注意:这是 +[UIImage imageWithPDFNamed:fitInSize:] 内部实际上所做的事情。

当计算适合大小的时候,sizeThatFits: 方法会考虑矢量图像的 insets 属性——因为这些 insets 值在渲染时也会应用。

  • 由于想要保持宽高比是一个相当常见的用例,提供了一个便利方法 -[OHVectorImage renderAtSizeThatFits:],它会简单地在两个上述方法之间依次调用。

  • 您还可以使用 -[OHVectorImage scaleForSize:] 方法,该方法返回一个包含要应用于缩放矢量图像的给定大小的缩放因子的 CGSize。这基本上返回将给定 size 除以矢量图像 nativeSize 的结果,但也考虑到 insets

注意:实际上,sizeThatFits: 使用这些缩放因子的 MIN(width, height) 来确定用于在提供的尺寸中“按宽高比适应”图像的缩放因子。如果您需要将图像缩放以至于“按宽高比填充”——如果需要,则可能裁剪图像以填充整个尺寸——您可以使用 MAX(width, height) 来计算缩放以及渲染图像的尺寸。

示例

OHVectorImage* vImage = [OHVectorImage imageWithPDFNamed:@"vector_image"];
vImage.backgroundColor = [UIColor colorWithRed:0.9 green:1.0 blue:0.9 alpha:1.0];
vImage.tintColor = [UIColor redColor];
// Shadow & Insets
vImage.shadow = [NSShadow new];
vImage.shadow.shadowOffset = CGSizeMake(2,2);
vImage.shadow.shadowBlurRadius = 3.f;
vImage.shadow.shadowColor = [UIColor darkGrayColor];
vImage.insets = UIEdgeInsetsMake(0,0,5,5);
// Render as an UIImage, ensuring to keep aspect ratio
UIImage* image = [vImage renderAtSizeThatFits:imageViewSize];

此存储库中提供的示例项目中也提供了一个完整的示例。请勿犹豫尝试它(即使您还没有克隆存储库,也可以使用 pod try OHPDFImage 尝试!)

加载PDF文档

本库的主要目标是使用UIImage分类或直接使用OHVectorImage类将PDF作为图像使用。

但是,您也可以使用OHPDFDocumentOHPDFPage类来加载PDF文档,获取其页面,并在您提供的图形上下文(CGContextRef)中单独渲染这些页面。

您还可以使用此功能获取指定PDF的任意页面以生成矢量图像(而不是默认使用第一页)。
例如,以下代码将PDF的每一页作为矢量图像读取,并从中构建一个动画UIImage

NSURL* pdfURL = [[NSBundle mainBundle] URLForResource:@"vector_images" withExtension:@"pdf"];
OHPDFDocument* doc = [OHPDFDocument documentWithURL:pdfURL];
NSMutableArray* frames = [NSMutableArray arrayWithCapacity:doc.pagesCount];
CGSize frameSize = CGSizeMake(100,100);
for(size_t pageNum = 0; pageNum < doc.pagesCount; ++pageNum)
{
  OHPDFPage* page = [doc pageAtIndex:pageNum+1]; // Note: page indexes start at 1
  OHVectorImage* vImage = [OHVectorImage imageWithPDFPage:page];
  [frames addObject:[vImages renderAtSize:frameSize]];
}

NSTimeInterval duration = doc.pagesCount * 2.0; // 2.0s per frame 
UIImage* animatedImage = [UIImage animatedImageWithImages:frames
                                                 duration:duration];

版权

本库由Olivier Halligon编写,并按MIT许可证分发(见LICENSE文件)。