W swojej aplikacji otrzymam strumień bajtów i przekonwertuję go na plik pdf w pamięci telefonu. Jak wyrenderować to do pliku PDF? I pokazać to na zajęciach?
Odpowiedzi:
Niektóre telefony (takie jak Nexus One) są dostarczane z preinstalowaną wersją Quickoffice, więc może to być tak proste, jak wysłanie odpowiedniej intencji po zapisaniu pliku na karcie SD.
public class OpenPdf extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.OpenPdfButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File file = new File("/sdcard/example.pdf");
if (file.exists()) {
Uri path = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
startActivity(intent);
}
catch (ActivityNotFoundException e) {
Toast.makeText(OpenPdf.this,
"No Application Available to View PDF",
Toast.LENGTH_SHORT).show();
}
}
}
});
}
}
Otwórz plik pdf w przeglądarce internetowej .
public class MyPdfViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView mWebView=new WebView(MyPdfViewActivity.this);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginsEnabled(true);
mWebView.loadUrl("https://docs.google.com/gview?embedded=true&url="+LinkTo);
setContentView(mWebView);
}
}
Android-Lollipop (api 21) wprowadza nowe API: PdfRenderer
Ten interfejs API umożliwia utworzenie mapy bitowej ze strony w dokumencie PDF.
W skrócie:
uzyskaj możliwy do wyszukania deskryptor pliku z dokumentu PDF:
ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
utwórz PdfRenderer
PdfRenderer renderer = new PdfRenderer(fd);
przygotuj Bitmapę
Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
pobierz PdfRenderer.Page do wyrenderowania
PdfRenderer.Page page = renderer.openPage(pageIndex);
wyrenderuj stronę na przygotowanej bitmapie
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
teraz możesz robić co chcesz z bitmapą.
zwróć uwagę, że dwa puste argumenty mogą pozwolić ci wyciąć część strony i wykonać transformację (przy użyciu Matrix ) klipu
istnieje inny tryb renderowania: RENDER_MODE_FOR_PRINT . Jeśli potrzebujesz tego trybu, istnieją pewne wskazówki, jak go właściwie używać: oto szczegóły .
Ta biblioteka jest prosta i działa dobrze: Przeglądarka plików PDF na Androida https://github.com/barteksc/AndroidPdfViewer
Stara odpowiedź ...
Myślę, że Joan Zapata daje nam lepsze i prostsze rozwiązanie:
https://github.com/JoanZapata/android-pdfview
Zapewniam, że to działa!
pdfView.fromAsset(pdfName)
? Próbowałem użyć ścieżki bezwzględnej, ale plik nie został znaleziony (i jestem pewien, że tam jest). Przykład: /data/data/package.name/files/images/filename.pdf
W przypadku lokalnych plików pdf można je renderować za pośrednictwem bibliotek innych firm. na przykład użyj biblioteki MuPDF , obsługiwane typy plików to PDF, PNG i JPEG.
Jedną z wad MuPDF jest to, że wykorzystuje natywną bibliotekę do spełnienia celu, więc późniejsze przeniesienie aplikacji na platformę BlackBerry nie będzie łatwe.
Aby otworzyć plik PDF z tablicy bajtów, możesz użyć RadaeePDF
, możesz wykonać następujące czynności w swoim działaniu:
private PDFReader m_vPDF = null;
private Document doc = new Document();
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Global.Init(this);
m_vPDF = new PDFReader(this);
doc.Close();
int ret = m_doc.OpenMem(data, password);
switch( ret )
{
case -1://need input password
finish();
break;
case -2://unknown encryption
finish();
break;
case -3://damaged or invalid format
finish();
break;
case -10://access denied or invalid file path
finish();
break;
case 0://succeeded, and continue
break;
default://unknown error
finish();
break;
}
m_vPDF.open(doc);
setContentView( m_vPDF );
}