SimplePDFSwift 0.2.1

SimplePDFSwift 0.2.1

测试已测试
语言语言 SwiftSwift
许可协议 LICENSE
发布日期最后发布2016年11月
SwiftSwift版本3.0
SPM支持SPM

Muhammad Ishaq维护。



  • 作者
  • Muhammad Ishaq

SimplePDF

SimplePDF 是一个 Swift 类,允许您创建简单的 PDF 文档,包括页码和目录。代码是对 Builder 设计模式的粗糙实现。查看示例项目以获取使用示例。

使用方法

要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install。或者运行 pod try SimplePDFSwift

⚠️ 重要:此库的 pod 名称是 SimplePDFSwift,请注意,名为 SimplePDF 的 pod 是不同的库(如果您想尝试它,它可在 这里找到)。 ⚠️

要求

SimplePDF 自 0.2.1 版本起使用 Swift 3.0 编写。因此您需要 Xcode 8.0 进行开发。您可以将目标设置为 iOS 8.0 及更高版本。

要使用旧版本的 Swift 0.2.1 之前版本的 SimplePDF,您可以使用更早的版本。

安装

SimplePDF 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod "SimplePDFSwift"

特性

尽管 SimplePDF 只能生成简单的 PDF 文档,但它可以在各种场景中使用。允许您添加

  • 标题(H1 - H6)和正文文本。它们的格式可以通过传递 DefaultTextFormatter 的子类到 SimplePDF 的 init 方法来自定义
  • 图像(带标题)
  • 向多列添加文本,也可以用来创建无边框表格
  • 页眉/页脚(带页码和页数计数)
  • UIView 实例(您可以在 nib 或 Storyboard 中设计一个 UIView,并将其作为页面添加到 PDF 中。这可能很有用,例如添加带有公司标志的封面页等。)

除了预定义的标题和正文文本格式外,您还可以将任何NSAttributedString添加到PDF中,但它将不包括在目录中。目录只考虑通过addH1addH6函数添加的内容。

开始使用

从CocoaPods安装后,导入模块(import SimplePDFSwift)。典型用法如下:

import SimplePDFSwift

// Initialize
let pdf = SimplePDF(pdfTitle: "Simple PDF Demo", authorName: "Muhammad Ishaq")

// add some content
pdf.addH1("Level 2 Heading")
pdf.addBodyText("Some body text, probably a long string with multiple paras")
pdf.addH2("Level 2 Heading")
pdf.addBodyText("Lorem ipsum dolor sit amet...")

// add an image
let imagePath = NSBundle.mainBundle().pathForResource("Demo", ofType: "png")!
let imageCaption = "fig 1: Lorem ipsum dolor sit amet"
pdf.addImages([imagePath], imageCaptions: [imageCaption], imagesPerRow: 1)

// Configure headers/footers (discussed below)
// ...

// Write PDF
// Note that the tmpPDFPath is path to a temporary file, it needs to be saved somewhere
let tmpPDFPath = pdf.writePDFWithTableOfContents()

如果您不需要生成目录,可以使用writePDFWithTableOfContents,而应调用writePDFWithoutTableOfContents()

添加页眉/页脚

有两种类型的页眉/页脚。

  1. 文字这是通过HeaderFooterText实例添加的,任何换行符都会导致多行页眉(或页脚)。例如,可以包括作者的名字和文档创建日期,或者可以包括页码,例如:“第1页,共12页”或任何其他文本。

  2. 图片:这是通过HeaderFooterImage实例添加的,并且只能是一个图片(例如,图标或徽标)。

对齐:页眉/页脚可以是对齐,它将被添加到页面的顶部/底部相应位置。

页码 & 总页数:在文字页眉/页脚中,SimplePDF.pageNumberPlaceholder的出现会替换为当前页码,而SimplePDF.pagesCountPlaceholder的出现会替换为总页数。

pageRange属性控制页眉/页脚出现哪些页面。pageRange是一个NSRange实例,pageRange.location指定页眉/页脚会首次出现在的零索引页面。pageRange.length指定它将在多少页上出现(从pageRange.location开始)。

以下是添加多行页眉(或页脚)的示例(在这种情况下,它是页眉,并且首次出现在第二页)

// Variables to format the header string
let regularFont = UIFont.systemFontOfSize(8)
let boldFont = UIFont.boldSystemFontOfSize(8)
let leftAlignment = NSMutableParagraphStyle()
leftAlignment.alignment = NSTextAlignment.Left
let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
dateFormatter.timeStyle = NSDateFormatterStyle.MediumStyle
let dateString = dateFormatter.stringFromDate(NSDate())

// Create the attributed string for header
let leftHeaderString = "Author: Muhammad Ishaq\nDate/Time: \(dateString)"
let leftHeaderAttrString = NSMutableAttributedString(string: leftHeaderString)
leftHeaderAttrString.addAttribute(NSParagraphStyleAttributeName, value: leftAlignment, range: NSMakeRange(0, leftHeaderAttrString.length))
leftHeaderAttrString.addAttribute(NSFontAttributeName, value: regularFont, range: NSMakeRange(0, leftHeaderAttrString.length))
leftHeaderAttrString.addAttribute(NSFontAttributeName, value: boldFont, range: leftHeaderAttrString.mutableString.rangeOfString("Author:"))
leftHeaderAttrString.addAttribute(NSFontAttributeName, value: boldFont, range: leftHeaderAttrString.mutableString.rangeOfString("Date/Time:"))

// Create the header
// location of pageRange is 1, so it skips page 0 i.e. the first page and appears on second page
let header = SimplePDF.HeaderFooterText(type: .Header, pageRange: NSMakeRange(1, Int.max), attributedString: leftHeaderAttrString)
pdf.headerFooterTexts.append(header)

以下是添加徽标的示例

// add a logo to the header, on the right
let logoPath = NSBundle.mainBundle().pathForResource("Demo", ofType: "png")
// location of pageRange is 1, so it skips page 0 i.e. the first page
// NOTE: we can specify either the image (UIImage instance) or its path
let rightLogo = SimplePDF.HeaderFooterImage(type: .Header, pageRange: NSMakeRange(1, Int.max),
    imagePath: logoPath!, image:nil, imageHeight: 35, alignment: .Right)
pdf.headerFooterImages.append(rightLogo)

以下是添加包含页码和总页数的示例

// add page numbers to the footer (center aligned)
let centerAlignment = NSMutableParagraphStyle()
centerAlignment.alignment = .Center
let footerString = NSMutableAttributedString(string: "\(SimplePDF.pageNumberPlaceholder) of \(SimplePDF.pagesCountPlaceholder)")
footerString.addAttribute(NSParagraphStyleAttributeName, value: centerAlignment, range: NSMakeRange(0, footerString.length))
// location of pageRange is 1, so it skips page 0 i.e. the first page
let footer = SimplePDF.HeaderFooterText(type: .Footer, pageRange: NSMakeRange(1, Int.max), attributedString: footerString)
pdf.headerFooterTexts.append(footer)

添加视图

您可以通过调用addView(view)将UIView实例渲染到PDF页面上。传入的视图将被渲染到新的PDF页面上。这主要用于设计封面页面。视图始终添加到其自己的页面。如果需要,它将开始新的一页,并且在它的任何内容后面添加的内容将出现在下一页上。

以下是使用UIView(或其子类)设计封面页面的示例

  1. 创建一个与PDF页面相同尺寸的nib(例如,A4页面是595x842,您可以在PageSize枚举中查找其他尺寸)。
  2. 可选:如果您希望在PDF中将标签作为文本出现(而不是位图),视图中应将所有标签的类设置为SimplePDFLabel(或其子类)。
  3. 从nib中加载视图并将其添加到PDF中
let coverPage = NSBundle.mainBundle().loadNibNamed("PDFCoverPage", owner: self, options: nil).first as PDFCoverPage
pdf.addView(coverPage)

注意:请注意,如果您使用上述方法将视图渲染到PDF,将不会在此视图中运行自动布局。如果您的视图不依赖于自动布局,您不需要担心任何事情。但是,如果您的视图使用自动布局来正确定位元素,您必须将其添加到活动视图层次结构中。您可以将它添加到屏幕外视图层次结构中,然后调用pdf.addView(view)将其渲染到PDF。但是,现在视图会以位图方式渲染。这意味着任何标签将无法作为文本选择,并且如果放大,它们会失去质量(成为位图)。

自定义标题和正文文本格式

要自定义addH1addH6addBodyText函数中使用的格式,你需要

  1. 继承 DefaultTextFormatter 并重写合适的方法
  2. 将自定义子类的实例传递给 SimplePDFinit 方法。

SimplePDF 现在将使用您的子类而不是 DefaultTextFormatter 来格式化标题和正文文本。

其他任务

  • 您可以使用 addAttributedString(attrString) 添加带属性的字符串。请注意,但是,这些字符串不会出现在目录中(无论渲染的文本有多大)。
  • 您可以使用 addAttributedStringsToColumns(columnWidths: [CGFloat], strings: [NSAttributedString]) 将文本添加到多个列中。这也可以用于创建无边框表格。传递空字符串可以保持相应的列为空。
  • addImages(imagePaths:[String], imageCaptions: [String], imagesPerRow:Int = 3) 将图像添加到 PDF 中。它将图像统一调整大小以适应可用页面宽度中的 imagesPerRow 个图像。传递 nil 作为图像(以及对于标题传递空字符串)可以保持相应的列为空。
  • addImagesRow(imagePaths: [String], imageCaptions: [NSAttributedString], columnWidths: [CGFloat]) 使用指定的列宽度添加单行图像。传递 nil 作为图像(以及对于标题传递空字符串)可以保持相应的列为空。

作者

Muhammad Ishaq ([email protected]), Martin Stemmle ([email protected])

许可

SimplePDF 可在 MIT 许可下使用。有关更多信息,请参阅 LICENSE 文件。