So rendern Sie PDF in Android

81

In meiner Anwendung erhalte ich einen Bytestream und konvertiere ihn in eine PDF-Datei im Telefonspeicher. Wie rendere ich das in ein PDF? Und es auf einer Aktivität zeigen?

Mikey
quelle
Dies wurde hier beantwortet: stackoverflow.com/a/16294833/2027232
Nicolas Tyler

Antworten:

115

Auf einigen Telefonen (wie dem Nexus One) ist eine Version von Quickoffice vorinstalliert, sodass es möglicherweise so einfach ist, die entsprechende Absicht zu senden, sobald Sie die Datei auf der SD-Karte gespeichert haben.

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
quelle
1
hmm ich versuche das morgen. Von Byte-Streams bekomme ich also, dass ich sie als Datei speichern und dann versuchen muss, diesen Code zu machen.
Mikey
18
hmm wie wäre es, wenn ich QuickOffice nicht auf meinem Android installiert habe?
Mikey
2
damit? Was ist, wenn Sie kein QuickOffice haben?
Necronet
Wenn Telefon nicht schnell Office hat dann?
Tofeeq Ahmad
6
Wie öffne ich die PDF-Datei direkt vom Server? Anstatt es auf dem Gerät zu speichern und dann zu öffnen.
EnthuDeveloper
16

Öffnen Sie die PDF-Datei in der Webansicht .

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
quelle
Ich denke, dies funktioniert nur mit dem Google Viewer-Link, weil es nur Bilder dient. Wenn wir den Link zum PDF direkt verwenden, funktioniert dies nicht. Ist das korrekt ?
Nathan Do
Dies scheint nicht für lokale Dateien zu funktionieren, sondern nur für entfernte.
Alfie Hanssen
2
Was ist, wenn sich der Link ändert?
Shuhrat Akramov
3
"Nachdem ich es 2 Tage lang dauerhaft getestet habe, wurde in Google Text & Tabellen ein Fehler angezeigt, der besagt, dass Sie das Bandbreitenlimit für das Anzeigen oder Herunterladen von Dateien erreicht haben, die nicht im Google Text & Tabellen-Format vorliegen. Dies scheint also nicht zuverlässig zu sein." stackoverflow.com/questions/2655972/…
Wédney Yuri
9

Android-Lollipop (API 21) stellt eine neue API vor: PdfRenderer

Mit dieser API können Sie eine Bitmap aus einer Seite in einem PDF-Dokument erstellen.

In Kürze :

  • Holen Sie sich einen durchsuchbaren Dateideskriptor aus Ihrem PDF-Dokument:

      ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    
  • Erstellen Sie den PdfRenderer

      PdfRenderer renderer = new PdfRenderer(fd);
    
  • Bereiten Sie die Bitmap vor

      Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
    
  • Holen Sie sich die PdfRenderer.Page zum Rendern

      PdfRenderer.Page page = renderer.openPage(pageIndex);
    
  • Rendern Sie die Seite auf der vorbereiteten Bitmap

      page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
  • Jetzt können Sie mit der Bitmap machen, was Sie wollen.

  • Beachten Sie, dass Sie mit den 2 Nullargumenten möglicherweise einen Teil der Seite ausschneiden und eine Transformation (mithilfe einer Matrix ) des Clips durchführen können

  • Es gibt einen anderen Rendering-Modus: RENDER_MODE_FOR_PRINT . Wenn Sie diesen Modus benötigen, gibt es einige Richtlinien, um ihn richtig zu verwenden: Hier sind die Details .

ben75
quelle
3
Gibt es eine Möglichkeit, dies zu erreichen, ohne die Datei auf dem Telefon zu speichern? Ich erhalte PDF als Bytestream und muss es dem Benutzer anzeigen, ohne es auf dem Telefon zu speichern.
Gokhan Arik
Die Einschränkung besteht darin, einen durchsuchbaren Dateideskriptor an den Konstruktor zu übergeben. und fd von einem Socket-Stream ist nicht suchbar. Sie können versuchen, alle Bytes aus dem Stream in einem Puffer zu speichern und daraus einen durchsuchbaren fd zu erhalten.
Ben75
5

Diese Bibliothek ist einfach und funktioniert gut: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer

Alte Antwort ...

Ich denke, Joan Zapata gibt uns die bessere und einfachere Lösung:

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

Ich versichere Ihnen, dass es funktioniert!

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

Alecs
quelle
1
Alecs: Was hast du für den pdfName in verwendet pdfView.fromAsset(pdfName)? Ich habe versucht, den absoluten Pfad zu verwenden, aber die Datei wurde nicht gefunden (und ich bin sicher, dass sie vorhanden ist). Beispiel: /data/data/package.name/files/images/filename.pdf
h-bomb
1
Sehr geehrte @ h-Bombe, Sie müssen die fromasset- Methode verwenden, wenn sich Ihr PDF im Asset Foder Ihres Projekts befindet. Um das PDF vom Gerät zu laden, können Sie die fromFile- Methode verwenden.
Alecs
1
Vielen Dank. Ich habe mich für den FileProvider von Android entschieden und einer externen App erlaubt, das PDF zu öffnen. Überraschenderweise waren die Dokumentation und der Beispielcode im FileProvider-Entwicklungsdokument ausgezeichnet.
H-Bombe
3

Die lokalen PDF-Dateien können über die Bibliotheken von Drittanbietern gerendert werden. Verwenden Sie beispielsweise die MuPDF-Bibliothek . Zu den unterstützten Dateitypen gehören PDF, PNG und JPEG.

Ein Nachteil von MuPDF ist, dass es eine native Bibliothek verwendet, um das Ziel zu erreichen, sodass es später nicht einfach ist, die Anwendung auf die BlackBerry-Plattform zu portieren.

Zephyr
quelle
0

Um ein PDF aus einem Byte-Array zu öffnen, können RadaeePDFSie Folgendes für Ihre Aktivität tun:

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
quelle