FOXIT PDF SDK(iOS版)

使用Foxit PDF SDK(iOS版)可以在您的iOS应用中轻松集成PDF技术。福昕还提供了内置PDF查看器和用户界面扩展组件,可以减少开发时间,使得PDF库简单易用,即使对于那些不大了解PDF技术的人来说也是如此。选择Foxit PDF SDK(iOS版),通过专业且易于使用的软件开发工具包,满足您项目所有需求。

使用FOXIT PDF SDK(iOS版)开发PDF软件

Foxit PDF SDK(iOS版)集成了您开发iOS应用程序所需的全部PDF技术。Foxit PDF SDK(iOS版)支持主流iOS 开发语言:Swift 和Objective-C和Cordova/Xamarin/React Native等跨平台框架,用户可方便快速地在这些跨平台框架中集成福昕的SDK,增加对PDF的支持。开发人员可通过 Foxit PDF SDK(iOS) 开发出具有强大PDF 处理功能、完善PDF权限管理体系的移动应用产品。福昕的SDK 和用户界面扩展组件可以确保您的应用程序提供用户所需的PDF功能和特性。

PDF SDK for iOS Support

功能

查看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
    }