26

私がする必要があるのは、(ローカルに保存された) を取得し、PDF-documentそのページの 1 つまたはすべてをJPG や PNG などの画像形式に変換することだけです。

APV PDF ViewerAPDFViewerdroidreaderandroid-pdfMuPdfなどの多くの PDF レンダリング/表示ソリューションを試しましたが、これまでのところ、pdf ページを画像に変換する方法を理解できませんでした。.

編集:また、PDFを画像に変換するために編集する必要があるPDFレンダラーよりも、PDFから画像へのコンバーターが必要です。

4

9 に答える 9

10

API 8 以降をサポートするには、次の手順に従います。

このライブラリ: android-pdfviewと次のコードを使用すると、PDF ページを画像 (JPG、PNG) に確実に変換できます。

DecodeServiceBase decodeService = new DecodeServiceBase(new PdfContext());
decodeService.setContentResolver(mContext.getContentResolver());

// a bit long running
decodeService.open(Uri.fromFile(pdf));

int pageCount = decodeService.getPageCount();
for (int i = 0; i < pageCount; i++) {
    PdfPage page = decodeService.getPage(i);
    RectF rectF = new RectF(0, 0, 1, 1);

    // do a fit center to 1920x1080
    double scaleBy = Math.min(AndroidUtils.PHOTO_WIDTH_PIXELS / (double) page.getWidth(), //
            AndroidUtils.PHOTO_HEIGHT_PIXELS / (double) page.getHeight());
    int with = (int) (page.getWidth() * scaleBy);
    int height = (int) (page.getHeight() * scaleBy);

    // you can change these values as you to zoom in/out
    // and even distort (scale without maintaining the aspect ratio)
    // the resulting images

    // Long running
    Bitmap bitmap = page.renderBitmap(with, height, rectF);

    try {
        File outputFile = new File(mOutputDir, System.currentTimeMillis() + FileUtils.DOT_JPEG);
        FileOutputStream outputStream = new FileOutputStream(outputFile);

        // a bit long running
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);

        outputStream.close();
    } catch (IOException e) {
        LogWrapper.fatalError(e);
    }
}

この作業はバックグラウンドで実行する必要があります。つまり、AsyncTaskかなりの数のメソッドが計算または IO 時間を必要とするため、または同様のものを使用して実行する必要があります (コメントでマークしました)。

于 2016-01-14T08:38:54.557 に答える
9

同じ要件については、このプロジェクトのオープンソースを確認する必要があります。これは、さらに多くのことを行うのに役立ちます。

プロジェクト:PdfRenderer

パッケージにはPDFPage.javaという名前のJavaクラスが1つありpdfviewます。そのクラスには、ページの画像を取得するメソッドがあります。

私も同じことをテストプロジェクトに実装しました。JavaコードはここにありますshowPageページ番号とズームレベルを受け入れ、そのページをとして返すメソッドを1つ作成しましBitmapた。

これがお役に立てば幸いです。そのためにそのプロジェクトまたはJARを取得する必要があります。十分に文書化された同じものについては、JAVADOCを読んでから、私が行ったのと同じように実装してみてください。

時間をかけて、ハッピーコーディング:)

于 2012-05-24T09:12:20.910 に答える
7

Android API 21以降、探しているのはPdfRendererです。

于 2014-10-28T16:31:39.350 に答える
1

完全な解決策ではなく、簡単なトリックだと思います.PDFページを正常にレンダリングすると、次のように画面からビットマップが取得されます

View view = MuPDFActivity.this.getWindow().getDecorView();
if (false == view.isDrawingCacheEnabled()) {
    view.setDrawingCacheEnabled(true);
}
Bitmap bitmap = view.getDrawingCache();

次に、このビットマップを保存できます。つまり、pdf ページを画像としてローカルに保存できます。

try {
    new File(Environment.getExternalStorageDirectory()+"/PDF Reader").mkdirs();
    File outputFile = new File(Environment.getExternalStorageDirectory()+"/PDF Reader", System.currentTimeMillis()+"_pdf.jpg");
    FileOutputStream outputStream = new FileOutputStream(outputFile);

    // a bit long running
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        outputStream.close();
} catch (IOException e) {
    Log.e("During IMAGE formation", e.toString());
}

以上です。お役に立てば幸いです。

于 2016-06-25T18:03:21.873 に答える
1

すべての答えを調べて試した後、すべてのPDFファイルでうまくいきませんでした。カスタム フォントの PDF ファイルにレンダリングの問題がありました。次に、libraryを使用してみました。すべての PDF ページから画像を取得するための NickUncheck の回答からインスピレーションを得ました。

コードは次のとおりです。

アプリの build.gradle ファイルに次の依存関係を追加します。

implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

PDF ページを画像に変換するコード:

      public static List<Bitmap> renderToBitmap(Context context, String filePath) {
            List<Bitmap> images = new ArrayList<>();
            PdfiumCore pdfiumCore = new PdfiumCore(context);
            try {
                File f = new File(pdfPath);
                ParcelFileDescriptor fd = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
                PdfDocument pdfDocument = pdfiumCore.newDocument(fd);
                final int pageCount = pdfiumCore.getPageCount(pdfDocument);
                for (int i = 0; i < pageCount; i++) {
                    pdfiumCore.openPage(pdfDocument, i);
                    int width = pdfiumCore.getPageWidthPoint(pdfDocument, i);
                    int height = pdfiumCore.getPageHeightPoint(pdfDocument, i);
                    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                    pdfiumCore.renderPageBitmap(pdfDocument, bmp, i, 0, 0, width, height);
                    images.add(bmp);
                }
                pdfiumCore.closeDocument(pdfDocument);
            } catch(Exception e) {
                //todo with exception
            }
     return images;
   }

これまでのところ、私が試したすべての PDF ファイルで機能しています。

于 2021-10-04T16:36:32.440 に答える