Foxit PDF SDK(Android)

使用福昕现代的、易于使用的PDF SDK(Android),可以轻松在安卓设备中创建、查看和编辑PDF文件。除了福昕强大的核心API之外,我们还提供内置用户界面扩展组件,即使开发团队对PDF知识了解有限,我们也可以帮助您快速开发产品。基于Fx Core™技术,PDF SDK(Android)可以为您提供快速、准确的开发体验。

使用PDF SDK(Android)开发PDF软件

使用Android Studio开发PDF软件的开发人员可以在Java、Kotlin或C++的开发语言环境中使用我们的PDF SDK(Android)。通过JavaScript,您可以通过Cordova或React Native等移动开发框架绑定RDK库来进行更多的原生开发。福昕为安卓开发者提供了开发PDF软件所需的基本要素,让他们可以轻松地使用我们的技术。简单地说,我们的核心API使我们的产品能够被任何水平和经验的开发人员所使用。

Android PDF SDK

功能

PDF Page View Android

Ink Signatures Android

Form filling Android

查看PDF

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

数字签名

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

PDF表单

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

PDF Password Android

Strikeout annotation

Full Text Search

权限管理

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

PDF注释

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

全文搜索

采用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(Android)专为开发人员构建。我们提供了内置PDF阅读器,使您开发工作量减半,并允许您自定义此阅读器。

适用于Google Play

PDF SDK(Android)完全符合谷歌对应用开发者使用第三方组件的政策,这意味着使用福昕PDF SDK(Android)开发,您的应用程序将会更快地在Googly Play应用商店上架。

兼容多种设备

无论是智能手表、手机,还是Chromebook,甚至是汽车,福昕 PDF SDK都能像您期望的那样,帮助您实现在应用程序中查看PDF文档。

福昕核心技术支持

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

Android Studio样例代码

public class Outline {
                                                    private String mFilePath = "";
                                                    private Context mContext = null;
                                                    private static int index = 0;

                                                    public Outline(Context context, String pdfFilePath) {
        mFilePath = pdfFilePath;
        mContext = context;
                                                    }

                                                    public void modifyOutline() {
                                                    int indexPdf = mFilePath.lastIndexOf(".");
                                                    int indexSep = mFilePath.lastIndexOf("/");

        String filenameWithoutPdf = mFilePath.substring(indexSep + 1, indexPdf);
        String outputFilePath = Common.GetOutputFilesFolder(Common.outlineModuleName) + filenameWithoutPdf + "_edit.pdf";

        PDFDoc doc = null;
        doc = Common.loadPDFDoc(mContext, mFilePath, null);
                                                    if (doc == null) {
                                                    return;
                                                    }
                                                    try {
            Bookmark bookmarkRoot = doc.getRootBookmark();
                                                    if (bookmarkRoot == null) {
                                                    return;
                                                    }

            Bookmark firstChild = bookmarkRoot.getFirstChild();
            modifyOutline(firstChild);

                                                    if (false == doc.saveAs(outputFilePath, PDFDoc.e_SaveFlagNormal)) {
                Toast.makeText(mContext, "Save document error!", Toast.LENGTH_LONG).show();
                                                    return;
                                                    }
                                                    } catch (PDFException e) {
            Toast.makeText(mContext, "Outline demo run error. " + e.getMessage(), Toast.LENGTH_LONG).show();
                                                    return;
                                                    } finally {
            Common.releaseDoc(mContext, doc);
                                                    }
        Toast.makeText(mContext, Common.runSuccesssInfo + outputFilePath, Toast.LENGTH_LONG).show();
                                                    }

                                                    private void modifyOutline(Bookmark bookmark) {
                                                    try {
                                                    if (bookmark.isEmpty())
                                                    return;

                                                    if (index % 2 == 0) {
                bookmark.setColor(0xFFFF0000);
                bookmark.setStyle(Bookmark.e_StyleBold);
                                                    } else {
                bookmark.setColor(0xFF00FF00);
                bookmark.setStyle(Bookmark.e_StyleItalic);
                                                    }

            bookmark.setTitle("foxitbookmark" + index);
            index++;

                                                    //Traverse the brother nodes and modify their appearance and titles.
            Bookmark nextSibling = bookmark.getNextSibling();
            modifyOutline(nextSibling);

                                                    //Traverse the children nodes and modify their appearance and titles.
            Bookmark child = bookmark.getFirstChild();
            modifyOutline(child);

                                                    } catch (PDFException e) {
            Toast.makeText(mContext, "Outline demo run error. " + e.getMessage(), Toast.LENGTH_LONG).show();
                                                    }
                                                    }
} 

public class Render {
                                                    private Context mContext = null;
                                                    private String mPath = null;

                                                    public Render(Context context, String path) {
        mContext = context;
        mPath = path;
                                                    }

                                                    public void renderPage(int index) {
        PDFDoc doc = Common.loadPDFDoc(mContext, mPath, null);
                                                    if (doc == null) return;

                                                    try {
                                                    int pageCount = doc.getPageCount();
                                                    if (index > pageCount || index < 0) {
                Toast.makeText(mContext, String.format("The page index is out of range!"), Toast.LENGTH_LONG).show();
                                                    return;
                                                    }

            String name = mPath.substring(mPath.lastIndexOf("/") + 1, mPath.lastIndexOf("."));
            String outputFilePath = String.format("%s_index_%d.jpg", Common.GetOutputFilesFolder(Common.renderModuleName).concat(name), index);
            PDFPage pdfPage = Common.loadPage(mContext, doc, index, PDFPage.e_ParsePageNormal);
                                                    if (pdfPage == null) {
                                                    return;
                                                    }

                                                    //Create the bitmap and erase its background.
            Bitmap bitmap = Bitmap.createBitmap((int) pdfPage.getWidth(), (int) pdfPage.getHeight(), Bitmap.Config.ARGB_8888);

                                                    //If the page has transparency, the bitmap should be erased "Color.TRANSPARENT".
                                                    if (pdfPage.hasTransparency()){
                bitmap.eraseColor(Color.TRANSPARENT);
                                                    }
                                                    else {
                bitmap.eraseColor(Color.WHITE);
                                                    }

            Matrix2D matrix = pdfPage.getDisplayMatrix(0, 0, (int)pdfPage.getWidth(), (int)pdfPage.getHeight(), Constants.e_Rotation0);

            Renderer renderer = new Renderer(bitmap,true);

                                                    //Render the page to bitmap.
            Progressive progressive = renderer.startRender(pdfPage, matrix, null);
                                                    int state = Progressive.e_ToBeContinued;
                                                    while (state == Progressive.e_ToBeContinued) {
                state = progressive.resume();
                                                    }
            progressive.delete();
                                                    if (state == Progressive.e_Error) {
                Toast.makeText(mContext, String.format("Failed to render the page No.%d failed!", index), Toast.LENGTH_LONG).show();
                                                    return;
                                                    }

                                                    //Save the render result to the jpeg image.
                                                    if (false == Common.SaveImageFile(bitmap, Bitmap.CompressFormat.JPEG, outputFilePath)) {
                Toast.makeText(mContext, String.format("Failed to Save Image File!"), Toast.LENGTH_LONG).show();
                                                    return;
                                                    }

            renderer.delete();
            pdfPage.delete();
            Toast.makeText(mContext, Common.runSuccesssInfo + outputFilePath, Toast.LENGTH_LONG).show();
                                                    } catch (PDFException e) {
            Toast.makeText(mContext, String.format("Failed to render the page No.%d! %s", index, e.getMessage()), Toast.LENGTH_LONG).show();
                                                    } finally {
            Common.releaseDoc(mContext, doc);
                                                    }
                                                    }
}