web-dev-qa-db-ja.com

res / rawまたはassetフォルダーに保存されているPDFを開く方法は?

アプリケーションにpdfを表示します。pdfをアプリケーションにバンドルする必要があります。

これを行う良い方法は何ですか?

私は、pdfファイルをres/rawフォルダーに追加してそこから読み取ることでこれを行うことができるかもしれないと読んでいますが、pdfファイルをそこに置くとプロジェクトエラーが発生します。

だから私はプロジェクトのアセットフォルダーにpdfファイルを入れようとしましたが、エラーはありませんでした。

これは私が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);

アイデアや提案はありますか?

前もって感謝します

23
Ikky

アプリケーションで実際にPDFリーダーを実装している場合は、_raw/_または_assets/_から表示できます。別のアプリケーション(たとえばAdobe Readerとして)、次のことをお勧めします:

  1. PDFファイルを_assets/_ディレクトリに保存します。
  2. ユーザーが表示したい場合は、どこかにコピーしますpublicopenFileOutput または getExternalFilesDir を調べます。
  3. インテントのデータ用に新しく作成されたファイルで getAbsolutePath() を使用することを除いて、今と同じようにIntentを起動します。

ユーザーがPDF読み取りアプリケーションを持たない可能性があることに注意してください。この場合、 ActivityNotFoundException をキャッチして適切なメッセージを表示すると便利です。 。

23
Felix

Pdfファイルを開くことはできません直接assetsフォルダーから。最初にファイルをassetフォルダーからsdカードに書き込み、次に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);
        }
    }

お楽しみください!!そして、+ 1を与えることを忘れないでください。ありがとう

30
Deepak Sharma

次の形式を使用して、独自のアプリケーション内から生のリソースを開きました。別のアプリケーションが生のリソースを開くことができるかどうかはテストしていません。

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

Pdfの意図は良いようですが、これを試してrawフォルダーのファイルのUriを取得する必要があります。

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

(ソース)

1
Snicolas

答えにはさまざまな問題があったので、機能するものをまとめました。

[〜#〜] 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