SDWebImagePDFCoder

CI Status Version License Platform Carthage compatible SwiftPM compatible

这是什么?

SDWebImagePDFCoder 是 SDWebImage 框架的一个 PDF 编码插件,它为 PDF 提供图像加载支持。 PDF 渲染使用 Apple 的内置框架 (UIKit/AppKit/Core Graphics) 完成。

示例

要运行示例项目,请克隆 repo,然后首先从 Example 目录运行 pod install

您可以修改代码或使用其他 PDF 文件来检查兼容性。

要求

安装

CocoaPods

SDWebImagePDFCoder 可以通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中

pod 'SDWebImagePDFCoder'

Carthage

SDWebImagePDFCoder 可以通过 Carthage 获得。

github "SDWebImage/SDWebImagePDFCoder"

Swift Package Manager (Xcode 11+)

SDWebImagePDFCoder 可以通过 Swift Package Manager 获得。

let package = Package(
    dependencies: [
        .package(url: "https://github.com/SDWebImage/SDWebImagePDFCoder.git", from: "1.0")
    ]
)

用法

要使用 PDF 编码器,您应该首先将 SDImagePDFCoder 添加到编码器管理器。 然后,您可以调用 View Category 方法来开始加载 PDF 图像。

使用 UIImageView 矢量渲染 (iOS/tvOS 11+, Mac)

重要提示:Apple 从 iOS/tvOS 11+ 开始为 UIKit 添加了对 PDF 格式的内置矢量图像支持。 这意味着您可以使用 PDF 数据创建一个 UIImage,并将其设置在 UIImageView 上。 当 imageView 的 bounds/contentMode 更改时,PDF 图像也会被缩放而不会丢失任何细节。 您还可以将 +[UIImage imageNamed:] 与 Xcode Asset Catalog 一起用于 PDF 图像,请记住启用 Preserve Vector Data

对于 macOS 用户,NSImage/NSImageView 从一开始就支持 PDF 图像。 像往常一样使用它。

SDImagePDFCoder *PDFCoder = [SDImagePDFCoder sharedCoder];
[[SDImageCodersManager sharedManager] addCoder:PDFCoder];
UIImageView *imageView;
[imageView sd_setImageWithURL:url];
let PDFCoder = SDImagePDFCoder.shared
SDImageCodersManager.shared.addCoder(PDFCoder)
let imageView: UIImageView
imageView.sd_setImage(with: url)

使用 UIImageView 位图渲染 (iOS/tvOS 10-)

对于低于 iOS/tvOS 11+ 的固件,UIImage && UIImageView 不支持矢量图像渲染。 即使您可以在 Xcode Asset Catalog 中添加 PDF 图像,它也会在编译时被编码为位图 PNG 格式,但不支持运行时缩放。

对于 UIImageView,我们将仅使用固定图像大小(来自 PDF mediaBox 信息)解析 PDF。 但是,我们还支持您在使用 .imageThumbnailPixelSize 上下文选项加载图像期间指定所需的大小。 您还可以使用 .imagePreserveAspectRatio 上下文选项指定缩放期间是否保持宽高比。

注意:一旦您传递了像素大小,即使在 iOS/tvOS 11+ 上,我们也会始终生成位图表示。 如果您想要矢量格式,请不要传递它们,让 UIImageView 动态拉伸 PDF。

SDImagePDFCoder *PDFCoder = [SDImagePDFCoder sharedCoder];
[[SDImageCodersManager sharedManager] addCoder:PDFCoder];
UIImageView *imageView;
CGSize bitmapSize = CGSizeMake(500, 500);
[imageView sd_setImageWithURL:url placeholderImage:nil options:0 context:@{SDWebImageContextImageThumbnailPixelSize : @(bitmapSize)];
let PDFCoder = SDImagePDFCoder.shared
SDImageCodersManager.shared.addCoder(PDFCoder)
let imageView: UIImageView
let bitmapSize = CGSize(width: 500, height: 500)
imageView.sd_setImage(with: url, placeholderImage: nil, options: [], context: [.imageThumbnailPixelSize : bitmapSize])

导出 PDF 数据

SDWebImagePDFCoder 提供了一种简单的方法来将框架生成的 PDF 图像导出到原始 PDF 数据。

如果输入图像已经是基于矢量的 PDF,则会导出它(快速)。 否则,我们将创建一个空白 PDF 页面,并将位图图像绘制在上面(慢)。

UIImage *pdfImage; // UIImage with vector image, or NSImage contains `NSPDFImageRep`
NSData *pdfData = [pdfImage sd_imageDataAsFormat:SDImageFormatPDF]; // May return the vector data, or create new PDF with current image drawn on
let pdfImage: UIImage // UIImage with vector image, or NSImage contains `NSPDFImageRep`
let pdfData = pdfImage.sd_imageData(as: .PDF) // May return the vector data, or create new PDF with current image drawn on

屏幕截图

这些 PDF 图像来自 icons8,您也可以使用您自己的 PDF 图像尝试演示。

作者

DreamPiggy

许可证

SDWebImagePDFCoder 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。