web-dev-qa-db-fra.com

Comment ouvrir un fichier pdf stocké dans le dossier res/raw ou assets?

Je vais montrer un pdf dans mon application, et le pdf doit être joint à l'application.

Quel est un bon moyen de faire cela?

J'ai lu qu'il serait peut-être possible de le faire en ajoutant le fichier pdf à un dossier res/raw et en le lisant à partir de là, mais j'obtiens des erreurs de projet lorsque j'y mets le fichier pdf.

J'ai donc essayé de mettre le fichier pdf dans le dossier des ressources du projet, et il n'a généré aucune erreur.

Voici comment j'ai essayé de montrer le pdf:

File pdfFile = new File("res/raw/file.pdf");
Uri path = Uri.fromFile(pdfFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Des idées ou des suggestions?

Merci d'avance

22
Ikky

Vous pourrez l'afficher à partir de raw/ ou assets/ si votre application implémentait réellement un lecteur PDF. Puisque vous voulez qu'il soit affiché dans une application séparée (telle que Adobe Reader), je vous suggère de procéder comme suit:

  1. Stockez le fichier PDF dans le répertoire assets/.
  2. Lorsque l'utilisateur souhaite le voir, copiez-le quelque part public. Regardez dans openFileOutput ou getExternalFilesDir .
  3. Lancez la Intent comme vous le faites maintenant, sauf utilisez getAbsolutePath() sur le fichier nouvellement créé pour les données de l'intention.

Sachez qu'un utilisateur peut ne pas avoir d'application de lecture PDF. Dans ce cas, il est utile d’attraper le ActivityNotFoundException et d’afficher un message approprié.

23
Felix

Vous ne pouvez pas ouvrir le fichier pdf directement à partir du dossier assets . Vous devez d'abord écrire le fichier sur la carte SD à partir du dossier assets, puis le lire à partir de la carte sd.

     @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    File fileBrochure = new File(Environment.getExternalStorageDirectory() + "/" + "abc.pdf");
    if (!fileBrochure.exists())
    {
         CopyAssetsbrochure();
    } 

    /** PDF reader code */
    File file = new File(Environment.getExternalStorageDirectory() + "/" + "abc.pdf");      

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(file),"application/pdf");
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    try 
    {
        getApplicationContext().startActivity(intent);
    } 
    catch (ActivityNotFoundException e) 
    {
         Toast.makeText(SecondActivity.this, "NO Pdf Viewer", Toast.LENGTH_SHORT).show();
    }
}

//method to write the PDFs file to sd card
    private void CopyAssetsbrochure() {
        AssetManager assetManager = getAssets();
        String[] files = null;
        try 
        {
            files = assetManager.list("");
        } 
        catch (IOException e)
        {
            Log.e("tag", e.getMessage());
        }
        for(int i=0; i<files.length; i++)
        {
            String fStr = files[i];
            if(fStr.equalsIgnoreCase("abc.pdf"))
            {
                InputStream in = null;
                OutputStream out = null;
                try 
                {
                  in = assetManager.open(files[i]);
                  out = new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + files[i]);
                  copyFile(in, out);
                  in.close();
                  in = null;
                  out.flush();
                  out.close();
                  out = null;
                  break;
                } 
                catch(Exception e)
                {
                    Log.e("tag", e.getMessage());
                } 
            }
        }
    }

 private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1){
          out.write(buffer, 0, read);
        }
    }

C'est tout..Profitez !! et s'il vous plaît ne pas oublier de donner + 1.Merci

29
Deepak Sharma

J'ai utilisé le format suivant pour ouvrir des ressources brutes à partir de ma propre application. Je n'ai pas testé si une autre application pouvait ouvrir votre ressource brute.

Uri path = Uri.parse("Android.resource://" + getPackageName() + "/" + R.raw.myPdfName);
1
David Snabel-Caunt

J'ai eu divers problèmes avec les réponses, alors j'ai rassemblé quelque chose qui fonctionne.

DISPOSITION

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    >


    <ImageView
        Android:id="@+id/image_pdf"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_above="@+id/btn_okay"
        Android:layout_margin="5dp"/>

    <Button
        Android:id="@+id/btn_okay"
        Android:layout_width="80dp"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:layout_alignParentRight="true"
        Android:layout_margin="10dp"
        Android:text="@string/ok"/>

</RelativeLayout>

CODE

/**
 * Render a page of a PDF into ImageView
 * @param targetView
 * @throws IOException
 */
private void openPDF(ImageView targetView) throws IOException {

    //open file in assets

    ParcelFileDescriptor fileDescriptor;

    String FILENAME = "your.pdf";

    // Create file object to read and write on
    File file = new File(getActivity().getCacheDir(), FILENAME);
    if (!file.exists()) {
        AssetManager assetManager = getActivity().getAssets();
        FileUtils.copyAsset(assetManager, FILENAME, file.getAbsolutePath());
    }

    fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);

    PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor);

    //Display page 0
    PdfRenderer.Page rendererPage = pdfRenderer.openPage(0);
    int rendererPageWidth = rendererPage.getWidth();
    int rendererPageHeight = rendererPage.getHeight();
    Bitmap bitmap = Bitmap.createBitmap(
            rendererPageWidth,
            rendererPageHeight,
            Bitmap.Config.ARGB_8888);
    rendererPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);

    targetView.setImageBitmap(bitmap);
    rendererPage.close();
    pdfRenderer.close();
}


public static boolean copyAsset(AssetManager assetManager, String fromAssetPath, String toPath) {
    InputStream in = null;
    OutputStream out = null;
    try {
        in = assetManager.open(fromAssetPath);
        new File(toPath).createNewFile();
        out = new FileOutputStream(toPath);
        copyFile(in, out);
        in.close();
        in = null;
        out.flush();
        out.close();
        out = null;
        return true;
    } catch(Exception e) {
        e.printStackTrace();
        return false;
    }
}

public static void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
        out.write(buffer, 0, read);
    }
}
0
Someone Somewhere

Votre intention de pdf semble bonne mais vous devriez essayer ceci pour obtenir le URI du fichier dans le dossier raw 

Uri path = Uri.parse("Android.resource://<you package>/raw/<you file.pdf>");

(La source)

0
Snicolas