在Listview中显示图片封面pdf

时间:2018-05-12 15:18:58

标签: android android-layout

我有带有iconf的listview的pdf阅读器 如何在这样的listview中制作封面pdf?

Example 1

Example 2

源代码:https://deepshikhapuri.wordpress.com/2017/04/24/open-pdf-file-from-sdcard-in-android-programmatically/

如何在listview中更改pdf图标以涵盖pdf?

感谢

主要Activity.java

 public static final String SAMPLE_FILE = "android_tutorial.pdf";
PDFView pdfView;
Integer pageNumber = 0;
String pdfFileName;
String TAG = "PdfActivity";
int position = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pdf);
    init();
}

private void init() {
    pdfView = (PDFView) findViewById(R.id.pdfView);

    //position = Environment.getExternalStorageDirectory()+"/sdcard/Pdf"
    position = getIntent().getIntExtra("position", -1);
    displayFromSdcard();
    //String position = Environment.getExternalStorageDirectory().getAbsolutePath() +"/Pdf/";
}

private void displayFromSdcard() {
    pdfFileName = MainActivity.fileList.get(position).getName();

    pdfView.fromFile(MainActivity.fileList.get(position))
            .defaultPage(pageNumber)
            .enableSwipe(true)
            .password("123456")
            .swipeHorizontal(false)
            .onPageChange(this)
            .enableAnnotationRendering(true)
            .onLoad(this)
            .scrollHandle(new DefaultScrollHandle(this))
            .load();
}


@Override
public void onPageChanged(int page, int pageCount) {
    pageNumber = page;
    setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
}


@Override
public void loadComplete(int nbPages) {
    PdfDocument.Meta meta = pdfView.getDocumentMeta();
    printBookmarksTree(pdfView.getTableOfContents(), "-");

}

public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
    for (PdfDocument.Bookmark b : tree) {

        Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

        if (b.hasChildren()) {
            printBookmarksTree(b.getChildren(), sep + "-");
        }
    }
}

PdfActivity

 Context context;
ViewHolder viewHolder;
ArrayList<File> al_pdf;

public PDFAdapter(Context context, ArrayList<File> al_pdf) {
    super(context, R.layout.adapter_pdf, al_pdf);
    this.context = context;
    this.al_pdf = al_pdf;

}


@Override
public int getItemViewType(int position) {
    return position;
}

@Override
public int getViewTypeCount() {
    if (al_pdf.size() > 0) {
        return al_pdf.size();
    } else {
        return 1;
    }
}

@Override
public View getView(final int position, View view, ViewGroup parent) {


    if (view == null) {
        view = LayoutInflater.from(getContext()).inflate(R.layout.adapter_pdf, parent, false);
        viewHolder = new ViewHolder();
        viewHolder.tv_filename = (TextView) view.findViewById(R.id.tv_name);

        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) view.getTag();

    }

    viewHolder.tv_filename.setText(al_pdf.get(position).getName());
    return view;

}

public class ViewHolder {

    TextView tv_filename;


}

PdfAdapter

Math.max

1 个答案:

答案 0 :(得分:0)

您可以通过创建pdf首页的位图来创建图像。然后将图像保存到您的应用程序目录以供以后使用。您可以使用PdfiumCore(它是barteks PdfView的依赖项)来生成图像。

您可以使用以下内容:

import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import com.shockwave.pdfium.PdfDocument;
import com.shockwave.pdfium.PdfiumCore;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

class PDFUtils {

  static String generateAndSaveFirstPageImage(Context context, Uri uri, long bookId) {
    try {
      ParcelFileDescriptor fd = context.getContentResolver().openFileDescriptor(uri, "r");
      int pageNum = 0;
      PdfiumCore pdfiumCore = new PdfiumCore(context);
      try {
        PdfDocument pdfDocument = pdfiumCore.newDocument(fd);
        pdfiumCore.openPage(pdfDocument, 0); // open first page for cover.

        int width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNum);
        int height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNum);

        // do a fit center to 1920x1080
        //double scaleBy = Math.min(1080 / (double) width, //
        //    1920 / (double) height);
        //width = (int) (width * scaleBy);
        //height = (int) (height * scaleBy);

        // ARGB_8888 - best quality, high memory usage, higher possibility of OutOfMemoryError
        // RGB_565 - little worse quality, twice less memory usage
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        pdfiumCore.renderPageBitmap(pdfDocument, bitmap, pageNum, 0, 0, width, height);
        //if you need to render annotations and form fields, you can use
        //the same method above adding 'true' as last param

        String fileName = bookId + ".jpg";
        // save the file
        File outputFile = new File(context.getFilesDir(), fileName);
        FileOutputStream outputStream = new FileOutputStream(outputFile);

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

        outputStream.close();
        fd.close();
        pdfiumCore.closeDocument(pdfDocument); // important!

        return fileName;
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

    return null;
  }
}

然后,您需要使用以下内容来使用该类:

long bookId = 2345; // your book identifier
Url yourPdfUrl; // url of pdf in your device
PdfUtils.generateAndSaveFirstPageImage(context, yourPdfUrl, bookId);

保存图像后,您可以再次使用图像:

String imagePath = getFilesDir() + "/" + yourBookId + ".jpg";