【问题标题】:How to read pdf in my android application? [closed]如何在我的 android 应用程序中阅读 pdf? [关闭]
【发布时间】:2012-05-05 04:53:07
【问题描述】:

我正在制作一个需要打开 pdf 的应用程序。

我在资产文件夹中也有一些 pdf,所以我无法直接在 webview 中打开它。

android默认不支持pdf。

是否有任何适用于 android 的 API(MuPdf 除外)??

我的设备没有安装任何 pdf 阅读器,所以 ACTION VIEW 对我没有帮助

以下不起作用.......

How to render a PDF file in Android

Open asset file pdf in application

你能推荐我什么好的api吗?

【问题讨论】:

标签: android pdf-reader


【解决方案1】:

我只是使用PdfViewer.jar(使用蓝色按钮下载它)并编写了如下代码。

First.java

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    File images = Environment.getExternalStorageDirectory();
    imagelist = images.listFiles(new FilenameFilter()
    {  
            public boolean accept(File dir, String name)  
            {  
                    return ((name.endsWith(".pdf")));
            }  
    }); 
    pdflist = new String[imagelist.length]; 
    for(int i = 0;i<imagelist.length;i++)
    {
            pdflist[i] = imagelist[i].getName();
    }
    this.setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, pdflist));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) 
{
        super.onListItemClick(l, v, position, id);
        String path = imagelist[(int)id].getAbsolutePath();
        openPdfIntent(path);
}

private void openPdfIntent(String path) 
{
    try
    {
      final Intent intent = new Intent(First.this, Second.class);
      intent.putExtra(PdfViewerActivity.EXTRA_PDFFILENAME, path);
      startActivity(intent);
    }
    catch (Exception e) 
    {
      e.printStackTrace();
    }
}

Second.java

public class Second extends PdfViewerActivity 
{

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

public int getPreviousPageImageResource() {
    return R.drawable.left_arrow;
}

public int getNextPageImageResource() {
    return R.drawable.right_arrow;
}

public int getZoomInImageResource() {
    return R.drawable.zoom_in;
}

public int getZoomOutImageResource() {
    return R.drawable.zoom_out;
}

public int getPdfPasswordLayoutResource() {
    return R.layout.pdf_file_password;
}

public int getPdfPageNumberResource() {
    return R.layout.dialog_pagenumber;
}

public int getPdfPasswordEditField() {
    return R.id.etPassword;
}

public int getPdfPasswordOkButton() {
    return R.id.btOK;
}

public int getPdfPasswordExitButton() {
    return R.id.btExit;
}

public int getPdfPageNumberEditField() {
    return R.id.pagenum_edit;
}
}

希望这对您有很大帮助。尝试这个。不要忘记在清单中添加您的Second.java。在second.java 中添加一些需要的drawables 和你的drawables。并且,参考GitHub的例子

【讨论】:

  • 感谢@SpK,我的文件在资产文件夹中,我想从资产中读取它---文件:///android_asset/test.pdf....我试过这个.... ... openPdfIntent("file:///android_asset/test.pdf"); ......logcat.... ST='file 'file:///android_asset/test.pdf' not found'
  • +1 但它也很慢并且显示垃圾字符....
  • 我试过了,但它只是继续加载或什么都不显示。知道怎么了...???
  • 缩小问题请参考此帖stackoverflow.com/questions/11259131/…
  • @MohdMufiz 看,它只是样本。您必须根据您的要求来实施它,并且速度的提升是用您的双手 :)
【解决方案2】:

某些手机(如 Nexus One)预装了 Quickoffice 版本,因此只要将文件保存到 SD 卡,就可以像发送相应的 Intent 一样简单。

public class OpenPdf extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        Button button = (Button) findViewById(R.id.OpenPdfButton); 
        button.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                File file = new File("/sdcard/example.pdf"); 

                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) { 
                        Toast.makeText(OpenPdf.this,  
                            "No Application Available to View PDF",  
                            Toast.LENGTH_SHORT).show(); 
                    } 
                } 
            } 
        }); 
    } 
} 

【讨论】:

  • 这不是超出范围的话题吗?
【解决方案3】:

我从来不需要这样做,但您可以使用像 iText 这样的库以编程方式访问 PDF 文件,然后显示 PDF。

【讨论】:

  • iText 支持安卓吗????
  • 是的,JAVA版本可以包含在android项目中。
  • 但它不是免费的
  • 除非您准备为许可证支付更高的费用,否则不要使用 iText
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2013-07-05
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多