2015-06-16 13 views
11

Sto usando muPDF per leggere i PDF nella mia applicazione. Non mi piace l'animazione predefinita (Passaggio in orizzontale). Nell'altro lato ho trovato la libreria this per effetti di arricciatura sulle immagini e il progetto this per l'effetto flip-flap sui layout.Utilizzo di muPDF con effetto curl/flip

Nel progetto di esempio riccio, in CurlActivity, tutti i dati sono immagini e impostare in PageProvider come questo:

private class PageProvider implements CurlView.PageProvider { 

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

e usarlo in questo modo:

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

E CurlView estende da GLSurfaceView e strumenti View.OnTouchListener, CurlRenderer.Observer

Ma in muPDF se non mi sbaglio, i dati sono in core oggetto. core è l'istanza di MuPDFCore. E l'utilizzo in questo modo:

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

MuPDFReaderView estende ReaderView e ReaderView estende AdapterView<Adapter> e implementa GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, Runnable.

La mia domanda è dove posso utilizzare l'effetto curl in muPDF? Dove dovrei ottenere le pagine una per una e convertirle in bitmap? e quindi modificare gli aspetti dell'adapter in muPDF su CurlView.

Nel progetto di esempio flip-flap, in FlipHorizontalLayoutActivity (mi piace questo effetto troppo), abbiamo questi:

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

E FlipViewController estende AdapterView<Adapter>, e set di dati in TravelAdapter che si estende BaseAdapter.

Nessuno lo ha mai fatto prima? O può aiutarmi a farlo ?!

EDIT:

ho trovato un altro buon lettore open source PDF con effetto ricciolo chiamato fbreaderJ. il suo sviluppatore dice "Un additional module che permette di aprire i file PDF in FBReader. basato sulla libreria radaee pdf."

mi sono confuso! causa radaeepdf è closed source e downloadable project è solo per demo e nome utente e password inseriti sono per questo pacchetto. Le persone vogliono cambiare l'intero progetto del fbreader come il nome del pacchetto.

Un altro problema per farmi confondere è dove si trova questo codice sorgente del modulo aggiuntivo ?!

In ogni caso, se qualcuno vuole aiutarmi, l'utente lo ha fatto molto bene.

EDIT:

Ho parlato con Robin Watts, che ha sviluppato MuPDF (o uno degli sviluppatori), e mi ha detto:

Hai letto piattaforma/android/ClassStructure.txt? MuPDF è principalmente una libreria C. L'API standard è quindi una C. Piuttosto di esporre quella API esattamente come è a Java (che sarebbe la soluzione più bella , e qualcosa su cui ho lavorato, ma avere non completata a causa della mancanza di tempo), abbiamo implementato MuPDFCore a avvolgere solo i bit di cui avevamo bisogno. MuPDFCore gestisce l'apertura di un file PDF, e recupera i bitmap da utilizzare nelle viste. o meglio, MuPDFCore restituisce 'viste', non 'bitmap'. Se hai bisogno di bitmap, hai intenzione di modificare in MuPDFCore.

Ci sono troppi errori quando si modifica una piccola parte della classe MuPDFReaderView. Mi confondo! Questi sono legati l'uno all'altro.

Si prega di rispondere più precisamente.

EDIT:

E di taglie è scaduto.

+0

Avere hai qualche soluzione per questo? –

+0

@AnandSavjani Non ho provato la risposta verificata, ma sembra funzionare. –

risposta

1

Dove devo ottenere le pagine una per una e convertirle in bitmap?

Nella nostra applicazione (app di giornale) utilizziamo MuPDF per il rendering di PDF. Il flusso di lavoro è questa:

  1. file Download PDF (abbiamo un PDF per pagina di giornale)
  2. Render con MuPDF
  3. Salva la bitmap al file system
  4. Caricare la bitmap dal file system come immagine di sfondo di una vista

Così, finalmente, quello che usiamo è MuPDFCore.java e dei suoi metodi DrawPage (...) e OnDestroy()

E 'questo che vuoi sapere o mi manca il punto?

EDIT

1.) penso che non è necessario inserire il codice come scaricare un file. Ma dopo il download aggiungo un RenderTask (si estende da Runnable) a un Renderqueue e attiva quella coda.Il RenderTask ha bisogno di informazioni per il rendering:

/** 
* 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.) L'Renderqueue avvolge il RenderTask in un nuovo thread e lo avvia. Così il run-metodo della RenderTask sarà richiamato:

@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.) penso che non è necessario inserire il codice come impostare una bitmap come sfondo di una vista

+0

@ Mr.Hyde: vedi la mia modifica, spero che questo ti possa aiutare. –

+0

Sono troppo occupato ora, ma lo proverò. Ad ogni modo se c'è un progetto di esempio, è stato così bello: /. Grazie. –

2

Se il MuPDF non supporta il rendering di una bitmap, non hai altra scelta che il rendering di una vista normale e prendere una discarica schermo per una bitmap come questo:

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

quindi utilizzare questo bitmap come input alla tua altra biblioteca.

+0

Grazie DKIT, so come convertire una vista in bitmap, ma voglio una risposta più dettagliata. Si prega di vedere la domanda modificata. –