UniAppアプリでPDFをプレビューする方法(バックエンドからURLを取得)

UniAppでAndroid端末向けにPDFファイルを表示する主な方法は以下の通りです(簡単から複雑まで):

方法1:システムデフォルトアプリで開く(シンプルなケース向け)

PDFファイルをダウンロードした後、システムのデフォルトアプリ(WPS、Adobe Readerなど)で開きます。

// ダウンロードしてPDFを開く例
uni.downloadFile({
  url: 'https://example.com/document.pdf', // オンラインPDFのURL
  success: (downloadRes) => {
    if (downloadRes.statusCode === 200) {
      uni.openDocument({
        filePath: downloadRes.tempFilePath, // 一時ファイルパス
        fileType: 'pdf',
        success: () => console.log('開くことができました'),
        fail: (err) => console.error('開けませんでした', err)
      });
    }
  },
  fail: (err) => console.error('ダウンロードに失敗', err)
});

長所:ネイティブサポートあり、追加プラグイン不要 短所:他のアプリに遷移する必要がある

方法2:WebViewでオンラインプレビュー(インターネット接続必須)

web-viewコンポーネントを使ってオンラインPDFを表示します(インターネット接続が必要):

<template>
  <web-view :src="previewUrl"></web-view>
</template>

<script>
export default {
  data() {
    return {
      // Googleドキュメントプレビュー(VPNが必要)または国内サービスを使用
      previewUrl: 'https://docs.google.com/gview?embedded=true&url=https://example.com/document.pdf'
      
      // 国内サービスの例(各自で置き換えてください)
      // previewUrl: 'https://view.xdocin.com/view?src=' + encodeURIComponent('https://example.com/document.pdf')
    }
  }
}
</script>

注意:GoogleサービスはVPNが必要で、国内ではxdocinなどのオンラインプレビューサービスに置き換えることができます。

方法3:ネイティブPDFプラグインを統合(機能が豊富)

UniAppネイティブプラグインを使ってアプリ内でのプレビューを実現します:

手順:

  1. プラグインのインストール プラグインマーケットで「PDFプレビュー」プラグインを検索(例):
  • Android向け:zhangwei-uvue-pdf-viewer(UVUE対応)
  • 一般的なバージョン:pdf-viewer
  1. プラグインの導入 プラグインのドキュメントに従ってネイティブモジュールを設定(一部はオフラインパッケージングが必要)。
  2. コード例
<template>
  <!-- プラグインのドキュメントに従ってコンポーネントを使用 -->
  <pdf-viewer :src="localFilePath"></pdf-viewer>
</template>

<script>
export default {
  data() {
    return {
      localFilePath: '' // ローカルファイルパス
    }
  },
  mounted() {
    // ファイルをローカルにダウンロード
    uni.downloadFile({
      url: 'https://example.com/document.pdf',
      success: (downloadRes) => this.localFilePath = downloadRes.tempFilePath
    });
  }
}
</script>

方法4:PDF.jsでカスタムレンダリング(純粋なフロントエンド)

pdf.jsを使ってH5や一部のAndroid端末で純粋なフロントエンドレンダリングを実現します:

<template>
  <view>
    <canvas v-for="pageIndex in pageCount" :id="'canvas-'+pageIndex" :key="pageIndex"></canvas>
  </view>
</template>

<script>
import * as pdfjsLib from 'pdfjs-dist/build/pdf';
import 'pdfjs-dist/build/pdf.worker.entry';

export default {
  data() {
    return {
      pdfDocument: null,
      pageCount: 0
    }
  },
  async mounted() {
    const loadingTask = pdfjsLib.getDocument('https://example.com/document.pdf');
    this.pdfDocument = await loadingTask.promise;
    this.pageCount = this.pdfDocument.numPages;
    
    // 各ページをレンダリング
    for (let pageIndex = 1; pageIndex <= this.pageCount; pageIndex++) {
      const page = await this.pdfDocument.getPage(pageIndex);
      const canvas = document.getElementById(`canvas-${pageIndex}`);
      const viewport = page.getViewport({ scale: 1.5 });
      canvas.height = viewport.height;
      canvas.width = viewport.width;
      
      page.render({
        canvasContext: canvas.getContext('2d'),
        viewport
      });
    }
  }
}
</script>

注意

  • pdfjs-distの依存関係を追加:npm install pdfjs-dist
  • 大きなファイルではパフォーマンスが低下する可能性があるため、ページごとのロードを推奨します。

タグ: UniApp PDF.js webview PDF Viewer Plugin ネイティブモジュール

7月31日 23:04 投稿