【问题标题】:How to render part of a page as an image using PDFBox?如何使用 PDFBox 将页面的一部分呈现为图像?
【发布时间】:2016-07-02 13:27:21
【问题描述】:

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

似乎实现这一目标的唯一方法是使用PDFRenderer.renderPageToGraphics 并配置Graphics2D 对象,以便只渲染感兴趣的区域,但我不知道该怎么做。

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

【问题讨论】:

    标签: java image pdf pdfbox


    【解决方案1】:

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

    这是执行此操作的 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()
            }
        }
    
    }
    

    【讨论】:

    • 别忘了处置你的图形对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2021-02-05
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多