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?
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.
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();
}
}
}
});
}
}
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:
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 .
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.
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.
Antworten:
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(); } } } }); } }
quelle
Ö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); } }
quelle
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:
Erstellen Sie den PdfRenderer
PdfRenderer renderer = new PdfRenderer(fd);
Bereiten Sie die Bitmap vor
Holen Sie sich die PdfRenderer.Page zum Rendern
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 .
quelle
Diese Bibliothek ist einfach und funktioniert gut: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer
Alte Antwort ...
quelle
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.pdfDie 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.
quelle
Um ein PDF aus einem Byte-Array zu öffnen, können
RadaeePDF
Sie 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 ); }
quelle