使用 PDFBox 2.0 进行 PDF 渲染和解密 [英] PDF Rendering with PDFBox 2.0 and Decrypting

查看:202
本文介绍了使用 PDFBox 2.0 进行 PDF 渲染和解密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚将 PDFBox 版本从 1.8 升级到 2.0.Migration 表示 .convertToImage() 已被删除,然后在 BufferedImage 的示例代码中没有一行,但它在 .writeImage()

中使用

他们的代码:

PDDocument 文档 = PDDocument.load(new File(pdfFilename));PDFRenderer pdfRenderer = new PDFRenderer(document);int pageCounter = 0;for (PDPage 页面:document.getPages()){pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);//文件名中的后缀将用作文件格式ImageIOUtil.writeImage(bim, pdfFilename + "-" + (pageCounter++) + ".png", 300);}文档.close();

我相信 BufferedImage 用于 ImageIOUtil.writeImage(bim, pdfFilename + "-" + (pageCounter++) + ".png", 300); 作为 bim.如果删除了 .convertToImage(),我应该如何实现 BufferedImage?

第二件事是关于.decrypt().他们没有提到 .decrypt().我应该用什么来代替 .decrypt()?

我的全部代码:

尝试{String sourceDir = "/home/linux/books/text.pdf";文件源文件 = 新文件(源目录);PDDocument 文档 = PDDocument.load(sourceFile);PDFRenderer pdfRenderer = new PDFRenderer(document);如果(document.isEncrypted()){尝试 {System.out.println("正在尝试解密...");文件.解密(");//错误说: PDDocument 类型的方法decrypt(String) 未定义.//它在 pdfbox 1.8 上工作.document.setAllSecurityToBeRemoved(true);System.out.println("文件已被解密.");}捕获(异常 e){throw new Exception("无法解密.", e);}}PDPage firstPage = (PDPage) document.getDocumentCatalog().getPages().get(0);pdfRenderer.renderImageWithDPI(0, 300, ImageType.RGB);String fileName = sourceFile.getName().replace(".pdf", "");BufferedImage image = firstPage.convertToImage(BufferedImage.TYPE_INT_RGB, 300);ImageIOUtil.writeImage(image , fileName+".jpg",300);文档.close();} 捕获(异常 e){e.printStackTrace();}

入门内容正在建设中.这就是为什么我无法检查我的问题.

解决方案

我相信 BufferedImage 用于 ImageIOUtil.writeImage(bim, pdfFilename + "-" + (pageCounter++) + ".png", 300); as bim.如果删除了 .convertToImage(),我应该如何实现 BufferedImage?

实际上迁移指南中遗漏了一点点,应该是

BufferedImage bim = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);

代替

pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);

<小时><块引用>

第二件事是关于.decrypt().他们没有提到 .decrypt().我应该用什么来代替 .decrypt()?

PDDocument 现在有多个也接受密码的 load 重载,例如

/*** 解析 PDF.不受限制的主内存将用于缓冲 PDF 流.** @param file 要加载的文件* @param password 用于解密的密码** @return 加载的文档** @throws IOException 以防文件读取或解析错误*/公共静态 PDDocument 加载(文件文件,字符串密码)抛出 IOException

/*** 解析 PDF.给定的输入流被复制到内存中以启用对 pdf 的随机访问.* 不受限制的主内存将用于缓冲 PDF 流.** @param 包含文档的输入流.* @param password 用于解密的密码** @return 加载的文档** @throws IOException 以防文件读取或解析错误*/公共静态 PDDocument 加载(InputStream 输入,字符串密码)抛出 IOException

I have just upgraded PDFBox version from 1.8 to 2.0. Migration says that .convertToImage() has been removed and there is no a line in their example code for BufferedImage, but it is used in .writeImage()

Their code:

PDDocument document = PDDocument.load(new File(pdfFilename));
PDFRenderer pdfRenderer = new PDFRenderer(document);
int pageCounter = 0;
for (PDPage page : document.getPages())
{ 
    pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);

    // suffix in filename will be used as the file format
    ImageIOUtil.writeImage(bim, pdfFilename + "-" + (pageCounter++) + ".png", 300);
}
document.close();

I believe BufferedImage is used in ImageIOUtil.writeImage(bim, pdfFilename + "-" + (pageCounter++) + ".png", 300); as bim. How should I implement BufferedImage if they have removed .convertToImage()?

Second thing is about .decrypt(). They have not mentioned about .decrypt(). What should I use instead of .decrypt()?

My whole code:

try {
            String sourceDir = "/home/linux/books/text.pdf";

            File sourceFile = new File(sourceDir);

                PDDocument document = PDDocument.load(sourceFile);
                PDFRenderer pdfRenderer = new PDFRenderer(document);
                if (document.isEncrypted()) {
                    try {
                        System.out.println("Trying to decrypt it...");
                        document.decrypt("");
 // error says: The method decrypt(String) is undefined for the type PDDocument.
 // it was working on pdfbox 1.8.
                        document.setAllSecurityToBeRemoved(true);
                        System.out.println("The file has been decrypted in .");
                    }
                    catch (Exception e) {
                        throw new Exception("cannot be decrypted. ", e);
                    }
                }

                PDPage firstPage = (PDPage) document.getDocumentCatalog().getPages().get(0);
                pdfRenderer.renderImageWithDPI(0, 300, ImageType.RGB);

                String fileName = sourceFile.getName().replace(".pdf", "");

                    BufferedImage image = firstPage.convertToImage(BufferedImage.TYPE_INT_RGB, 300);  

                    ImageIOUtil.writeImage(image , fileName+".jpg",300);

                document.close();

        } catch (Exception e) {
                e.printStackTrace();

        }

Getting Started content is under construction. That is why I cannot check my problems.

解决方案

I believe BufferedImage is used in ImageIOUtil.writeImage(bim, pdfFilename + "-" + (pageCounter++) + ".png", 300); as bim. How should I implement BufferedImage if they have removed .convertToImage()?

Actually there is a tiny bit missing in the migration guide, it should be

BufferedImage bim = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);

instead of

pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);


Second thing is about .decrypt(). They have not mentioned about .decrypt(). What should I use instead of .decrypt()?

PDDocument now has multiple load overloads which also accept a password, e.g.

/**
 * Parses a PDF. Unrestricted main memory will be used for buffering PDF streams.
 * 
 * @param file file to be loaded
 * @param password password to be used for decryption
 * 
 * @return loaded document
 * 
 * @throws IOException in case of a file reading or parsing error
 */
public static PDDocument load(File file, String password) throws IOException

or

/**
 * Parses a PDF. The given input stream is copied to the memory to enable random access to the pdf.
 * Unrestricted main memory will be used for buffering PDF streams.
 * 
 * @param input stream that contains the document.
 * @param password password to be used for decryption
 * 
 * @return loaded document
 * 
 * @throws IOException in case of a file reading or parsing error
 */
public static PDDocument load(InputStream input, String password)
        throws IOException

这篇关于使用 PDFBox 2.0 进行 PDF 渲染和解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆