FOXIT PDF SDK(iOS版)
使用Foxit PDF SDK(iOS版)可以在您的iOS应用中轻松集成PDF技术。福昕还提供了内置PDF查看器和用户界面扩展组件,可以减少开发时间,使得PDF库简单易用,即使对于那些不大了解PDF技术的人来说也是如此。选择Foxit PDF SDK(iOS版),通过专业且易于使用的软件开发工具包,满足您项目所有需求。
功能
查看PDF
我们的核心API针对桌面和移动平台进行了优化,可以提供高保真度PDF文档渲染体验。
数字签名
无需打印文件,用户可以在其电子设备上签署文件,加速业务处理,并给用户带来舒适的体验。
PDF表单
支持使用电子设备填写数字表单,使之更高效、快捷。



权限管理
Foxit PDF SDK可以通过加密/解密服务或集成自定义数字权限管理(DRM)或信息权限管理(IRM)系统生成受保护的PDF文件。福昕的PDF SDK集成了微软权限管理服务(RMS)。
PDF注释
Foxit PDF SDK提供丰富的注释和标记功能,支持创建、编辑、导入和导出注释等。
全文搜索
采用SQLite数据库,支持对多种语言类型的PDF文档进行全文检索,提供快速、便捷的搜索体验。
FOXIT PDF SDK 8.5简介
Foxit PDF SDK 8.0是PDF领域中一个具有变革性的版本,无论是Web端基于JavaScript的Web Viewer还是桌面端SDK 和移动端SDK,都带来了许多新增功能和升级改进。我们还为PDF SDK(Web版)提供了全新的Viewer Demo。
在 Web端,我们新增了一个全新的Viewer Demo,向您展示如何充分利用我们基于JavaScript的 PDF 库。
我们还增强了协作功能,让您可以在 PDF查看器的多个实例之间同步注释和页面操作。您可以在自己的应用程序中轻松部署我们的SDK和管理所有用户的实时访问。另外,Web端SDK还提供了全新的辅助功能,如高对比度的支持和“文本到语音”转换工具。
我们的桌面端SDK提供了对 ARM Linux平台的支持、对HTMLtoPDF功能的重大升级、将表单数据导出到 CSV 功能等等。
在移动端,我们推出了新的UI,风格与桌面端UI以及福昕的其他产品的更加统一,签名功能中新增了一个用于检测是否已应用签名的事件,以及UI 上提供了注释小结功能。立即下载试用吧!

高级技术
XFA表单
XFA表单是基于XML的表单。能够安全获取、呈现、移动、处理、输出、更新和打印与静态和动态XFA表单相关的信息。使用XFA表单能简化您的数据共享、数据和获取。
权限管理
将应用程序和文件连接到微软的权限管理服务平台,保护PDF文档的安全。Foxit PDF SDK支持集成自定义IRM和DRM解决方案。
密文处理
出于合法或安全的考虑,通过编程实现搜索和审查文档的敏感信息,确保您的客户和员工的信息安全。通过福昕强大的技术加密文档,使得文档符合通用数据保护条例(GDPR)。
试用福昕技术
福昕阅读器(iOS版)是使用PDF SDK(iOS版)开发而成,可以从应用商店免费下载。欢迎立即试用。
优点
原生用户界面
PDF SDK(iOS版)专为开发人员构建。我们提供了内置PDF阅读器,使您开发工作量减半,并允许您自定义此阅读器。
易于集成
我们开发iOS PDF库时将平台作为首要考虑因素。我们遵循iOS的命名规范,使我们的程序符合iOS应用程序标准。
选择我们
Foxit PDF SDK提供了更好的渲染质量和丰富的功能,包括注释、表单、签名等功能,是您构建PDF功能的不二选择。
福昕核心技术支持
Foxit PDF SDK的核心技术已经存在多年,并且受到许多知名公司的信任。福昕强大的引擎使文档在不同平台上都可以快速查看并且保持一致。
系统要求
- iOS 9.0或更高版本
- Xcode 9.0或更高版本(使用Objective-C)
- Xcode 9.0或更高版本(使用Swift)
Xcode样例代码
/** @brief Edit bookmark appearances and titles, and save these changes to a PDF file. */ func modifyBookmarkOfDoc(_ doc: FSPDFDoc, saveAsNewDocAtPath path: String) -> Bool { if path == "" { return false } let rootBMark = doc.getRootBookmark() guard let child = rootBMark?.getFirstChild() else { return false } if !(self.setPropertiesOfBookmarks(child)) { return false } doc.save(as: path, save_flags: 0) return true } class func parsePage(_ page: FSPDFPage, reparse: Bool) -> Bool { let progressive = page.startParse(0, pause: nil, is_reparse: reparse) if progressive == nil { return true } while true { let state = progressive!.resume() switch state { case .finished: return true case .toBeContinued: continue case .error: return false default: fatalError() } } } func setPropertiesOfBookmarks(_ bookmark: FSBookmark?) -> Bool { if bookmark == nil { return false } var bk: FSBookmark! bk = bookmark! while !bk.isEmpty() { let title = bk.title! bk.title = "\(String(describing: title))_renamed" as NSString bk.color = 0x0000ffff bk.style = UInt32(FSBookmarkStyle.bold.rawValue) let child = bk.getFirstChild()! if !child.isEmpty() { self.setPropertiesOfBookmarks(child) } bk = bk!.getNextSibling() } return true }
/** @brief Render a specified page to Bitmap, and save it to a PNG image. */ func renderPage(_ page: FSPDFPage, atPath path: String) -> Bool { if path == "" { return false } if !page.isParsed() { if !PlatformAPIDemo.parsePage(page, reparse: true) { return false } } //create bitmap let pageWidth: Int = Int(page.getWidth()) let pageHeight: Int = Int(page.getHeight()) let bmp = FSBitmap(width: Int32(pageWidth), height: Int32(pageHeight), format: .dibRgb32, buffer: nil, pitch: 0)! bmp.fillRect(0xffffffff, rect: nil) //init renderer let render = FSRenderer.init(bitmap: bmp, is_rgb_order: true) if render == nil { return false } //set different kinds of properties render!.setRenderContentFlags(1) render!.setTransformAnnotIcon(true) render!.setColorMode(FSRendererColorMode.normal) render!.setMappingModeColors(0xffffffff, foreground_color: 0x0000ffff) render!.setForceHalftone(true) let mat = page.getDisplayMatrix(0, top: 0, width: Int32(pageWidth), height: Int32(pageHeight), rotate: .rotation0) let progressive = render!.startRender(page, matrix: mat, pause: nil) if progressive != nil { while true { let state = progressive!.resume() if state == .error { return false } else if state != .toBeContinued { break; } } } if !self.save2PNGWithBitmap(bmp, transform: nil, Path: path as NSString) { return false } return true } func save2PNGWithBitmap(_ fsBitmap: FSBitmap, transform: CGAffineTransform?, Path path: NSString) -> Bool { if path == "" { return false } let pageWidth: Int = Int(fsBitmap.getWidth()) let pageHeight: Int = Int(fsBitmap.getHeight()) if pageWidth <= 0 || pageHeight <= 0 { return false } let provider = CGDataProvider.init(data: fsBitmap.getBuffer() as CFData) let image = CGImage(width: pageWidth, height: pageHeight, bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: Int(fsBitmap.getPitch()), space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: .byteOrder32Big, provider: provider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)! let uiImage = UIImage(cgImage: image) let fileURL = URL(fileURLWithPath: path as String) do { try UIImagePNGRepresentation(uiImage)!.write(to: fileURL) } catch { print(error) return false } return true }