下面列出了怎么用android.graphics.pdf.PdfRenderer的API类实例代码及写法,或者点击链接到github查看源代码。
@WorkerThread
private void openPdfRenderer() throws IOException {
final File file = new File(getApplication().getCacheDir(), FILENAME);
if (!file.exists()) {
// Since PdfRenderer cannot handle the compressed asset file directly, we copy it into
// the cache directory.
final InputStream asset = getApplication().getAssets().open(FILENAME);
final FileOutputStream output = new FileOutputStream(file);
final byte[] buffer = new byte[1024];
int size;
while ((size = asset.read(buffer)) != -1) {
output.write(buffer, 0, size);
}
asset.close();
output.close();
}
mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
if (mFileDescriptor != null) {
mPdfRenderer = new PdfRenderer(mFileDescriptor);
}
}
@WorkerThread
private void showPage(int index) {
// Make sure to close the current page before opening another one.
if (null != mCurrentPage) {
mCurrentPage.close();
}
// Use `openPage` to open a specific page in PDF.
mCurrentPage = mPdfRenderer.openPage(index);
// Important: the destination bitmap must be ARGB (not RGB).
final Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), mCurrentPage.getHeight(),
Bitmap.Config.ARGB_8888);
// Here, we render the page onto the Bitmap.
// To render a portion of the page, use the second and third parameter. Pass nulls to get
// the default result.
// Pass either RENDER_MODE_FOR_DISPLAY or RENDER_MODE_FOR_PRINT for the last parameter.
mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
mPageBitmap.postValue(bitmap);
final int count = mPdfRenderer.getPageCount();
mPageInfo.postValue(new PageInfo(index, count));
mPreviousEnabled.postValue(index > 0);
mNextEnabled.postValue(index + 1 < count);
}
@Override
@SuppressWarnings("NewApi")
public Object instantiateItem(ViewGroup container, int position) {
View v = inflater.inflate(R.layout.view_pdf_page, container, false);
ImageView iv = (ImageView) v.findViewById(R.id.imageView);
if (renderer == null || getCount() < position) {
return v;
}
PdfRenderer.Page page = getPDFPage(renderer, position);
Bitmap bitmap = bitmapContainer.get(position);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
iv.setImageBitmap(bitmap);
container.addView(v, 0);
return v;
}
@Override
@SuppressWarnings("NewApi")
public Object instantiateItem(ViewGroup container, int position) {
View v = inflater.inflate(R.layout.view_pdf_page, container, false);
ImageView iv = (ImageView) v.findViewById(R.id.imageView);
if (renderer == null || getCount() < position) {
return v;
}
PdfRenderer.Page page = getPDFPage(renderer, position);
Bitmap bitmap = bitmapContainer.get(position);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
iv.setImageBitmap(bitmap);
container.addView(v, 0);
return v;
}
@Override
@SuppressWarnings("NewApi")
public Object instantiateItem(ViewGroup container, int position) {
View v = inflater.inflate(R.layout.view_pdf_page, container, false);
ImageView iv = (ImageView) v.findViewById(R.id.imageView);
if (renderer == null || getCount() < position) {
return v;
}
PdfRenderer.Page page = getPDFPage(renderer, position);
Bitmap bitmap = bitmapContainer.get(position);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
iv.setImageBitmap(bitmap);
container.addView(v, 0);
return v;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private Bitmap getPDFPreview(final File file, int size) {
try {
final ParcelFileDescriptor mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
if (mFileDescriptor == null) {
return null;
}
final PdfRenderer renderer = new PdfRenderer(mFileDescriptor);
final PdfRenderer.Page page = renderer.openPage(0);
final Dimensions dimensions = scalePdfDimensions(new Dimensions(page.getHeight(), page.getWidth()));
final Bitmap bitmap = Bitmap.createBitmap(dimensions.width, dimensions.height, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(Color.WHITE);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
drawOverlay(bitmap, R.drawable.show_pdf, 0.75f);
page.close();
renderer.close();
return bitmap;
} catch (Exception e) {
e.printStackTrace();
final Bitmap placeholder = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
placeholder.eraseColor(Color.WHITE);
drawOverlay(placeholder, R.drawable.show_pdf, 0.75f);
return placeholder;
}
}
/**
* Sets up a {@link android.graphics.pdf.PdfRenderer} and related resources.
*/
private void openRenderer(Context context) throws IOException {
// In this sample, we read a PDF from the assets directory.
File file = new File(context.getCacheDir(), FILENAME);
if (!file.exists()) {
// Since PdfRenderer cannot handle the compressed asset file directly, we copy it into
// the cache directory.
InputStream asset = context.getAssets().open(FILENAME);
FileOutputStream output = new FileOutputStream(file);
final byte[] buffer = new byte[1024];
int size;
while ((size = asset.read(buffer)) != -1) {
output.write(buffer, 0, size);
}
asset.close();
output.close();
}
mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
// This is the PdfRenderer we use to render the PDF.
if (mFileDescriptor != null) {
mPdfRenderer = new PdfRenderer(mFileDescriptor);
}
}
/**
* Shows the specified page of PDF to the screen.
*
* @param index The page index.
*/
private void showPage(int index) {
if (mPdfRenderer.getPageCount() <= index) {
return;
}
// Make sure to close the current page before opening another one.
if (null != mCurrentPage) {
mCurrentPage.close();
}
// Use `openPage` to open a specific page in PDF.
mCurrentPage = mPdfRenderer.openPage(index);
// Important: the destination bitmap must be ARGB (not RGB).
Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), mCurrentPage.getHeight(),
Bitmap.Config.ARGB_8888);
// Here, we render the page onto the Bitmap.
// To render a portion of the page, use the second and third parameter. Pass nulls to get
// the default result.
// Pass either RENDER_MODE_FOR_DISPLAY or RENDER_MODE_FOR_PRINT for the last parameter.
mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
// We are ready to show the Bitmap to user.
mImageView.setImageBitmap(bitmap);
updateUi();
}
/**
* Convert PDF to bitmap, only works on devices above LOLLIPOP
*
* @param pdfFile pdf file
* @return list of bitmap of every page
* @throws Exception
*/
public static ArrayList<Bitmap> pdfToBitmap(File pdfFile) throws Exception, IllegalStateException {
if (pdfFile == null || pdfFile.exists() == false) {
throw new IllegalStateException("");
}
ArrayList<Bitmap> bitmaps = new ArrayList<>();
try {
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY));
Bitmap bitmap;
final int pageCount = renderer.getPageCount();
for (int i = 0; i < pageCount; i++) {
PdfRenderer.Page page = renderer.openPage(i);
int width = page.getWidth();
int height = page.getHeight();
/* FOR HIGHER QUALITY IMAGES, USE:
int width = context.getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth();
int height = context.getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight();
*/
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
bitmaps.add(bitmap);
// close the page
page.close();
}
// close the renderer
renderer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return bitmaps;
}
/**
* Get total number of pages
*
* @param pdfFile pdf file to get page count of
* @return pdf page count
* @throws IOException
* @throws Exception
*/
private int getTotalPages(File pdfFile) throws IOException, Exception {
ParcelFileDescriptor parcelFileDescriptor = ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
PdfRenderer pdfRenderer = new PdfRenderer(parcelFileDescriptor);
return pdfRenderer.getPageCount();
} else {
throw new Exception("PDF cannot be processed in this device");
}
}
@Override
@SuppressWarnings("NewApi")
public Object instantiateItem(ViewGroup container, int position) {
View v = inflater.inflate(R.layout.view_pdf_page, container, false);
ImageView iv = (ImageView) v.findViewById(R.id.imageView);
if (renderer == null || getCount() < position) {
return v;
}
PdfRenderer.Page page = getPDFPage(renderer, position);
Bitmap bitmap = bitmapContainer.get(position);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
PhotoViewAttacher attacher = new PhotoViewAttacher(iv);
attacher.setScale(scale.getScale(), scale.getCenterX(), scale.getCenterY(), true);
attacher.setOnMatrixChangeListener(this);
attachers.put(position, new WeakReference<PhotoViewAttacher>(attacher));
iv.setImageBitmap(bitmap);
attacher.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
@Override
public void onPhotoTap(View view, float x, float y) {
if (pageClickListener != null) {
pageClickListener.onPageTap(view, x, y);
}
}
});
attacher.update();
container.addView(v, 0);
return v;
}
@SuppressWarnings("NewApi")
protected void init() {
try {
renderer = new PdfRenderer(getSeekableFileDescriptor(pdfPath));
inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
PdfRendererParams params = extractPdfParamsFromFirstPage(renderer, renderQuality);
bitmapContainer = new SimpleBitmapPool(params);
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("NewApi")
private PdfRendererParams extractPdfParamsFromFirstPage(PdfRenderer renderer, float renderQuality) {
PdfRenderer.Page samplePage = getPDFPage(renderer, FIRST_PAGE);
PdfRendererParams params = new PdfRendererParams();
params.setRenderQuality(renderQuality);
params.setOffScreenSize(offScreenSize);
params.setWidth((int) (samplePage.getWidth() * renderQuality));
params.setHeight((int) (samplePage.getHeight() * renderQuality));
samplePage.close();
return params;
}
@SuppressWarnings("NewApi")
protected void init() {
try {
renderer = new PdfRenderer(getSeekableFileDescriptor(pdfPath));
inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
PdfRendererParams params = extractPdfParamsFromFirstPage(renderer, renderQuality);
bitmapContainer = new SimpleBitmapPool(params);
} catch (IOException e) {
errorHandler.onPdfError(e);
}
}
@SuppressWarnings("NewApi")
protected PdfRendererParams extractPdfParamsFromFirstPage(PdfRenderer renderer, float renderQuality) {
PdfRenderer.Page samplePage = getPDFPage(renderer, FIRST_PAGE);
PdfRendererParams params = new PdfRendererParams();
params.setRenderQuality(renderQuality);
params.setOffScreenSize(offScreenSize);
params.setWidth((int) (samplePage.getWidth() * renderQuality));
params.setHeight((int) (samplePage.getHeight() * renderQuality));
samplePage.close();
return params;
}
@Override
@SuppressWarnings("NewApi")
public Object instantiateItem(ViewGroup container, int position) {
View v = inflater.inflate(R.layout.view_pdf_page, container, false);
ImageView iv = (ImageView) v.findViewById(R.id.imageView);
if (renderer == null || getCount() < position) {
return v;
}
PdfRenderer.Page page = getPDFPage(renderer, position);
Bitmap bitmap = bitmapContainer.get(position);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
PhotoViewAttacher attacher = new PhotoViewAttacher(iv);
attacher.setScale(scale.getScale(), scale.getCenterX(), scale.getCenterY(), true);
attacher.setOnMatrixChangeListener(this);
attachers.put(position, new WeakReference<PhotoViewAttacher>(attacher));
iv.setImageBitmap(bitmap);
attacher.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
@Override
public void onPhotoTap(View view, float x, float y) {
if (pageClickListener != null) {
pageClickListener.onPageTap(view, x, y);
}
}
});
attacher.update();
container.addView(v, 0);
return v;
}
@SuppressWarnings("NewApi")
protected void init() {
try {
renderer = new PdfRenderer(getSeekableFileDescriptor(pdfPath));
inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
PdfRendererParams params = extractPdfParamsFromFirstPage(renderer, renderQuality);
bitmapContainer = new SimpleBitmapPool(params);
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("NewApi")
private PdfRendererParams extractPdfParamsFromFirstPage(PdfRenderer renderer, float renderQuality) {
PdfRenderer.Page samplePage = getPDFPage(renderer, FIRST_PAGE);
PdfRendererParams params = new PdfRendererParams();
params.setRenderQuality(renderQuality);
params.setOffScreenSize(offScreenSize);
params.setWidth((int) (samplePage.getWidth() * renderQuality));
params.setHeight((int) (samplePage.getHeight() * renderQuality));
samplePage.close();
return params;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private Bitmap renderPdfDocument(ParcelFileDescriptor fileDescriptor, int targetSize, boolean fit) throws IOException {
final PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor);
final PdfRenderer.Page page = pdfRenderer.openPage(0);
final Dimensions dimensions = scalePdfDimensions(new Dimensions(page.getHeight(), page.getWidth()), targetSize, fit);
final Bitmap rendered = Bitmap.createBitmap(dimensions.width, dimensions.height, Bitmap.Config.ARGB_8888);
rendered.eraseColor(0xffffffff);
page.render(rendered, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
pdfRenderer.close();
fileDescriptor.close();
return rendered;
}
@SuppressWarnings("NewApi")
protected PdfRenderer.Page getPDFPage(PdfRenderer renderer, int position) {
return renderer.openPage(position);
}
@SuppressWarnings("NewApi")
protected PdfRenderer.Page getPDFPage(PdfRenderer renderer, int position) {
return renderer.openPage(position);
}
@SuppressWarnings("NewApi")
protected PdfRenderer.Page getPDFPage(PdfRenderer renderer, int position) {
return renderer.openPage(position);
}