实现PDF阅读器的代码示例

10

我想在我正在做的应用程序中实现一个PDF阅读器,我找到了几个API,但它们都不是开源的。

你们有没有知道一个好的免费替代品?


由OP稍微改编Dipak Keshariya的解决方案

第一类

package android.pdf.reader;

import java.io.File;
import java.io.FilenameFilter;

import net.sf.andpdf.pdfviewer.PdfViewerActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

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

        File images = Environment.getExternalStorageDirectory();
        File[] imagelist = images.listFiles(new FilenameFilter()
        {  
                public boolean accept(File dir, String name)  
                {  
                        return ((name.endsWith(".pdf")));
                }  
        }); 
        String[] 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));
    }

    protected void onListItemClick(ListView l, View v, int position, long id) 
    {
            super.onListItemClick(l, v, position, id);
            Object[] imagelist;
            String path = ((File) 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();
        }
    }

}

第二类

package android.pdf.reader;

import net.sf.andpdf.pdfviewer.PdfViewerActivity;
import android.os.Bundle;

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

1
你知道 PDFViewer 库用于读取 PDF 文件吗? - Dipak Keshariya
我不知道你所说的任何东西。 - user1369422
2
嗨,我想问一下在哪里可以找到PdfViewerActivity? - Kairi San
3个回答

26

使用以下代码即可实现。

First.java

public class First extends ListActivity {

    String[] pdflist;
    File[] imagelist;
    @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));
    }

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

将这两个活动添加到你的清单文件中声明。


4
这个库对我来说非常慢 - 你有这个问题吗? 我甚至无法打开一个PDF文件 - 它显示PDF加载很长时间。 - Vrashabh Irde
1
@DipakKeshariya,为了显示PDF文件,我们的PDF文件应该在SD卡中吗?还是可以从资产文件夹中显示?.. 在我的情况下,logcat向我显示: 03-06 11:02:10.695: I/PDFVIEWER(5712): ST='file 'file:///android_asset/publicatios/rapportActivite.pdf' not found' - Swap-IOS-Android
1
@DipakKeshariya,它在红线中显示RestoreInstance..我认为问题出在那里。 - Swap-IOS-Android
1
@Swap-IOS-Android 如果您正在使用模拟器测试此代码并从sdcard读取文件,则只需将pdf文件推送到文件浏览器中的mnt/sdcard文件夹中,然后再次运行应用程序,它将开始工作。 - Sarvan
这个程序运行良好,但它没有提供捏合缩放功能。我们能为这个例子(PDF阅读器)实现捏合缩放功能吗? - asliyanage
显示剩余22条评论

3

这篇SO上的帖子非常好,尤其是要看一下由Commons.Ware提供的答案,它可以回答你的问题。

根据您的评论,我在这里添加了来自上述SO帖子的链接(用于找不到的项目来源):

因此,将“checkout”或克隆存储库到本地文件系统以浏览代码。如我在评论中提到的,请在进一步操作之前检查每个库的许可证,以查看您可以和不能做什么。


谢谢您的回复,但这些链接似乎只能下载apk文件。我需要源代码。 - user1369422
阅读该帖子,我可以看到至少有2个(如果不是3个)链接指向托管在Google Code上并且源代码可用的项目。 - Orlymee
这些是我找到的所有链接,但是我没有在这些网站上看到任何可供下载的代码。 http://www.dataviz.com/products/documentstogo/android/ http://www.cerience.com/products/reader/android http://andpdf.sourceforge.net/ http://code.google.com/p/apv/ - user1369422
尝试在托管在Google Code上的源选项卡中查看。您可以将存储库克隆到您的计算机上。检查许可证以了解库的使用限制。因此,对于托管在Google Code上的apv,您需要使用Mercurial。对于托管在SourceForge上的AndPdf,它使用SVN。再次尝试阅读项目页面。 - Orlymee
Commons.Ware没有回答,请提供一个指向答案的链接。 - bluish
有没有办法将它集成到我们的项目中,而不使用任何第三方项目? - Nitesh Verma

3

这个方案对我有用。

1) 将PdfViewer.jar添加到项目的构建路径中

2) 从PdfViewer/res/drawable中复制以下可绘制资源并将其复制到YourProject/res/drawable中:left_arrow.png,right_arrow.png,zoom_in.png和zoom_out.png

3) 从PdfViewer/res/layout中复制以下布局资源并将其复制到YourProject/res/layout中:dialog_pagenumber.xml和pdf_file_password.xml

4) 从net.sf.andpdf.pdfviewer.PdfViewerActivity派生您的PDF活动

5) 使用默认的可绘制项和布局:

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; }
enter code here

6) 使用以下代码调用您派生的PdfViewActivity:

Intent intent = new Intent(this, YourPdfViewerActivity.class);

intent.putExtra(PdfViewerActivity.EXTRA_PDFFILENAME, "PATH TO PDF GOES HERE");

startActivity(intent);

你可以通过这个链接下载源代码。 链接

希望能对你有所帮助 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接