Подтвердить что ты не робот

Использование muPDF с эффектом curl/flip

Я использую muPDF для чтения PDF файлов в своем приложении. Мне не нравится его анимация по умолчанию (переключение по горизонтали). В другой стороне я нашел эту блестящую библиотеку для завивки изображения, а 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. core является экземпляром MuPDFCore. И используя его вот так:

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

MuPDFReaderView extends ReaderView и ReaderView расширяет AdapterView<Adapter> и реализует GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, Runnable.

Мой вопрос в том, как я могу использовать эффект curl в muPDF? Где я должен получать страницы один за другим и преобразовывать их в растровые изображения? а затем изменения аспектов адаптера в muPDF для CurlView.

В проекте примера flip-flap в FlipHorizontalLayoutActivity (мне тоже нравится этот эффект):

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

И FlipViewController extends AdapterView<Adapter>, а набор данных в TravelAdapter, который расширяет BaseAdapter.

Никто этого не делал раньше? Или может помочь мне сделать это?!

EDIT:

Я нашел еще один хороший PDF-редактор с открытым исходным кодом с эффектом curl, называемый fbreaderJ. его разработчик говорит: "дополнительный модуль, который позволяет открывать PDF файлы в FBReader. Основываясь на библиотеке radaee pdf.

Я смутился! причина radaeepdf является закрытым исходным кодом и загружаемый проект - это просто для демонстрации и вставки имени пользователя и пароля для этого пакета. Люди хотят изменить весь проект fbreader, например, имя пакета.

Другая проблема, из-за которой я запутался, - это где этот дополнительный исходный код модуля?!

В любом случае, если кто-то хочет мне помочь, fbreader сделал это очень хорошо.

EDIT:

Я поговорил с Робин Уоттс, который разработал muPDF (или один из разработчиков), и он сказал:

Считаете ли вы платформу /android/ClassStructure.txt? MuPDF прежде всего библиотеки C. Таким образом, стандартный api является C. Скорее чем раскрытие api точно так же, как и Java (что было бы красивое решение и что-то, над чем я работал, но не завершено из-за нехватки времени), мы внедрили MuPDFCore в завершите только те бит, которые нам нужны. MuPDFCore обрабатывает открытие PDF файла, и получать растровые изображения из него, которые будут использоваться в представлениях. или, скорее, MuPDFCore возвращает "представления", а не "растровые изображения". Если вам нужны растровые изображения, то вы собираетесь необходимо внести изменения в MuPDFCore.

Слишком много ошибок при изменении небольшой части класса MuPDFReaderView. Я путаюсь! Они связаны друг с другом.

Пожалуйста, ответьте более точно.

EDIT:

Истек срок действия.

4b9b3361

Ответ 1

Где я должен получать страницы один за другим и преобразовывать их в растровые изображения?

В нашем приложении (приложение для газет) мы используем MuPDF для рендеринга PDF файлов. Рабочий процесс выглядит следующим образом:

  • Загрузить PDF файл (у нас есть один PDF файл на странице газеты).
  • Предоставить его с помощью MuPDF
  • Сохранить растровое изображение в файловой системе
  • Загрузите Bitmap из файловой системы в качестве фонового изображения в представление

Итак, наконец, мы используем 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 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.) Я думаю, что нет необходимости публиковать код, как установить растровое изображение в качестве фона вида

Ответ 2

Если muPDF не поддерживает рендеринг в растровое изображение, у вас нет другого выбора, кроме рендеринга для обычного представления, и вынести дамп экрана в растровое изображение следующим образом:

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

Затем используйте этот растровый рисунок в качестве входа в другую библиотеку.