简体   繁体   English

如何打开存储在res / raw或assets文件夹中的pdf?

[英]How to open a pdf stored either in res/raw or assets folder?

I'm going to show a pdf in my application, and the pdf has to be bundled with the application. 我将在我的应用程序中显示pdf,并且pdf必须与应用程序捆绑在一起。

What is a good way to do this? 有什么好办法呢?

I have read that it might be possible to do this by adding the pdf file to a res/raw folder and read it from there, but i get project errors when i put the pdf file there. 我已经读过可以通过将pdf文件添加到res / raw文件夹并从那里读取它来实现这一点,但是当我将pdf文件放在那里时我得到了项目错误。

So i tried to put the pdf file in the asset folder of the project, and it gave no errors. 所以我试着把pdf文件放在项目的资产文件夹中,它没有给出任何错误。

This is how i've tried to show the 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);

Any ideas or suggestions? 任何想法或建议?

Thanks in advance 提前致谢

You cannot open the pdf file directly from the assets folder.You first have to write the file to sd card from assets folder and then read it from sd card.The code is as follows:- 您无法直接assets文件夹打开pdf文件。您首先必须将文件从assets文件夹写入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);
        }
    }

Thats all..Enjoy!! 多数民众赞成......享受! and please dont forget to give +1.Thanks 请不要忘记给予1.谢谢

You would be able to show it from raw/ or assets/ if your application actually implemented a PDF reader. 如果您的应用程序实际实现了PDF阅读器,您将能够从raw/assets/显示它。 Since you want it to be displayed in a separate application (such as Adobe Reader), I suggest doing the following: 由于您希望它显示在单独的应用程序(例如Adobe Reader)中,我建议您执行以下操作:

  1. Store the PDF file in the assets/ directory. 将PDF文件存储在assets/目录中。
  2. When the user wants to view it, copy it somewhere public . 当用户想要查看它时,将其复制到公共场所 Look into openFileOutput or getExternalFilesDir . 查看openFileOutputgetExternalFilesDir
  3. Launch the Intent just like you are doing now, except use getAbsolutePath() on the newly created file for the intent's data. 就像你现在一样启动Intent ,除了在新创建的文件中使用getAbsolutePath()作为intent的数据。

Be aware that a user might not have a PDF reading application. 请注意,用户可能没有PDF阅读应用程序。 In this case, it is useful to catch the ActivityNotFoundException and show an appropriate message. 在这种情况下,捕获ActivityNotFoundException并显示适当的消息很有用。

I've used the following format to open raw resources from within my own application. 我使用以下格式从我自己的应用程序中打开原始资源。 I haven't tested whether another application can open your raw resource. 我还没有测试另一个应用程序是否可以打开您的原始资源。

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

You pdf intent seems good but you should try this to get the Uri of file in the raw folder : 你的pdf意图似乎不错,但你应该尝试这个来获取原始文件夹中的文件的Uri:

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

(Source) (资源)

I had various problems with the answers, so I pulled together something that works. 我的答案有各种各样的问题,所以我把一些有效的东西放在一起。

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

my apps needs to open a pdf file content in the raw data on external app ... im write: 我的应用程序需要在外部应用程序的原始数据中打开pdf文件内容...我写道:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button = (Button) findViewById(R.id.OpenPdfButton);
    button.setOnClickListener(new View.OnClickListener() {
        InputStream is = getResources().openRawResource(R.raw.filepdf);

        @Override
        public void onClick(View v) {
           startpdf();
         }
           private void startpdf() {
            // TODO Auto-generated method stub

            File file = new File("R.id.filepdf");

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

                }
            }
        }


    });
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM