Jak renderować PDF w systemie Android

81

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?

Mikey
źródło
Odpowiedź na to pytanie znajduje się tutaj: stackoverflow.com/a/16294833/2027232
Nicolas Tyler

Odpowiedzi:

115

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();
                    }
                }
            }
        });
    }
}
Tim Kryger
źródło
1
hmm, spróbuję jutro. więc ze strumieni bajtów otrzymam, muszę zapisać je jako plik, a następnie spróbować zrobić ten kod.
Mikey
18
hmm, a co jeśli nie mam zainstalowanego QuickOffice na moim Androidzie?
Mikey
2
więc? co jeśli nie masz QuickOffice?
Necronet
Jeśli telefon nie ma szybkiego pakietu Office?
Tofeeq Ahmad
6
Jak otworzyć plik PDF bezpośrednio z serwera? Zamiast zapisywać go na urządzeniu, a następnie otwierać.
EnthuDeveloper
16

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);
  }
}
Shankar Agarwal
źródło
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:

      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 .

ben75
źródło
3
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.
ben75
5

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!

1 : https://github.com/JoanZapata/android-pdfview

Alecs
źródło
1
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.

Zefir
źródło
0

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 );
}
Nermeen
źródło