【问题标题】:Integrate MuPDF Reader in an app在应用程序中集成 MuPDF Reader
【发布时间】:2012-01-19 23:51:51
【问题描述】:

我正在处理一些应该能够在我的应用程序中阅读 PDF 的内容,并且我想将 PDF 视图放入我的 自定义布局。我更喜欢 Android PDF 查看器,但是当我执行 zoomInzoomOut 时,需要太多时间

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

我正在使用 Cygwin 为本地代码构建库。因此,我不清楚一些事情:

  1. 如何将 MuPDF 集成到我的项目中(根据我的问题标题)?

  2. 一旦我成功集成了它,那么如何将 PDF 阅读器放入我的自定义视图(以 XML 或编程方式)?

【问题讨论】:

  • 相信我,兄弟,如果你打算整合它,那么至少要为忙碌的一周做好准备
  • @ingsaurabh :: 哦,真的吗?你实现了吗?
  • 是的,并不是说几乎所有我研究过的 PDF 库,但你不会实现你想要的,所有这些都很慢而且没有文档
  • @rasen58 不,它不能完全让您将其用于商业目的,您必须通过将详细信息邮寄到 sales@artifex.com 来说服他们
  • @Mr.Hyde 接受的答案已经对我有用

标签: android pdf android-ndk render mupdf


【解决方案1】:

我不知道如何在 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 (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);

【讨论】:

  • 是的,我想提一下,但这不是问题所在)
  • 我也在做同样的步骤,但在编译 rtifex_mupdf_MuPDFCore_gotoPageInternal' 后出现以下错误:D:/android-ndk-r8/mupdf-1.0-source/android//jni/mupdf.c:102 : 错误: 'fz_matrix' undeclared (第一次在这个函数中使用) D:/android-ndk-r8/mupdf-1.0-source/android//jni/mupdf.c:102: error: expected ';' D:/android-ndk-r8/mupdf-1.0-source/android//jni/mupdf.c:104: 错误:未声明(在此函数中首次使用) D:/android-ndk-r8/mupdf-1.0-source /android//jni/mupdf.c:104: error: 'dev' undecl.. & 还有更多。你能帮我解决这个问题吗。
  • 你能问一个单独的问题并将整个错误堆放在那里吗?
  • 在 windows cigwin 中使用 mupdf 参考此stackoverflow.com/a/12279638/810098
  • 较新版本的mupdf没有PixMapView类
【解决方案2】:
【解决方案3】:

这就是我在我的 mac(2012,intel i5)上实现的方式:

第一步:获取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 android(在 mupdf 目录内)

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

几秒钟后。您应该在 mupdf &gt; android &gt; libs &gt; ... 中有新文件夹,在您的 android 项目中使用它。

如何在现有的 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)
  1. 保存“Android.mk”。
  2. 在“jni”文件夹中打开“Core.mk”。
  3. 改变

    MY_ROOT := ../..

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

    ..

在 LOCAL_C_INCLUDES

$(LOCAL_PATH)
  1. 保存“Core.mk”。
  2. 打开“jni”文件夹中的“ThirdParty.mk”。
  3. 改变

    MY_ROOT := ../..

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

    ..

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 文件夹中的所有内容,除了 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 意图 = new Intent(context, MuPDFActivity.class);

    intent.setAction(Intent.ACTION_VIEW);

    intent.setData(uri);

    context.startActivity(intent);

希望有帮助:)

【讨论】:

  • 第6步:cd android(在mupdf目录内)-bash:cd:android:没有这样的文件或目录
  • @SazzadHossainKhan 现在是平台/安卓
【解决方案4】:

查看这个项目eBookDroid

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

支持以下格式的文件:

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

【讨论】:

  • 当我尝试使用 cygwin 生成 lib 文件时出现编译时错误 .. MyDirectory/EBookDroid/jni/djvu/JPEGDecoder.cpp:73:21: error: jconfig.h: No such文件或目录
  • 如果此文件存在,或者只是下载apk并从中提取lib,那么在src文件夹中必须存在一些路径问题,就这么简单
  • @ingsaurabh 那么哪个是所有 pdf 库中最快和更好的库?
  • 你试过这个是最快的吗,但是你必须从中提取 pdf 模块,它是最好的,也是最快的
  • 我试过这个,但它在缩放 pdf 时出现问题,使用位图强制关闭超过了 VM。
【解决方案5】:

我的应用程序中有视图寻呼机。我需要在视图寻呼机的每个片段上显示 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。我认为这不是正确的方法吗?

【讨论】:

    【解决方案6】:

    star18bit 给出的答案几乎总结了它,但即使我遇到了很多问题。

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

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

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

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 我在答案中添加了更多信息,并给出了链接,因为我无法在此处编写所有步骤。要求某人更改他们的评论而不是直接删除它也是礼貌的。
    • 您试图用多个(赞成)答案来回答一个 3 年前的问题。此外,您正在向另一个答案添加一些信息。这可能更适合作为评论而不是完整的答案。这是我的意见……其他人可能会有所不同,这也很好。
    • 它可能已经 3 岁了,但尽管得到了赞成的答案,但这对我来说仍然是一个问题。这些答案都没有帮助我。这就是为什么我想将其添加为单独的答案。
    猜你喜欢
    • 2014-05-16
    • 2012-08-22
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多