测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可协议 | LICENSE |
发布日期最后发布 | 2016年11月 |
SwiftSwift版本 | 3.0 |
SPM支持SPM | ✗ |
由Muhammad Ishaq维护。
SimplePDF 是一个 Swift 类,允许您创建简单的 PDF 文档,包括页码和目录。代码是对 Builder 设计模式的粗糙实现。查看示例项目以获取使用示例。
要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install
。或者运行 pod try SimplePDFSwift
。
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 文档,但它可以在各种场景中使用。允许您添加
DefaultTextFormatter
的子类到 SimplePDF 的 init
方法来自定义除了预定义的标题和正文文本格式外,您还可以将任何NSAttributedString
添加到PDF中,但它将不包括在目录中。目录只考虑通过addH1
…addH6
函数添加的内容。
从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()
。
有两种类型的页眉/页脚。
文字这是通过HeaderFooterText
实例添加的,任何换行符都会导致多行页眉(或页脚)。例如,可以包括作者的名字和文档创建日期,或者可以包括页码,例如:“第1页,共12页”或任何其他文本。
图片:这是通过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(或其子类)设计封面页面的示例
PageSize
枚举中查找其他尺寸)。SimplePDFLabel
(或其子类)。let coverPage = NSBundle.mainBundle().loadNibNamed("PDFCoverPage", owner: self, options: nil).first as PDFCoverPage
pdf.addView(coverPage)
注意:请注意,如果您使用上述方法将视图渲染到PDF,将不会在此视图中运行自动布局。如果您的视图不依赖于自动布局,您不需要担心任何事情。但是,如果您的视图使用自动布局来正确定位元素,您必须将其添加到活动视图层次结构中。您可以将它添加到屏幕外视图层次结构中,然后调用pdf.addView(view)
将其渲染到PDF。但是,现在视图会以位图方式渲染。这意味着任何标签将无法作为文本选择,并且如果放大,它们会失去质量(成为位图)。
要自定义addH1
…addH6
和addBodyText
函数中使用的格式,你需要
DefaultTextFormatter
并重写合适的方法SimplePDF
的 init
方法。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 文件。