我想提高图像的分辨率.我用过PDFRenderer-0.9.0 jar.它从java.net 下载,用于将PDF页面转换为图像.
我想将46_2.pdf PDF文件转换为图像.转换后的46_2.png图片尺寸较小612 x 792 [ width x height ],
所以我想将图像尺寸增加到1200 x 1400 [ width x height].
我以前试过PdfBox将PDF页面转换成PNG图像文件.有一个问题only page is converted but text is missing.所以我尝试了PdfRenderer进行图像转换.
码:
package com.pdfrenderer.examples;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import javax.imageio.ImageIO;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
public class ConvertPdfPagesToImage {
public static void main(String[] args) {
try {
String …Run Code Online (Sandbox Code Playgroud) 我有一个问题是使用java打印PDF.我知道Java本身不支持print PDF,因为java没有PDF渲染器.所以为了解决这个问题,我使用的是PDFRenderer库,下面是一个用它打印的例子:
File f = new File("myfile.pdf");
FileInputStream fis = new FileInputStream(f);
FileChannel fc = fis.getChannel();
ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0,
fc.size());
PDFFile pdfFile = new PDFFile(bb);
PDFPrintPage pages = new PDFPrintPage(pdfFile);
PrinterJob pjob = PrinterJob.getPrinterJob();
PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
pjob.setJobName(f.getName());
pjob.setPrintService(mPrintService);
Book book = new Book();
book.append(pages, pf, pdfFile.getNumPages());
pjob.setPageable(book);
pjob.print();
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我需要一些方法来获取我的打印机工作的状态.我需要知道我的打印机工作何时完成,我可以启动另一个.Java API与DocPrintJob和PrintJobListener有很好的解决方案,但我需要使用PrinterJob进行PDF打印.那么我怎么能像在DocPrintJob中那样从我的PrinterJob中听取工作状态呢?
我的PDF渲染器有以下问题 -
public boolean onTouchEvent(MotionEvent touchevent){
int actionId = touchevent.getPointerCount();
if (actionId == 1 && touchevent.getPointerCount() == 2) {
switch (touchevent.getAction()) {
case MotionEvent.ACTION_DOWN:
// when user first touches the screen to swap
{
flag = 0;
System.out.println("ACTION_DOWN - "
+ touchevent.getPointerCount());
lastX = touchevent.getX();
break;
}
// Finger went up
case MotionEvent.ACTION_UP: {
flag = 0;
float currentX = touchevent.getX();
System.out.println("ACTION_UP - "
+ touchevent.getPointerCount());
// if left to right swipe on screen - previous page
if …Run Code Online (Sandbox Code Playgroud) 每次我编辑PDFRendererBasicFragment java代码
mFileDescriptor = context.getAssets().openFd("sample.pdf").getParcelFileDescriptor();
Run Code Online (Sandbox Code Playgroud)
对于放在assets文件夹中的不同pdf,应用程序崩溃了..
Logcat报告:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.pdfrendererbasic/com.example.android.pdfrendererbasic.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.pdf.PdfRenderer.getPageCount()' on a null object reference
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我甚至尝试在构建之前将我的PDF重命名为sample.pdf并且它仍然崩溃..一切都与原始代码一起正常工作,只是不让我替换PDF.
堆栈跟踪:
02-11 11:11:50.130 18201-18201/com.example.android.pdfrendererbasic I/art: Not late-enabling -Xcheck:jni (already on)
02-11 11:11:50.130 18201-18201/com.example.android.pdfrendererbasic I/art: Late-enabling JIT
02-11 11:11:50.132 18201-18201/com.example.android.pdfrendererbasic I/art: JIT created with code_cache_capacity=2MB compile_threshold=1000
02-11 11:11:50.201 18201-18201/com.example.android.pdfrendererbasic W/System: ClassLoader referenced unknown path: /data/app/com.example.android.pdfrendererbasic-1/lib/x86
02-11 11:11:50.252 18201-18201/com.example.android.pdfrendererbasic W/System.err: java.io.IOException: cannot create document. Error: 3
02-11 11:11:50.253 18201-18201/com.example.android.pdfrendererbasic W/System.err: at android.graphics.pdf.PdfRenderer.nativeCreate(Native Method)
02-11 11:11:50.253 …Run Code Online (Sandbox Code Playgroud) 我正在使用API Level 21,我正在尝试显示从Internet下载并存储在缓存目录中的PDF.
private void openRenderer(Context context) throws IOException {
Log.d("NoiPA", "Opening PDF File: " + pdfPath);
// In this sample, we read a PDF from the assets directory.
mFileDescriptor = ParcelFileDescriptor.open(new File(pdfPath),ParcelFileDescriptor.MODE_READ_ONLY);
//mFileDescriptor = context.getAssets().openFd(pdfPath).getParcelFileDescriptor();
// This is the PdfRenderer we use to render the PDF.
mPdfRenderer = new PdfRenderer(mFileDescriptor);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码使应用程序崩溃,并显示以下堆栈跟踪:
Download: Completed -> Showing PDF
onAttach -> pdfPath: /data/data/com.vitobellini.noipa/cache/MAG 2016.pdf
Opening PDF File: /data/data/com.vitobellini.noipa/cache/MAG 2016.pdf
java.io.IOException: not create document. Error:
at android.graphics.pdf.PdfRenderer.nativeCreate(Native Method)
at android.graphics.pdf.PdfRenderer.<init>(PdfRenderer.java:149)
at com.vitobellini.noipa.PdfRendererFragment.openRenderer(PdfRendererFragment.java:151) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 PdfRenderer android api 呈现一些页面。我的一些用户开始看到此错误:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1337, result=-1, data=Intent { dat=file:///storage/emulated/0/Download/Jul-Aug-2016statement.pdf }} to activity {converter.dassem.com.fileconverter/converter.dassem.com.fileconverter.MainActivity}: java.lang.SecurityException: cannot create document. Error: 4
at android.app.ActivityThread.deliverResults(ActivityThread.java:3949)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3992)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1543)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: java.lang.SecurityException: cannot create document. Error: 4
at android.graphics.pdf.PdfRenderer.nativeCreate(Native Method)
at android.graphics.pdf.PdfRenderer.<init>(PdfRenderer.java:153)
Run Code Online (Sandbox Code Playgroud)
文档中没有关于错误 4 的任何内容,尽管它确实说如果使用密码加密 pdf,则会引发安全异常。从 uri 创建 PdfRenderer 时发生错误。
那么有人知道错误 4 的确切含义吗?
谢谢
android pdfrenderer runtimeexception android-securityexception
我的应用程序列出了 PDF 文件,当用户选择一个 PDF 时,应用程序会打开它。如果用户选择损坏的 PDF 文件,PdfRenderer 将抛出IOException(这很好,因为我捕获了该异常并通知用户该文件已损坏)。
但问题是,在发生这种情况后,IOException用户尝试打开的所有 PDF 文件都会被抛出(即使对于未损坏的文件)
相关代码
File file = new File(filePath);
mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
if (mFileDescriptor != null) {
mPdfRenderer = new PdfRenderer(mFileDescriptor);
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
openRenderer: java.io.IOException: file not in PDF format or corrupted
at android.graphics.pdf.PdfRenderer.nativeCreate(Native Method)
at android.graphics.pdf.PdfRenderer.<init>(PdfRenderer.java:166)
at ****.****.****.PdfUtil.openRenderer(PdfUtil.java:63)
at ****.****.****.PdfUtil.getMaxPages(PdfUtil.java:46)
at ****.****.****.PdfViewActivity.init(PdfViewActivity.java:166)
at ****.****.****.ui.PdfViewActivity.onCreate(PdfViewActivity.java:58)
at android.app.Activity.performCreate(Activity.java:7023)
at android.app.Activity.performCreate(Activity.java:7014)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2745)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2870)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1601)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:172)
at android.app.ActivityThread.main(ActivityThread.java:6590) …Run Code Online (Sandbox Code Playgroud) 我有一个要在 ImageView 中显示的 PDF。它在 API 24-28 上显示,但在 API 29 上没有显示图像。我认为问题可能是 PDFRenderer 创建的位图。
我在该.render方法之后放置了一个断点,并(在调试器中)在此处单击“查看位图”:

在 API 29 上,有时会得到图像,有时会出现以下错误:
评估表达式时出错,已收集对象
在 API 24-28 上,我没有收到此错误。我总是得到图像。
下面是示例代码:
File file = new File(getExternalFilesDir(null), "fileName.pdf");
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));
if (currentPage < 0) {
currentPage = 0;
} else if (currentPage > renderer.getPageCount()) {
currentPage = renderer.getPageCount() - 1;
}
Bitmap bitmap = Bitmap.createBitmap(800, 1000, Bitmap.Config.ARGB_8888);
Rect rect = new Rect(0, 0, 800, 1000);
PdfRenderer.Page page = renderer.openPage(currentPage);
page.render(bitmap, rect, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); …Run Code Online (Sandbox Code Playgroud) 我是Android开发的新手.我正在努力将Pdf转换为Image并将其存储在一个位置.我已经使用PdfRenderer(API级别21)将PDF转换为位图Image.转换后的图像是透明背景.请指导我转换图像与白色背景.这样我就可以将它转换为二进制数字.
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY));
Bitmap bitmap;
final int pageCount = renderer.getPageCount();
System.out.println("pageCount"+pageCount);
for (int i = 0; i < pageCount; i++) {
PdfRenderer.Page page = renderer.openPage(i);
int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth();
int height = 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_PRINT);
storeImage(bitmap,"test.bmp");//I have wrote a function here to save the image
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我正在尝试使用PDFRendererfrom PDFBox并且效果很好,但是它给了我一个警告:
Aug 31, 2019 11:46:48 PM org.apache.pdfbox.rendering.PDFRenderer suggestKCMS
INFO: Your current java version is: 1.8.0_171
Aug 31, 2019 11:46:48 PM org.apache.pdfbox.rendering.PDFRenderer suggestKCMS
INFO: To get higher rendering speed on old java 1.8 or 9 versions,
Aug 31, 2019 11:46:48 PM org.apache.pdfbox.rendering.PDFRenderer suggestKCMS
INFO: update to the latest 1.8 or 9 version (>= 1.8.0_191 or >= 9.0.4),
Aug 31, 2019 11:46:48 PM org.apache.pdfbox.rendering.PDFRenderer suggestKCMS
INFO: or
Aug 31, 2019 11:46:48 PM org.apache.pdfbox.rendering.PDFRenderer suggestKCMS
INFO: use the option …Run Code Online (Sandbox Code Playgroud)