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?
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.
publicclassOpenPdfextendsActivity{
@OverridepublicvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.OpenPdfButton);
button.setOnClickListener(new View.OnClickListener() {
@OverridepublicvoidonClick(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();
}
}
}
});
}
}
Myślę, że działa to tylko z linkiem przeglądarki Google, ponieważ wyświetla tylko obrazy. Jeśli użyjemy linku do pliku PDF bezpośrednio, to nie zadziała. Czy to jest poprawne ?
Nathan Do
Wygląda na to, że nie działa to w przypadku plików lokalnych, tylko zdalnych.
Alfie Hanssen
2
A jeśli link się zmieni?
Shuhrat Akramov
3
„Po uporczywym testowaniu przez 2 dni w dokumentach Google pojawił się błąd informujący, że osiągnięto limit przepustowości dla przeglądania lub pobierania plików, które nie są w formacie Dokumentów Google ..... Więc nie wydaje się wiarygodne”. stackoverflow.com/questions/2655972/…
Wédney Yuri
9
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:
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 .
Czy można to osiągnąć bez zapisywania pliku w telefonie? Otrzymuję plik PDF jako strumień bajtowy i muszę pokazać go użytkownikowi bez zapisywania go w telefonie.
Gokhan Arik
ograniczenie polega na przekazaniu przeszukiwalnego deskryptora pliku do konstruktora; a fd ze strumienia gniazda nie jest przeszukiwane. Możesz spróbować przechowywać wszystkie bajty ze strumienia w buforze i uzyskać z tego przeszukiwalny fd.
Alecs: W czym użyłeś pliku pdfName w 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
h-bomb
1
Drogi @ h-bomb, musisz użyć metody fromasset , gdy plik PDF znajduje się w zasobniku projektu. Aby załadować plik PDF z urządzenia, możesz użyć metody fromFile .
Alecs
1
Dzięki wielkie. Zdecydowałem się użyć FileProvider Androida i pozwolić zewnętrznej aplikacji na otwieranie pliku PDF. Co zaskakujące, dokumentacja i przykładowy kod w dokumencie programisty FileProvider były doskonałe.
h-bomb
3
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.
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(); } } } }); } }
źródło
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); } }
źródło
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:
utwórz PdfRenderer
PdfRenderer renderer = new PdfRenderer(fd);
przygotuj Bitmapę
pobierz PdfRenderer.Page do wyrenderowania
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 .
źródło
Ta biblioteka jest prosta i działa dobrze: Przeglądarka plików PDF na Androida https://github.com/barteksc/AndroidPdfViewer
Stara odpowiedź ...
źródło
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.pdfW 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.
źródło
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 ); }
źródło