简体   繁体   English

如何使用PDFBox将页面的一部分呈现为图像?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM