AndroidでPDFをレンダリングする方法


回答:


115

一部の電話(Nexus Oneなど)にはQuickofficeのバージョンがプリインストールされているため、ファイルをSDカードに保存すると、適切なインテントを送信するのと同じくらい簡単になります。

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

1
うーん、明日これを試してみてください。したがって、バイトストリームから、それらをファイルとして保存してから、そのコードを実行する必要があります。
マイキー2010年

18
うーん、AndroidにQuickOfficeがインストールされていない場合はどうですか?
マイキー

2
そう?QuickOfficeがない場合はどうなりますか?
ネクロネット2011

電話が迅速なOfficeを持っていない場合は?
Tofeeq Ahmad 2011

6
サーバーから直接PDFファイルを開くにはどうすればよいですか?デバイスに保存してから開くのではなく。
EnthuDeveloper 2011

16

WebビューでPDFファイルを開きます。

public class MyPdfViewActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WebView mWebView=new WebView(MyPdfViewActivity.this);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setPluginsEnabled(true);
    mWebView.loadUrl("https://docs.google.com/gview?embedded=true&url="+LinkTo);
    setContentView(mWebView);
  }
}

画像のみを提供するため、これはグーグルビューアリンクでのみ機能すると思います。PDFへのリンクを直接使用すると、機能しません。あれは正しいですか ?
Nathan Do

これはローカルファイルでは機能しないようで、リモートファイルでのみ機能するようです。
Alfie Hanssen 2013年

2
リンクが変更された場合はどうなりますか?
Shuhrat Akramov 2014

3
「2日間継続してテストした後、Googleドキュメントで、Googleドキュメント形式ではないファイルを表示またはダウンロードするための帯域幅の制限に達したというエラーが表示されました。....信頼性が低いようです。」 stackoverflow.com/questions/2655972/...
Wédneyユーリ

9

Android-Lollipop(api 21)が新しいAPIを導入:PdfRenderer

このAPIを使用すると、PDFドキュメントのページからビットマップを作成できます。

まもなく:

  • PDFドキュメントからシーク可能なファイル記述子を取得します。

      ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    
  • PdfRendererを作成します

      PdfRenderer renderer = new PdfRenderer(fd);
    
  • ビットマップを準備する

      Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
    
  • PdfRenderer.Pageを取得してレンダリングします

      PdfRenderer.Page page = renderer.openPage(pageIndex);
    
  • 準備したビットマップにページをレンダリングする

      page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
  • これで、ビットマップを使用してやりたいことができます。

  • 2つのnull引数を使用すると、ページの一部をクリップして、クリップの変換(Matrixを使用)を実行できる場合があることに注意してください。

  • 別のレンダリングモードがあります:RENDER_MODE_FOR_PRINT。このモードが必要な場合は適切に使用するためのガイドラインがいくつかあります。詳細は次のとおりです。


3
電話にファイルを保存せずにこれを達成する方法はありますか?PDFをバイトストリームとして取得しているので、電話に保存せずにユーザーに表示する必要があります。
Gokhan Arik 2015年

制約は、シーク可能なファイル記述子をコンストラクターに渡すことです。ソケットストリームからのfdはシークできません。ストリームからのすべてのバイトをバッファに格納し、そこからシーク可能なfdを取得しようとする場合があります。
ben75 2015年

5

このライブラリはシンプルでうまく機能します: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer

古い返信...

Joan Zapataは、より優れたシンプルなソリューションを提供してくれると思います。

https://github.com/JoanZapata/android-pdfview

私はそれが機能することを保証します!

1https//github.com/JoanZapata/android-pdfview


1
Alecs:のpdfNameには何を使用しましたpdfView.fromAsset(pdfName)か?絶対パスを使用してみましたが、ファイルが見つかりませんでした(確かにそこにあります)。例:/data/data/package.name/files/images/filename.pdf
h-bomb

1
@ h-bomb様、PDFがプロジェクトのアセットフォダーにある場合は、fromassetメソッドを使用する必要があります。デバイスからPDFをロードするには、fromFileメソッドを使用できます 。
アレックス2015

1
本当にありがとう。AndroidのFileProviderを使用して、外部アプリがPDFを開くことを許可することにしました。驚いたことに、FileProvider開発ドキュメントのドキュメントとサンプルコードは素晴らしかったです。
h-bomb

3

ローカルPDFファイルの場合、サードパーティのライブラリを介してレンダリングできます。たとえば、MuPDFライブラリを使用します。サポートされているファイルタイプには、PDF、PNG、JPEGが含まれます。

MuPDFの欠点の1つは、ネイティブライブラリを使用してターゲットを達成するため、後でアプリケーションをBlackBerryプラットフォームに移植するのが簡単ではないことです。


0

バイト配列からPDFを開くには、を使用RadaeePDFできます。アクティビティに対して次の操作を実行できます。

private PDFReader m_vPDF = null;
private Document doc = new Document();

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Global.Init(this);

    m_vPDF = new PDFReader(this);
    doc.Close();

    int ret = m_doc.OpenMem(data, password);
        switch( ret )
        {
            case -1://need input password
                finish();
                break;
            case -2://unknown encryption
                finish();
                break;
            case -3://damaged or invalid format
                finish();
                break;
            case -10://access denied or invalid file path
                finish();
                break;
            case 0://succeeded, and continue
                break;
            default://unknown error
                finish();
                break;
        }

    m_vPDF.open(doc);

    setContentView( m_vPDF );
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.