46

我正在研究一些应该能够在我的应用程序中阅读PDF的东西,我想将 PDF 视图放在我的自定义布局中。我更喜欢Android PDF 查看器,但是当我执行zoomIn时,zoomOut需要太多时间

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

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

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

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

4

6 回答 6

49

我不知道如何使用 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. 您可能会收到以下错误:

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);
于 2011-12-21T09:24:29.127 回答
7

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

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

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

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

第4步:打开终端并使用命令:cd直到你在android-pdf文件夹中

第 5 步:cd mupdfthan 命令:(make运行所有脚本大约需要 40 秒)

第6步:cd android(在mupdf目录内)

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

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

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

  1. 将 /android 文件夹中的“jni”文件夹复制到现有的 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. 保存“第三方.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 文件夹中的所有内容复制到项目中的“res/layout”文件夹中,除了 main.xml(因为如果您要复制到现有项目中,那么您应该已经拥有自己的 main.xml 或等效文件)。
  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);

    意图.setAction(意图.ACTION_VIEW);

    意图.setData(uri);

    context.startActivity(intent);

希望这有帮助:)

于 2013-07-18T23:53:16.140 回答
5

检查这个项目eBookDroid

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

支持以下格式的文件:

PDF
DjVu
XPS (OpenXPS)
comics books (cbz,cbr)
于 2011-12-14T08:34:07.263 回答
0

我的应用程序中有查看寻呼机。我需要在视图寻呼机中的每个片段上显示 pdf 文件。有没有办法从中获取 pdf 视图mupdf?通常我们调用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每个片段。我认为这不是正确的方法吗?

于 2014-10-03T07:21:20.170 回答
0

star18bit几乎给出的答案总结了它,但即使在我面临很多问题之后。

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

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

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

于 2015-01-09T11:18:19.283 回答