在应用程序中集成MuPDF Reader

时间:2011-12-14 06:53:20

标签: android pdf android-ndk render mupdf

我正在研究一些应该能够在我的应用中阅读 PDF 的内容,并希望将PDF视图放在我的自定义布局中。我更喜欢 Android PDF Viewer ,但当我执行 zoomIn zoomOut 时,需要花费太多时间

所以目前我应该使用 MuPDF 开源项目集成到我的项目中,它基于 JNI ,我不习惯。

我正在使用 Cygwin 来构建本机代码库。因此,我不清楚几件事:

  1. 如何在我的项目中整合 MuPDF (根据我的问题标题)?

  2. 一旦我成功整合它,那么如何将PDF阅读器放入自定义视图(在XML或programmaticaly中)?

6 个答案:

答案 0 :(得分:47)

我不知道如何使用cygwin在Windows中执行此操作,因为我使用Ubuntu进行开发。但我认为程序应该是一样的。

  1. 在此处下载文件mupdf-0.9-source.tar.gz: http://code.google.com/p/mupdf/downloads/list?q=source
  2. 下载文件mupdf-thirdparty.zip
  3. 提取来源。默认情况下,它们将被解压缩到文件夹:mupdf-0.9 /
  4. 将文件mupdf-thirdparty.zip解压缩到文件夹mupdf-0.9 /
  5. 构建项目mupdf-0.9(对于Windows,您应该使用VS,因为它在自述文件中声明)
  6. 然后转到文件夹mupdf-0.9 / android /
  7. 运行ndk-build
  8. 您可能会收到以下错误:
  9. Compile thumb : mupdfthirdparty <= jbig2.c In file included from /home/yury/programming/android/workspace/mupdf-0.9/android/jni/../../thirdparty/jbig2dec/os_types.h:53, from /home/yury/programming/android/workspace/mupdf-0.9/android/jni/../../thirdparty/jbig2dec/jbig2.c:22: /home/yury/software/android-ndk-r6b/platforms/android-8/arch-arm/usr/include/stdint.h:48: error: redefinition of typedef 'int8_t' /home/yury/programming/android/workspace/mupdf-0.9/android/jni/../../thirdparty/jbig2dec/os_types.h:47: note: previous declaration of 'int8_t' was here

    此处解释了解决方案:mupdf for android: ndk-build problem (error: redefinition of typedef....) 但是,您可以在文件/thirdparty/jbig2dec/os_types.h中简单地注释类型定义的行

    之后,您将收到两个库:一个是静态的,一个是为您的Android应用程序共享的。

    StaticLibrary  : libmupdfthirdparty.a
    SharedLibrary  : libmupdf.so
    

    这是第一个问题的答案。此外,android / Readme.txt文件中还有一个很好的分步指南。

    现在回答第二个问题。 在Android应用程序中,您可以找到测试项目。有3个文件:

    • MuPDFActivity.java
    • MuPDFCore.java
    • PixmapView.java

    只需复制项目中的最后两个文件即可。请参阅MuPDFActivity.java中的示例,了解如何在活动中嵌入mupdf布局。在这个文件中它完成如下:

        PixmapView pixmapView;
    //...   
    layout = new RelativeLayout(this);
    //...
        RelativeLayout.LayoutParams pixmapParams =
                          new RelativeLayout.LayoutParams(
                                    RelativeLayout.LayoutParams.FILL_PARENT,
                                    RelativeLayout.LayoutParams.FILL_PARENT);
        pixmapParams.addRule(RelativeLayout.ABOVE,100);
        layout.addView(pixmapView, pixmapParams);
    
        setContentView(layout);
    

答案 1 :(得分:15)

答案 2 :(得分:7)

这是我在Mac上的表现(2012,intel i5):

第1步:获取mupdf-1.2-source.zip

第2步:获取android-ndk-mac-64

第3步:在新文件夹调用Android-pdf中解压缩它们并将解压缩文件夹重命名为mupdfandroid-ndk(您可以随意调用它们)

步骤4:打开终端并使用命令:cd,直到您进入android-pdf文件夹

步骤5:cd mupdf而不是命令:make(运行所有脚本大约需要40秒)

第6步:cd androidmupdf dir内)

步骤7:打开查找程序转到您创建的文件夹Android-pdf,而不是android-ndk拖动文件调用ndk-build到终端命令行并输入(基本上添加了ndk-build的路径来操作在mupdf lib上。)

几秒后你应该在你的android项目中使用mupdf > android > libs > ...内的新文件夹。

如何在您的现有Eclipse项目中使用MuPDF:

  1. 将'jni'文件夹从/ android文件夹复制到现有的Eclipse项目中。
  2. 将/ thirdparty文件夹复制到项目的“jni”文件夹中。
  3. 将/ cbz文件夹复制到项目的“jni”文件夹中。
  4. 将/ draw文件夹复制到项目的“jni”文件夹中。
  5. 将/ fitz文件夹复制到项目的“jni”文件夹中。
  6. 将/ generated文件夹复制到项目的“jni”文件夹中。
  7. 将/ pdf文件夹复制到项目的“jni”文件夹中。
  8. 将/ scripts文件夹复制到项目的“jni”文件夹中。
  9. 将/ xps文件夹复制到项目的“jni”文件夹中。
  10. 在'jni'文件夹中打开'Android.mk'。
  11. 更改

    MUPDF_ROOT:= ..

  12. MUPDF_ROOT := $(TOP_LOCAL_PATH)
    
    1. 保存'Android.mk'。
    2. 在'jni'文件夹中打开'Core.mk'。
    3. 更改

      MY_ROOT:= ../..

    4. MY_ROOT := $(LOCAL_PATH)
      
      1. 更改所有

        ...

      2. LOCAL_C_INCLUDES 中的

        $(LOCAL_PATH)
        
        1. 保存'Core.mk'。
        2. 在'jni'文件夹中打开'ThirdParty.mk'。
        3. 更改

          MY_ROOT:= ../..

        4. MY_ROOT := $(LOCAL_PATH)
          
          1. 更改全部

            ...

          2. LOCAL_C_INCLUDES

            $(LOCAL_PATH)
            
            1. 保存'ThirdParty.mk'。
            2. 现在在项目的'jni'目录中执行'ndk-build'。
            3. 将/ android / src文件夹中的所有内容复制到项目的“src”文件夹中。
            4. 将/ android / res / drawable文件夹中的所有内容复制到项目的“res / drawable”文件夹中。
            5. 将/ android / res / drawable-ldpi文件夹中的所有内容复制到项目中的“res / drawable-ldpi”文件夹中。
            6. 将/ android / res / drawable-mdpi文件夹中的所有内容复制到项目中的“res / drawable-mdpi”文件夹中。
            7. 复制/ android / res / layout文件夹中的所有内容EXCEPT main.xml(因为如果要复制到现有项目中,那么您应该已经拥有自己的main.xml或等效文件)到'res / layout'文件夹中你的项目。
            8. 将/ android / res / values文件夹中的所有内容复制到项目的“res / values”文件夹中。如果您现有项目中已有'strings.xml',请将/android/res/values/strings.xml中的''标记之间的所有内容复制到项目的strings.xml中(粘贴在''标记之间)。与'colors.xml'类似,如果您现有项目中已经有'colors.xml',请将/android/res/values/strings.xml中''标签之间的所有内容复制到项目的strings.xml中(粘贴在''标签之间)。
            9. 打开项目中的'AndroidManifest.xml'。
            10. 在''标签之间粘贴来自

              的所有活动列表 / android文件夹中的

              AndroidManifest.xml你应该从mupdf里面的AndroidManifest.xml的工作副本中复制。

            11. 现在的Eclipse项目中的MuPDF。要使用它,请在您的应用程序中调用com.artifex.mupdf.ChoosePDFActivity.class。这是MuPDF的主要类。

            12. 使用预修复文件打开pdf:

              Uri uri = Uri.parse(“pdf文件的路径”);

              Intent intent = new Intent(context,MuPDFActivity.class);

              intent.setAction(Intent.ACTION_VIEW);

              intent.setData(URI);

              context.startActivity(意图);

            13. 希望这有帮助:)

答案 3 :(得分:5)

检查此项目eBookDroid

  

EBookDroid是基于VuDroid代码库的Android开源(GPL&#39; ed)文档查看器。

     

支持以下格式的文件:

PDF
DjVu
XPS (OpenXPS)
comics books (cbz,cbr)

答案 4 :(得分:0)

我的应用程序中有查看分页器。我需要在视图pager中的每个片段上显示pdf文件。是否可以从mupdf获取pdf视图?通常我们会调用mupdf,如下所示

Uri uri = Uri.parse("path to pdf file");

Intent intent = new Intent(context, MuPDFActivity.class);

intent.setAction(Intent.ACTION_VIEW);

intent.setData(uri);

context.startActivity(intent);

因此,如果我在我的应用中使用mupdf,我必须在每个片段上调用MuPDFActivity。我认为这不正确吗?

答案 5 :(得分:0)

star18bit给出的答案几乎总结了一下,但即便如此,我也面临很多问题。

就像make命令对我没有用,我必须使用Visual Studio构建它。所以我列出了所有pre-req软件。像ANT一样。我们还需要在PATH中添加sdk文件夹的toolsplatform-tools个文件夹。

另外,我必须在Core2.mk文件中进行更改,与Core.mk中的更改相同。我不能在这里提供所有信息,因为它很多,所以我在这个链接中提供了完整的信息:

http://howtojava.net/tutorials/android/integrate-mupdf-with-android-in-windows-7