在应用程序中集成MuPDF Reader

dha*_*ram 45 pdf android render android-ndk mupdf

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

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

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

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

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

Yur*_*ury 47

我不知道如何在Windows中使用cygwin这样做,因为我正在使用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. 您可能会收到以下错误:

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(错误:重新定义typedef ....) 但是,你可以简单地在文件/thirdparty/jbig2dec/os_types.h中注释类型定义的行.

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

StaticLibrary  : libmupdfthirdparty.a
SharedLibrary  : libmupdf.so
Run Code Online (Sandbox Code Playgroud)

这是第一个问题的答案.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);
Run Code Online (Sandbox Code Playgroud)

  • 较新版本的mupdf没有PixMapView类 (2认同)

sta*_*bit 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 mupdfthan命令:( make运行所有脚本大约需要40秒)

第6步:cd android(在mupdfdir 内)

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

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

如何在您的EXISTING 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:= ..

MUPDF_ROOT := $(TOP_LOCAL_PATH)
Run Code Online (Sandbox Code Playgroud)
  1. 保存'Android.mk'.
  2. 在'jni'文件夹中打开'Core.mk'.
  3. 更改

    MY_ROOT:= ../ ..

MY_ROOT := $(LOCAL_PATH)
Run Code Online (Sandbox Code Playgroud)
  1. 改变所有

    ..

在LOCAL_C_INCLUDES

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

    MY_ROOT:= ../ ..

MY_ROOT := $(LOCAL_PATH)
Run Code Online (Sandbox Code Playgroud)
  1. 更改所有

    ..

LOCAL_C_INCLUDES中

$(LOCAL_PATH)
Run Code Online (Sandbox Code Playgroud)
  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. 在''标签之间粘贴所有活动列表

    AndroidManifest.xml在/ android文件夹里面,你应该从 mupdf里面的AndroidManifest.xml 工作副本中复制.

  11. MuPDF现在在您现有的Eclipse项目中.要使用它,请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(意向);

希望这有帮助:)

  • @SazzadHossainKhan它现在是平台/ android (2认同)

ing*_*abh 5

检查这个项目eBookDroid

EBookDroid是一个基于VuDroid代码库的Android开源(GPL)文档查看器.

支持以下格式的文件:

PDF
DjVu
XPS (OpenXPS)
comics books (cbz,cbr)
Run Code Online (Sandbox Code Playgroud)