福昕 PDF SDK(Mac)

福昕 PDF SDK(Mac)支持开发自定义PDF阅读器,从中可选择添加PDF相关功能。只需要几行代码和一个优秀的功能库就可以添加注释、填写表单和签名功能。福昕核心API可以帮助开发人员开发PDF阅读器/编辑器或后台PDF工作流,满足企业目标需求。

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

福昕 PDF SDK(Mac)可以帮助开发人员快速开发功能丰富的应用程序。福昕的核心API 专为Mac开发者设计,提供强大的PDF库,可以将您的应用提升到一个新的高度。开发人员可以通过Xcode或其他集成开发环境使用C++或Objective-C编写代码,构建一个快速、稳健和出色的PDF解决方案。

PDF SDK for Mac 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字典来创建签名等等特色新的功能,我们期待您的试用与宝贵的意见交互!

福昕 PDF SDK 6.3 

PDF SDK6.3增加了不少新功能,包括:从URL打开PDF时存储缓存的支持,新增了阅读视图模式,以及JavaScript中增加了SignatureInfo和Doc / WillClose功能,等等!

同时全面更新了文档资料,为您提供新版的开发人员指南以及大量新的代码示例,帮助开发人员快速上手。

高级技术

XFA表单

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

权限管理

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

密文处理

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

优点

集成开发

福昕 PDF SDK(Mac)专为Apple开发者构建,已经Mac和iOS开发人员测试。启动Xcode或您的集成开发环境,尽享程序开发体验。

易于集成

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

功能丰富

我们的产品功能在移动端和桌面端保持一致,使得跨平台开发更加简单顺畅。我们会不断更新功能集,欢迎关注我们的产品页面。

福昕核心技术支持

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

使用Xcode加载文件和添加图像

int main(int argc, char *argv[])
{
                                                    int err_ret = 0;
  WString input_file = input_path + L"AboutFoxit.pdf";

  WString output_directory = output_path + L"bookmark/";
#if defined(_WIN32) || defined(_WIN64)
  _mkdir(String::FromUnicode(output_directory));
#else
  mkdir(String::FromUnicode(output_directory), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
#endif

  WString output_file1 = output_directory + L"bookmark_add.pdf";
  WString output_file2 = output_directory + L"bookmark_change.pdf";
  WString bookmark_info_file = output_directory + L"bookmark_info.txt";

  SdkLibMgr spSdkLibMgr;
  ErrorCode error_code = spSdkLibMgr.Initialize();
                                                    if (error_code != foxit::e_ErrSuccess) {
                                                    return 1;
  }

  try {
    PDFDoc doc(input_file);
    ErrorCode error_code = doc.Load();
                                                    if (error_code != foxit::e_ErrSuccess) {
      printf("The Doc [%s] Error: %d\n", (const char*)String::FromUnicode(input_file), error_code);
                                                    return 1;
    }

                                                    // Show original bookmark information.
    ShowBookmarksInfo(doc, bookmark_info_file);

                                                    //Get bookmark root node or Create new bookmark root node.
    Bookmark root = doc.GetRootBookmark();
                                                    if (root.IsEmpty())
    {
      root = doc.CreateRootBookmark();
    }
                                                    for (int i = 0; i < doc.GetPageCount(); i += 2) {
      Destination dest = Destination::CreateFitPage(doc, i);
      CFX_WideString ws_title;
      ws_title.Format((FX_LPCWSTR)L"A bookmark to a page (index: %d)", i);
      Bookmark child = root.Insert(ws_title,
        foxit::pdf::Bookmark::e_PosLastChild);
      child.SetDestination(dest);
      child.SetColor(i * 0xF68C21);
    }
    doc.SaveAs(output_file1, PDFDoc::e_SaveFlagNoOriginal);

                                                    // Get first bookmark and change properties.
    Bookmark first_bookmark = root.GetFirstChild();
    first_bookmark.SetStyle(foxit::pdf::Bookmark::e_StyleItalic);
    first_bookmark.SetColor(0xFF0000);
    first_bookmark.SetTitle(L"Change bookmark title, style, and color");

                                                    // Remove next sibling bookmark
                                                    if (!first_bookmark.GetNextSibling().IsEmpty()) {
      doc.RemoveBookmark(first_bookmark.GetNextSibling());
    }

    WString bookmark_info_file = output_directory + L"bookmark_info1.txt";
    ShowBookmarksInfo(doc, bookmark_info_file);

    doc.SaveAs(output_file2, PDFDoc::e_SaveFlagNoOriginal);
    cout << "Bookmark demo." << endl;

  } catch (const Exception& e) {
    cout << e.GetMessage() << endl;
    err_ret = 1;
  }
                                                    catch(...)
  {
    cout << "Unknown Exception" << endl;
    err_ret = 1;
  }

                                                    return err_ret;
}
class SdkLibMgr {
public:
  SdkLibMgr() : isInitialize(false){};
  ErrorCode Initialize() {
    ErrorCode error_code = Library::Initialize(sn, key);
                                                    if (error_code != foxit::e_ErrSuccess) {
      printf("Library Initialize Error: %d\n", error_code);
    } else {
      isInitialize = true;
    }
                                                    return error_code;

  }
                                                    ~SdkLibMgr(){
                                                    if(isInitialize)
      Library::Release();
  }
private:
                                                    bool isInitialize;
};

WString output_directory = output_path + L"pdf2image/";

void Save2Image(Bitmap& bitmap, int nPageIndex, const char* sExt)
{
                                                    // Add the bitmap to image and save the image.
  Image image;
  image.AddFrame(bitmap);
  WString s;
  s.Format((FX_LPCWSTR)L"AboutFoxit_%d",nPageIndex);
  s = output_directory + s + WString::FromLocal(sExt);
  image.SaveAs(s);

  cout << "Save page " << nPageIndex << " into a picture of " << sExt << " format." << endl;
}

void Save2Image(Image& image, const char* sExt)
{
  WString s = L"AboutFoxit";
  s = output_directory + s + WString::FromLocal(sExt);
  image.SaveAs(s);

  cout << "Save pdf file into a picture of " << sExt << " format." << endl;
}

int main(int argc, char *argv[])
{
#if defined(_WIN32) || defined(_WIN64)
  _mkdir(String::FromUnicode(output_directory));
#else
  mkdir(String::FromUnicode(output_directory), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
#endif

                                                    int err_ret = 0;
  WString input_file = input_path + L"AboutFoxit.pdf";
                                                    const char* support_image_extends[] = {".bmp", ".jpg", ".jpeg", ".png", ".jpx", ".jp2"};
                                                    const char* support_multi_image[] = {".tif", ".tiff"};
  SdkLibMgr spSdkLibMgr;
  ErrorCode error_code = spSdkLibMgr.Initialize();
                                                    if (error_code != foxit::e_ErrSuccess) {
                                                    return 1;
  }

  try {
    PDFDoc doc=PDFDoc(input_file);
    ErrorCode error_code = doc.Load();
                                                    if (error_code != foxit::e_ErrSuccess) {
      printf("The Doc [%s] Error: %d\n", (const char*)String::FromUnicode(input_file), error_code);
                                                    return 1;
    }

    Image image;
                                                    // get page count
                                                    int nPageCount = doc.GetPageCount();
                                                    for(int i=0;i<nPageCount;i++)
    {
      PDFPage page = doc.GetPage(i);
                                                    // Parse page.
      page.StartParse(foxit::pdf::PDFPage::e_ParsePageNormal, NULL, false);

                                                    int width = static_cast<int>(page.GetWidth());
                                                    int height = static_cast<int>(page.GetHeight());
      Matrix matrix = page.GetDisplayMatrix(0, 0, width, height, page.GetRotation());

                                                    // Prepare a bitmap for rendering.
      Bitmap bitmap(width, height, foxit::common::Bitmap::e_DIBArgb, NULL, 0);
      bitmap.FillRect(0xFFFFFFFF, NULL);

                                                    // Render page
      Renderer render(bitmap, false);
      render.StartRender(page, matrix, NULL);
      image.AddFrame(bitmap);
                                                    for(unsigned int j=0;j<sizeof(support_image_extends)/sizeof(support_image_extends[0]);j++)
      {
                                                    const char* extend = support_image_extends[j];
        Save2Image(bitmap,i,extend);
      }
    }

                                                    for(unsigned int j=0;j<sizeof(support_multi_image)/sizeof(support_multi_image[0]);j++)
    {
                                                    const char* extend = support_multi_image[j];
      Save2Image(image,extend);
    }

  } catch (const Exception& e) {
    cout << e.GetMessage() << endl;
    err_ret = 1;
  }
                                                    catch(...)
  {
    cout << "Unknown Exception" << endl;
    err_ret = 1;
  }

                                                    return err_ret;
}