webentwicklung-frage-antwort-db.com.de

So öffnen Sie eine PDF-Datei, die entweder im Ordner res/raw oder in den Assets gespeichert ist

Ich werde in meinem Antrag ein pdf anzeigen, und das pdf muss mit dem Antrag gebündelt sein.

Was ist ein guter Weg, dies zu tun?

Ich habe gelesen, dass dies möglicherweise durch Hinzufügen der pdf-Datei zu einem res/raw-Ordner möglich ist und von dort gelesen werden kann. Ich erhalte jedoch Projektfehler, wenn ich die pdf-Datei dort ablege.

Also habe ich versucht, die PDF-Datei im Asset-Ordner des Projekts abzulegen, und es gab keine Fehler.

So habe ich versucht, das pdf anzuzeigen:

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);

Irgendwelche Ideen oder Vorschläge?

Danke im Voraus

22
Ikky

Sie könnten es von raw/ oder assets/ aus anzeigen, wenn Ihre Anwendung tatsächlich einen PDF -Leser implementiert. Da Sie möchten, dass es in einer separaten Anwendung (z. B. Adobe Reader) angezeigt wird, empfehle ich Folgendes:

  1. Speichern Sie die Datei PDF im Verzeichnis assets/.
  2. Wenn der Benutzer es anzeigen möchte, kopieren Sie es irgendwo public. Schauen Sie in openFileOutput oder getExternalFilesDir .
  3. Starten Sie die Variable Intent so, wie Sie es jetzt tun, außer verwenden Sie getAbsolutePath() in der neu erstellten Datei für die Daten der Absicht.

Beachten Sie, dass ein Benutzer möglicherweise keine PDF -Anwendung hat. In diesem Fall ist es sinnvoll, die ActivityNotFoundException abzufangen und eine entsprechende Meldung anzuzeigen.

23
Felix

Sie können die PDF-Datei direkt aus dem Ordner assets nicht öffnen. Sie müssen die Datei zuerst aus dem Assets-Ordner auf die SD-Karte schreiben und dann von der SD-Karte lesen. Der Code lautet wie folgt: -

     @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);
        }
    }

Das ist alles..Genießen Sie !! und bitte vergessen Sie nicht, + 1.Dank zu geben

29
Deepak Sharma

Ich habe das folgende Format verwendet, um Raw-Ressourcen in meiner eigenen Anwendung zu öffnen. Ich habe nicht getestet, ob eine andere Anwendung Ihre Rohressource öffnen kann.

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

Ich hatte verschiedene Probleme mit den Antworten, also habe ich etwas zusammengestellt, das funktioniert.

LAYOUT

<?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

Ihr PDF-Intent scheint gut zu sein, aber Sie sollten dies versuchen, um die Uri-Datei in den Raw-Ordner zu bekommen: 

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

(Quelle)

0
Snicolas