代码之家  ›  专栏  ›  技术社区  ›  tuscland

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

  •  4
  • tuscland  · 技术社区  · 10 年前

    PDFBox提供了渲染整个页面的功能,但无法仅渲染页面的特定矩形。

    看来实现这一目标的唯一途径是使用 PDFRenderer.renderPageToGraphics 并配置 Graphics2D 对象,所以只渲染感兴趣的区域,但我不知道如何做到这一点。

    另一种方法是渲染整个页面,然后提取子图像,但我希望避免这种情况。

    1 回复  |  直到 10 年前
        1
  •  4
  •   tuscland    10 年前

    所以,这比我最初想象的要容易一些。

    下面是实现这一点的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()
            }
        }
    
    }
    
    推荐文章