使用具有 curl/flip 效果的 muPDF

Using muPDF with curl/flip effect

我正在使用 muPDF for reading PDFs in my application. I don't like its default animation (Switching horizontally). In other side i found this brilliant library for curl effect on images, and this 项目来实现布局的翻转效果。

在curl示例项目中,在CurlActivity中,所有数据都是图像,在PageProvider中设置如下:

private class PageProvider implements CurlView.PageProvider {

    // Bitmap resources.
    private int[] mBitmapIds = { R.drawable.image1, R.drawable.image2,
            R.drawable.image3, R.drawable.image4};

并像这样使用它:

private CurlView mCurlView;
mCurlView = (CurlView) findViewById(R.id.curl);
mCurlView.setPageProvider(new PageProvider());

并且 CurlViewGLSurfaceView 扩展并实现 View.OnTouchListener, CurlRenderer.Observer

但在 muPDF 中,如果我没记错的话,数据在 core 对象中。 coreMuPDFCore 的实例。并像这样使用它:

MuPDFReaderView mDocView;
MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
mDocView.setAdapter(new MuPDFPageAdapter(this, this, core));

MuPDFReaderView 扩展了 ReaderView 并且 ReaderView 扩展了 AdapterView<Adapter> 并实现了 GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, Runnable.

我的问题是如何在 muPDF 中使用卷曲效果?我应该在哪里一页一页地获取页面并将它们转换为位图?然后将 muPDF 中适配器的各个方面更改为 CurlView。

在flip-flap示例项目中,在FlipHorizontalLayoutActivity(我也喜欢这个效果)中,我们有这些:

private FlipViewController flipView;
flipView = new FlipViewController(this, FlipViewController.HORIZONTAL);
flipView.setAdapter(new TravelAdapter(this));
setContentView(flipView);

并且 FlipViewController 扩展了 AdapterView<Adapter>TravelAdapter 中的数据集扩展了 BaseAdapter

以前没有人这样做过吗?或者可以帮助我做到这一点?!

编辑:

我发现了另一个很好的开源 PDF reader,它具有卷曲效果,名为 fbreaderJ. its developer says "An additional module,它允许在 FBReader 中打开 PDF 文件。基于 radaee pdf 库。"

我糊涂了!因为 radaeepdf is closed source and downloadable project 仅用于演示,插入的用户名和密码用于 这个包 。 人们想要更改整个 fbreader 项目,例如包名称。

另一个让我困惑的问题是这个附加模块的源代码在哪里?!

反正有人要帮我,fbreader已经做得很好了

编辑:

我与开发 muPDF 的 Robin Watts(或开发人员之一)交谈,他说:

Have you read platform/android/ClassStructure.txt ? MuPDF is primarily a C library. The standard api is therefore a C one. Rather than exposing that api exactly as is to Java (which would be the nicest solution, and something that I've done some work on, but have not completed due to lack of time), we've implemented MuPDFCore to wrap up just the bits we needed. MuPDFCore handles opening a PDF file, and getting bitmaps from it to be used in views. or rather, MuPDFCore returns 'views', not 'bitmaps'. If you need bitmaps, then you're going to need to make changes in MuPDFCore.

更改 MuPDFReaderView 的一小部分时出现太多错误 class。我有点迷惑不解了!这些是相互关联的。

请更准确地回答。

编辑:

赏金已过期。

如果 muPDF 不支持渲染到位图,您别无选择,只能渲染到常规视图并将屏幕转储到位图,如下所示:

View content = findViewById(R.id.yourPdfView);
Bitmap bitmap = content.getDrawingCache();

然后使用此位图作为您其他库的输入。

Where should i get pages one by one and converting them to bitmaps?

在我们的应用程序(报纸应用程序)中,我们使用 MuPDF 来呈现 PDF。 工作流程如下:

  1. 下载 PDF 文件(我们每个报纸页面有一个 PDF)
  2. 用 MuPDF 渲染它
  3. 将位图保存到文件系统
  4. 从文件系统加载位图作为背景图像到视图

所以,最后,我们使用的是 MuPDFCore.java 及其方法 drawPage(...) 和 onDestroy()

这是你想知道的还是我没抓住要点?

编辑

1.) 我认为没有必要post 编写如何下载文件的代码。但是在下载之后,我将一个 RenderTask(从 Runnable 扩展)添加到一个 Renderqueue 并触发该队列。 RenderTask 需要一些渲染信息:

/**
 * constructs a new RenderTask instance
 * @param context: you need Context for MuPdfCore instance
 * @param pageNumber
 * @param pathToPdf 
 * @param renderCallback: callback to set bitmap to the view after    
 * rendering
 * @param heightOfRenderedBitmap: this is the target height
 * @param widthOfRenderedBitmap: this is the target width
 */
public RenderTask (Context context, Integer pageNumber, String pathToPdf, IRenderCallback,    
                   renderCallback, int heightOfRenderedBitmap, 
                   int widthOfRenderedBitmap) {

    //store things in fields
}

2.) + 3.) Renderqueue 将 RenderTask 包装在一个新的 Thread 中并启动它。因此将调用 RenderTask 的 运行 方法:

@Override
public void run () {

    //do not render it if file exists
    if (exists () == true) {

        finish();
        return;
    }


    Bitmap bitmap = render();

    //if something went wrong, we can't store the bitmap
    if (bitmap == null) {

        finish();
        return;
    }

    //now save the bitmap
    // in my case i save the destination path in a String field
    imagePath = save(bitmap, new File("path/to/your/destination/folder/" + pageNumber + ".jpg"));

    bitmap.recycle();
    finish();
}

/**
 * let's trigger the callback
 */
private void finish () {

    if (renderCallback != null) {

        // i send the whole Rendertask to callback
        // maybe in your case it is enough to send the pageNumber or path to    
        // renderend bitmap   
        renderCallback.finished(this); 
    }

}

/**
 * renders a bitmap
 * @return
 */
private Bitmap render() {

    MuPDFCore core = null;
    try {
        core = new MuPDFCore(context, pathToPdf);
    } catch (Exception e) {

        return null;
    }

    Bitmap bm = Bitmap.createBitmap(widthOfRenderedBitmap, heightOfRenderedBitmap, Config.ARGB_8888);
    // here you render the WHOLE pdf cause patch-x/-y == 0
    core.drawPage(bm, 0, widthOfRenderedBitmap, heightOfRenderedBitmap, 0, 0, widthOfRenderedBitmap, heightOfRenderedBitmap, core.new Cookie());
    core.onDestroy();
    core = null;
    return bm;
}

/**
 * saves bitmap to filesystem
 * @param bitmap
 * @param image
 * @return
 */
private String save(Bitmap bitmap, File image) {

    FileOutputStream out = null;
    try {
        out = new FileOutputStream(image.getAbsolutePath());
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
        return image.getAbsolutePath();

    } catch (Exception e) {

        return null;
    }

    finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch(Throwable ignore) {}

    }
}  

}

4.) 我认为没有必要post编写如何将位图设置为视图背景的代码