[英]How to render part of a page as an image using PDFBox?
PDFBox offer functions to render a entire page, but no way to render only a specific rectangle of the page. PDFBox提供了呈现整个页面的功能,但没有办法仅呈现页面的特定矩形。
It seems the only way to achieve that would be to use PDFRenderer.renderPageToGraphics
and configure the Graphics2D
object so only the region of interest is rendered, but I can't figure out how to do that. 看来,实现此目标的唯一方法是使用
PDFRenderer.renderPageToGraphics
并配置Graphics2D
对象,以便仅呈现感兴趣的区域,但是我不知道该怎么做。
Another way would be to render the whole page, then extract a sub-image, but I would like to avoid this. 另一种方法是渲染整个页面,然后提取一个子图像,但是我想避免这种情况。
So, it was a bit easier than I initially thought. 因此,这比我最初想象的要容易一些。
Here is Groovy code to do that. 这是执行此操作的Groovy代码。
import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.rendering.PDFRenderer
import javax.imageio.ImageIO
import java.awt.*
import java.awt.geom.AffineTransform
import java.awt.geom.Rectangle2D
import java.awt.image.BufferedImage
import java.awt.image.RenderedImage
class RegionPDFRenderer {
private static final int POINTS_IN_INCH = 72
private final PDDocument document
private final PDFRenderer renderer
private final int resolutionDotPerInch
RegionPDFRenderer(PDDocument document, int resolutionDotPerInch) {
this.document = document
this.renderer = new PDFRenderer(document)
this.resolutionDotPerInch = resolutionDotPerInch
}
RenderedImage renderRect(int pageIndex, Rectangle2D rect) {
BufferedImage image = createImage(rect)
Graphics2D graphics = createGraphics(image, rect)
renderer.renderPageToGraphics(pageIndex, graphics)
graphics.dispose()
image
}
private BufferedImage createImage(Rectangle2D rect) {
double scale = resolutionDotPerInch / POINTS_IN_INCH
int bitmapWidth = rect.width * scale
int bitmapHeight = rect.height * scale
new BufferedImage(bitmapWidth, bitmapHeight, BufferedImage.TYPE_INT_RGB)
}
private Graphics2D createGraphics(BufferedImage image, Rectangle2D rect) {
double scale = resolutionDotPerInch / POINTS_IN_INCH
AffineTransform transform = AffineTransform.getScaleInstance(scale, scale)
transform.concatenate(AffineTransform.getTranslateInstance(-rect.x, -rect.y))
Graphics2D graphics = image.createGraphics()
graphics.setBackground(Color.WHITE)
graphics.setTransform(transform)
graphics
}
static void main(String[] args) {
String filePath = './input.pdf'
def pageIndex = 0
def region = new Rectangle(70, 472, 498, 289)
def resolutionForHiDPIScreenRendering = 220 /* dpi */
PDDocument doc = PDDocument.load(new File(filePath))
try {
def renderer = new RegionPDFRenderer(doc, resolutionForHiDPIScreenRendering)
def image = renderer.renderRect(pageIndex, region)
ImageIO.write(image, "png", new File("./output/image.png"))
} finally {
doc.close()
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.