我需要将任意PDF文档的页面导出为jpeg / png / etc格式的一系列单个图像。我需要用Java做到这一点。
尽管我确实了解iText,PDFBox和其他各种Java pdf库,但我希望找到一些工作示例或操作方法的指针。
谢谢。
这是一种实现方法,它结合了Web上的一些代码片段。
如何将PDF绘制到图像中?
https://pdf-
renderer.dev.java.net/examples.html
从图像创建缓冲图像
原文:http :
//www.exampledepot.com/egs/java.awt.image/Image2Buf.html
更新:如何将缓冲的图像转换为图像,反之亦然?
将生成的图形保存到PNG或JPEG文件
原文:http :
//www.exampledepot.com/egs/javax.imageio/Graphic2File.html
更新:http :
//docs.oracle.com/javase/tutorial/2d/images/saveimage.html
组合成类似这样的东西,可以将所有页面变成图像:
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import javax.swing.*;
import javax.imageio.*;
import java.awt.image.*;
public class ImageMain {
public static void setup() throws IOException {
// load a pdf from a byte buffer
File file = new File("test.pdf");
RandomAccessFile raf = new RandomAccessFile(file, "r");
FileChannel channel = raf.getChannel();
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
PDFFile pdffile = new PDFFile(buf);
int numPgs = pdffile.getNumPages();
for (int i = 0; i < numPgs; i++) {
// draw the first page to an image
PDFPage page = pdffile.getPage(i);
// get the width and height for the doc at the default zoom
Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
// generate the image
Image img = page.getImage(rect.width, rect.height, // width & height
rect, // clip rect
null, // null for the ImageObserver
true, // fill background with white
true // block until drawing is done
);
// save it as a file
BufferedImage bImg = toBufferedImage(img);
File yourImageFile = new File("page_" + i + ".png");
ImageIO.write(bImg, "png", yourImageFile);
}
}
// This method returns a buffered image with the contents of an image
public static BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {
return (BufferedImage) image;
}
// This code ensures that all the pixels in the image are loaded
image = new ImageIcon(image).getImage();
// Determine if the image has transparent pixels; for this method's
// implementation, see e661 Determining If an Image Has Transparent
// Pixels
boolean hasAlpha = hasAlpha(image);
// Create a buffered image with a format that's compatible with the
// screen
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
// Determine the type of transparency of the new buffered image
int transparency = Transparency.OPAQUE;
if (hasAlpha) {
transparency = Transparency.BITMASK;
}
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
} catch (HeadlessException e) {
// The system does not have a screen
}
if (bimage == null) {
// Create a buffered image using the default color model
int type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha) {
type = BufferedImage.TYPE_INT_ARGB;
}
bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
}
// Copy image to buffered image
Graphics g = bimage.createGraphics();
// Paint the image onto the buffered image
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
public static boolean hasAlpha(Image image) {
// If buffered image, the color model is readily available
if (image instanceof BufferedImage) {
BufferedImage bimage = (BufferedImage) image;
return bimage.getColorModel().hasAlpha();
}
// Use a pixel grabber to retrieve the image's color model;
// grabbing a single pixel is usually sufficient
PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
try {
pg.grabPixels();
} catch (InterruptedException e) {
}
// Get the image's color model
ColorModel cm = pg.getColorModel();
return cm.hasAlpha();
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
ImageMain.setup();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
}
问题内容: 我必须提供一些导出功能到我的网站,例如CSV或PDF。Java是否有功能强大且免费的工具将HTML页面转换为PDF格式? 问题答案: 与一起使用可以将HTML内容转换为PDF。 以下示例在某种程度上帮助您理解XHTML到PDF的转换。 使用飞碟API的示例 : 您需要以下库: core-renderer.jar iText-2.0.8.jar 您可以在中找到这些资源。 例1:使用XML
问题内容: 我正在尝试使用Python将多页PDF转换为一系列JPEG。我可以使用可用的工具轻松地将PDF拆分为单个页面,但是我找不到能够将PDF转换为图像的任何东西。 PIL无法工作,因为它无法读取PDF。我找到的两个选项是通过外壳使用GhostScript或ImageMagick。对于我来说,这不是一个可行的选择,因为该程序需要跨平台,而且我不确定这些程序中的任何一个都可以在将要安装和使用的计
问题内容: 如何使用Java生成PDF文档中页面的缩略图? 问题答案: 我认为http://pdfbox.apache.org/可以满足您的需求,因为您可以从页面创建图像,然后缩放图像 从他们的示例代码中-
我有一个针对xml内容和xsl标记运行apache fop的代码,并为我提供apache中间格式输出: 然后我使用中间格式文件来渲染pdf和png文件。我可以在这里设置我自己的serilaizer(FPSIFSeriezer())。 我有几页报告,但我不需要处理所有的报告。是否有任何方法可以跳过某些页面或从IntermediateFormat中提取它们,以便我能够例如仅将第一页呈现为png,然后将
如何替换PDF中的图像与另一个图像PDF框。怎么做? 我想用另一个图像更改pdf上的VisualSignature。
在java swing(桌面)应用程序中,我需要将jasper报告导出为PDF文件。下面的代码输出jasper报告和pdf文件,但问题是pdf的大小为零,没有显示报告内容,甚至无法打开pdf,jasper版本为3.1.4,jasperreports-3.1.4。罐子