我使用下面的代码将PDF转换为PNG图像。
Document document = new Document();
try {
document.setFile(myProjectPath);
System.out.println("Parsed successfully...");
} catch (PDFException ex) {
System.out.println("Error parsing PDF document " + ex);
} catch (PDFSecurityException ex) {
System.out.println("Error encryption not supported " + ex);
} catch (FileNotFoundException ex) {
System.out.println("Error file not found " + ex);
} catch (IOException ex) {
System.out.println("Error handling PDF document " + ex);
}
// save page caputres to file.
float scale = 1.0f;
float rotation = 0f;
// Paint each pages content to an image and write the image to file
InputStream fis2 = null;
File file = null;
for (int i = 0; i < 1; i++) {
BufferedImage image = (BufferedImage) document.getPageImage(i,
GraphicsRenderingHints.SCREEN,
Page.BOUNDARY_CROPBOX, rotation, scale);
RenderedImage rendImage = image;
// capture the page image to file
try {
System.out.println("\t capturing page " + i);
file = new File(myProjectActualPath + "myImage.png");
ImageIO.write(rendImage, "png", file);
fis2 = new BufferedInputStream(new FileInputStream(myProjectActualPath + "myImage.png"));
} catch (IOException ioe) {
System.out.println("IOException :: " + ioe);
} catch (Exception e) {
System.out.println("Exception :: " + e);
}
image.flush();
}
myProjectPath
是pdf文件的路径。
问题是我有大小为305 KB的pdf图像。当我使用上面的代码转换图像时,图像大小是5.5 MB,这是意想不到的。出现这种情况的原因是什么?有没有办法压缩这个?如果我得到压缩尺寸的解决方案(通过减小像素大小),也可以。
注意:对于其他pdf文件,图片将达到305 KB。这种情况发生在一个PDF文件中,并且不确定为什么会发生这种情况。
我正在使用jar文件
icepdf-core.jar
icepdf-viewer.jar
我的导入是
import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
答案 0 :(得分:0)
您应该可以通过更改比例来更改文件的大小。 PDF通常比渲染图像小得多。它们可以表示文本和矢量图形,渲染图像将使用大量字节来表示。我实际上有点惊讶你的任何png与pdfs的大小差不多(除非pdf只是图片)。
答案 1 :(得分:0)
您可以从pdf中提取图像(使用PDFBox的示例):
List<PDPage> pages = document.getDocumentCatalog().getAllPages();
for(PDPage page : pages) {
Map<String, PDXObjectImage> images = page.getResources().getImages();
for(PDXObjectImage image : images.values()){
//TODO: write image to disk
}
}
OR / AND您可能希望将它们保存为jpg到磁盘,因为jpg过度压缩而不是png。
您甚至可以识别原始图像的格式,并在写入磁盘时通过调用:
使用它image.getSuffix();