股票代码 688095
申请试用

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 SDK for Mobile 9.0版本带来了激动人心的新功能和增强功能。

用户现在可以利用新的事件处理来重排页面和渲染器,使用新的接口来控制逻辑页码的显示并自定义工具栏的位置。新版本还允许用户在双击手势事件期间启用/禁用缩放,并向 PDF 页面添加文本、图像或基于页面的平铺水印。此外,还添加了新的回调接口,供用户检测页面滑动并设置打开文档时的加载进度。

福昕PDF SDK 桌面和网页版V9.2 包含多项新功能和增强功能。 用户现在可以在使用新 接口编辑文本字段时检索光标位置。字体嵌入控制已通过添加所有 unicode 的选项得到改进。现在可以使用接口选择复选框和单选小部件。PDF 签名符合 PDF/A 标准,全文搜索功能也已升级以提高准确性。此外,Linux Office2PDF 现在支持 LibreOffice 7.0。

高级技术

XFA表单

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

权限管理

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

密文处理

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

福昕 PDF SDK(Android)

福昕阅读器(Android)是使用PDF SDK(Android)开发而成,可以从Google Play商店免费下载。 

优点

原生用户界面

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);
        }
    }
}