34 votes

Limites de l'ouverture d'un fichier pdf dans Android

J'essaie d'ouvrir un fichier PDF à partir de mon application Android. J'utilise un Intent pour ce faire :

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);

Ce code fonctionne bien pour certains pdf mais il échoue lorsque j'essaie d'en ouvrir d'autres.

C'est le message qu'Android me montre :

Il y a un problème avec le fichier.

Je dois préciser que les pdf qui s'ouvrent sans problème sont créés avec un modèle Crystal Report et que les pdf qui échouent sont créés avec un autre modèle.

Par contre, si j'ouvre l'url des pdf qui ne fonctionnent pas sur mon navigateur (sur mon ordinateur), il ne me donne aucune erreur d'ouverture. Je suppose donc qu'il y a peut-être une limitation sur Android qui diffère d'un pdf à l'autre (sur le modèle Crystal Report) mais je ne la vois pas.

Quelles sont les limites à l'ouverture d'un fichier pdf sous Android (taille, certains paramètres de Crystal Report non autorisés, etc...) ?

J'ai écarté l'idée qu'il puisse s'agir d'une limitation de taille, car les fichiers PDF qui posent problème sont plus petits que les fichiers qui ne présentent aucune erreur.

Cela prouve que je l'ai fait :

  • Ouverture de mauvais PDFs sur le navigateur ~~> OK
  • Télécharger un mauvais PDF sur un téléphone portable et l'ouvrir ~~> OK
  • Ouverture de mauvais PDFs sur APP ~~> Erreur
  • Ouverture d'un bon PDF sur l'APP de l'entreprise qui fait tomber les PDF ~~> OK

EDITAR

J'ai remarqué que j'utilisais http:// mais le PDF est sur un https:// j'ai donc modifié le protocole sur Uri.parse méthode.

Lorsque j'ai effectué cette modification, l'application s'est arrêtée et une erreur s'est affichée dans le journal :

Android.content.ActivityNotFoundException : Aucune activité trouvée pour gérer l'intention

De plus, j'ai remarqué que les PDF qui ne me donnent aucune erreur, sont dans une url avec http:// au lieu de https:// donc je suppose que https:// Le protocole peut être le problème.

Est-ce que je peux seulement ouvrir http:// demande sur un Intent ?

0 votes

@matrix J'ai essayé d'utiliser Android 6.0.1 et Android 7.0 et j'obtiens le même comportement. Certains pdfs s'ouvrent sans problème et d'autres échouent quand j'essaie de les ouvrir donc je pense que ce n'est pas un problème avec la version, pas comme avec les fichiers pdf.

0 votes

Veuillez partager des exemples de PDF qui illustrent le problème.

0 votes

@mkl Je ne peux pas les partager car ce sont des factures de mes clients donc je ne peux pas donner leurs informations.

12voto

Jack Cheung Points 36

Il se peut que le fichier n'ait pas été interprété par l'application Android PDF Viewer. Avez-vous essayé de copier/télécharger le même fichier sur votre téléphone Android et de l'ouvrir à partir de là ?

De plus, je suggère d'utiliser IntentChooser pour lancer la visionneuse de PDF, juste pour être sûr qu'aucune visionneuse de PDF n'est installée ou pour donner à l'utilisateur la possibilité de choisir une application :

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
Intent chooserIntent = Intent.createChooser(intent, "Open Report");
startActivity(chooserIntent);

0 votes

Merci pour la réponse mais cela ne me permet pas de l'ouvrir. Si je le télécharge et que j'essaie de l'ouvrir, il s'ouvre sans problème mais il ne me permet pas de choisir entre les programmes lorsque je lance l'Intent.

1 votes

Intent pdfOpenintent = new Intent(Intent.ACTION_VIEW) ; pdfOpenintent.setDataAndType(path or url , "application/pdf") ; Intent intent = Intent.createChooser(pdfOpenintent, "Open File") ; startActivity(intent) ;

10voto

Francisco Romero Points 6689

J'ai trouvé une solution de contournement pour afficher mon PDF sur mon application Android (mais ne me permet pas de le télécharger après l'affichage sur l'application). Si j'ouvre mon PDF en utilisant Google Docs, je peux l'ouvrir avec mon Intent.

C'est ce que j'ai dû ajouter avant mon url :

https://docs.google.com/gview?embedded=true&url=

donc l'url final sera comme :

https://docs.google.com/gview?embedded=true&url=https://myUrl.pdf

Voici l'ensemble du code que j'utilise en ce moment :

String url= "https://docs.google.com/gview?embedded=true&url=https://url.pdf";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);

Mais ce n'est toujours pas suffisant parce que je voudrais l'ouvrir sans avoir besoin d'utiliser une application tierce. De plus, l'ouverture des PDF avec Google Docs est lente et je dois attendre trop longtemps avant que le PDF ne s'ouvre enfin.

Si quelqu'un sait comment l'ouvrir avec Android natif, faites-le moi savoir.


Que se passe-t-il si je ne l'ouvre pas avec Google Docs ?

Avec le même code, mais en utilisant simplement mon url, au lieu de l'url de Google Docs ajouté, Android m'a permis de choisir entre deux applications : Adobe Acrobat Reader et Google Chrome.

  • Si je l'ouvre avec Google Chrome, il télécharge le PDF mais ne l'ouvre pas automatiquement.

  • Si je l'ouvre avec Adobe Acrobat Reader, il me donne l'erreur suivante :

    Le PDF ne peut pas être affiché (il ne peut pas être ouvert)

0 votes

Est-ce que vous voulez visualiser le pdf page par page, ou éventuellement en extraire des données ?

0 votes

@TonyKutzler Je voudrais voir l'ensemble du PDF. Ce serait bien si l'utilisateur peut aussi le télécharger, mais après avoir vu le PDF à l'écran.

0 votes

Android a un support très limité pour le rendu des PDF. Cependant, si vous êtes sur minSdk >= 21(Android 5), vous pouvez constater que PdfRenderer classe utile : medium.com/@chahat.jain0/

4voto

Tony Kutzler Points 345

Si l'API >=21, vous pouvez utiliser PDFRenderer pour créer un bitmap de chaque page, mais il est seulement visible, pas modifiable. Voici un exemple que j'ai créé à la volée, sans boutons de navigation, mais ceux-ci ne devraient pas être trop difficiles à mettre en œuvre.

PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(new File("/path/to/file.pdf"), 
            ParcelFileDescriptor.MODE_READ_ONLY));
    PdfRenderer.Page page = renderer.openPage(0);
    Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(),
            Bitmap.Config.ARGB_8888);
    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    imageView.setImageBitmap(bitmap);
    page.close();
    renderer.close();

Modifier

PdfRenderer requiert un fichier local pour le FileDescriptor. Ainsi, à ma connaissance, la visualisation à travers le "nuage" n'est pas possible avec cette approche.

0 votes

Et si je n'ai pas le chemin du fichier, je veux dire, que le chemin du fichier est une url, puis-je l'utiliser aussi ?

0 votes

@Error404 Réponse éditée

4voto

Nikhil Jadhav Points 1247

Bibliothèque d'ajouts simples pour Android :

//in app level build
compile 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'

//inside your xml file
<com.joanzapata.pdfview.PDFView
    android:id="@+id/pdfview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

//inside java code
 pdfView.fromAsset(pdfName)
.pages(0, 2, 1, 3, 3, 3)
.defaultPage(1)
.showMinimap(false)
.enableSwipe(true)
.onDraw(onDrawListener)
.onLoad(onLoadCompleteListener)
.onPageChange(onPageChangeListener)
.load();

Pour plus d'informations, utilisez ce lien GitHub : https://github.com/JoanZapata/Android-pdfview

0 votes

Cela ne me conviendrait pas, car je dois charger mon PDF à partir d'une URL. Le projet que vous avez joint n'est plus maintenu, donc ce ne sera pas une bonne solution s'il n'a pas de maintenance. En outre, l'alternative qu'ils recommandent comporte une section Why I cannot open PDF from URL? .

0 votes

Oui, le lien ci-dessus / bibliothèque n'a pas de maintenance mais c'est une bonne bibliothèque pour montrer le pdf dans l'application, d'autres vous pouvez utiliser la bibliothèque ITEXT pdf qui est payante, alternativement vous pouvez juste télécharger le pdf et le montrer à l'intérieur de votre application avec ceci, si vous voulez aller avec l'url alors GOOGLE DRIVE est l'un des meilleurs.

3voto

YoLo Points 816

Vous pouvez utiliser Webview pour ouvrir un PDF à partir d'une url comme ceci :

webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url);

0 votes

@Error404 selon vos besoins, cela fonctionnera aussi très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X