使用具有卷曲/翻转效果的 muPDF

Posted

技术标签:

【中文标题】使用具有卷曲/翻转效果的 muPDF【英文标题】:Using muPDF with curl/flip effect 【发布时间】:2015-08-31 17:55:22 【问题描述】:

我正在使用muPDF 在我的应用程序中阅读 PDF。我不喜欢它的默认动画(水平切换)。另一方面,我发现 this 用于图像卷曲效果的辉煌库,以及用于布局翻转效果的 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());

CurlView 扩展自GLSurfaceView 并实现View.OnTouchListener, CurlRenderer.Observer

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

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

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

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

在翻盖示例项目中,在FlipHorizontalLayoutActivity(我也喜欢这种效果)中,我们有这些:

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

FlipViewController 扩展了AdapterView<Adapter>,而TravelAdapter 中的数据集扩展了BaseAdapter

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

编辑:

我发现了另一个不错的带有卷曲效果的开源 PDF 阅读器,名为 fbreaderJ。它的开发者说“一个允许在 FBReader 中打开 PDF 文件的additional module。基于 radaee pdf 库。

我糊涂了!因为radaeepdf 是封闭源代码,downloadable project 仅用于演示,插入的用户名和密码用于此包。 人们想要更改整个 fbreader 项目,例如包名。

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

不管怎样,如果有人想帮助我,fbreader 已经做得很好了。

编辑:

我与开发 muPDF(或其中一位开发人员)的 Robin Watts 进行了交谈,他说:

你读过 platform/android/ClassStructure.txt 吗? MuPDF 是 主要是一个 C 库。因此,标准 api 是 C 的。相当 而不是将 API 完全按原样暴露给 Java(这将是 最好的解决方案,我已经做了一些工作,但是有 由于时间不够,没有完成),我们已经实现了 MuPDFCore 总结我们需要的部分。 MuPDFCore 处理打开 PDF 文件, 并从中获取位图以在视图中使用。或者更确切地说,MuPDFCore 返回“视图”,而不是“位图”。如果你需要位图,那你就去 需要在 MuPDFCore 中进行更改。

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

请准确回答。

编辑:

赏金已过期。

【问题讨论】:

你有什么解决办法吗? @AnandSavjani 我没有测试选中的答案,但它似乎有效。 【参考方案1】:

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

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

然后将此位图用作其他库的输入。

【讨论】:

谢谢 DKIT,我知道如何将视图转换为位图,但我想要更详细的答案。请查看已编辑的问题。【参考方案2】:

我应该从哪里获取页面并将它们转换为位图?

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

    下载 PDF 文件(我们每个报纸页面有一个 PDF) 使用 MuPDF 进行渲染 将位图保存到文件系统 将位图从文件系统作为背景图像加载到视图中

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

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

编辑

1.) 我认为没有必要发布如何下载文件的代码。但是在下载之后,我将一个 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 包装在一个新线程中并启动它。所以会调用 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.) 我认为没有必要发布如何将位图设置为视图背景的代码

【讨论】:

我现在太忙了,但我会测试一下。无论如何,如果有一个示例项目,那就太好了:/。谢谢。

以上是关于使用具有卷曲/翻转效果的 muPDF的主要内容,如果未能解决你的问题,请参考以下文章

使用 MuPDF 像翻转板一样水平翻转

IOS - UIPageViewController 使用页面卷曲效果转到上一页并在每个页面上显示页码

如何在 pdf 文件中添加页面卷曲效果?

css 具有动画翻转/悬停效果的灰度翻转图像

如何在 Modal Segue 的过渡中添加完整的卷曲效果?

iphone: UIwebview 卷曲效果