福昕 PDF SDK(iOS)

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

使用福昕 PDF SDK(iOS)开发PDF软件

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

PDF SDK for iOS Support

功能

查看PDF

我们的核心API针对桌面和移动平台进行了优化,可以提供高保真度PDF文档渲染体验。

数字签名

无需打印文件,用户可以在其电子设备上签署文件,加速业务处理,并给用户带来舒适的体验。

PDF表单

支持使用电子设备填写数字表单,使之更高效、快捷。

权限管理

福昕 PDF SDK可以通过加密/解密服务或集成自定义数字权限管理(DRM)或信息权限管理(IRM)系统生成受保护的PDF文件。福昕的PDF SDK集成了微软权限管理服务(RMS)。

PDF注释

福昕 PDF SDK提供丰富的注释和标记功能,支持创建、编辑、导入和导出注释等。

全文搜索

采用SQLite数据库,支持对多种语言类型的PDF文档进行全文检索,提供快速、便捷的搜索体验。
 

福昕 PDF SDK 简介

我们的高性能库使用最流行的开发语言及环境,为所有平台的企业、移动和云应用程序助力,提供强大的PDF功能。

福昕PDF (WEB) 10.0版本突破性的改变将多维度升级您的使用体验!

我们通过重构书签模块提高了书签加载的时间效率。停止对ASM.JS引擎的支持,并放弃了对Safari V.11以下旧版本的支持;从而压缩SDK包体积,专注于维护更现代和高效的技术。引入新库加载模式,将静态库加载方法切换为动态库加载方法;由一个主模块和几个副模块组成。提供更快的初始加载时间和更少的内存使用。

于此同时,我们支持PDF 3D模型。实现动态XFA表单脚本功能,并使XFA表单在我们的Web SDK中真正具有交互性和数据驱动性。使用 /V字典来创建签名等等特色新的功能,我们期待您的试用与宝贵的意见交互!

高级技术

XFA表单

XFA表单是基于XML的表单。能够安全获取、呈现、移动、处理、输出、更新和打印与静态和动态XFA表单相关的信息。使用XFA表单能简化您的数据共享、数据和获取。

权限管理

将应用程序和文件连接到微软的权限管理服务平台,保护PDF文档的安全。福昕 PDF SDK支持集成自定义IRM和DRM解决方案。
 
 

密文处理

出于合法或安全的考虑,通过编程实现搜索和审查文档的敏感信息,确保您的客户和员工的信息安全。通过福昕强大的技术加密文档,使得文档符合通用数据保护条例(GDPR)。

优点

原生用户界面

PDF SDK(iOS)专为开发人员构建。我们提供了内置PDF阅读器,使您开发工作量减半,并允许您自定义此阅读器。

易于集成

我们开发iOS PDF库时将平台作为首要考虑因素。我们遵循iOS的命名规范,使我们的程序符合iOS应用程序标准。

选择我们

福昕 PDF SDK提供了更好的渲染质量和丰富的功能,包括注释、表单、签名等功能,是您构建PDF功能的不二选择。

福昕核心技术支持

福昕 PDF SDK的核心技术已经存在多年,并且受到许多知名公司的信任。福昕强大的引擎使文档在不同平台上都可以快速查看并且保持一致。

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
    }