【问题标题】:How to make Flying Saucer generate an image with transparent background?如何让飞碟生成背景透明的图片?
【发布时间】:2011-10-10 16:09:28
【问题描述】:

我正在使用 flysaucer 将 HTML 渲染为图像,使用 Java2DRenderer:

Map<Key,Object> renderingHints = new HashMap<Key,Object>();
renderingHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
renderingHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
renderingHints.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
hints = new RenderingHints(renderingHints);

Java2DRenderer renderer = new Java2DRenderer(dom, width, height);
renderer.setRenderingHints(renderingHints);
renderer.getSharedContext().setDPI(DPI);
renderer.setBufferedImageType(BufferedImage.TYPE_INT_ARGB);
img = renderer.getImage();

然后我将渲染的图像添加到 PDF 文档中,将其缩放以适合整个页面。

com.lowagie.text.Document pdf = new com.lowagie.text.Document(isLandscape ? PageSize.A4.rotate() : PageSize.A4);
pdf.setMargins(MARGIN, MARGIN, MARGIN, MARGIN);
Rectangle ps = pdf.getPageSize();
PdfWriter.getInstance(pdf, outputStream);
pdf.open();
com.lowagie.text.Image pdfImage = com.lowagie.text.Image.getInstance(img, null);
pdfImage.scaleAbsolute(
ps.getWidth() - pdf.leftMargin() - pdf.rightMargin(),
ps.getHeight() - pdf.topMargin() - pdf.bottomMargin()
);
pdf.add(pdfImage);
pdf.close();

问题是 FS 渲染的图像具有纯白色作为背景色......所以打印机用非常浅的灰色填充整个页面(我相信缩放会将纯白色转换为浅灰色)。

如何强制飞碟生成透明图像以避免此问题?

【问题讨论】:

    标签: pdf-generation alpha-transparency flying-saucer


    【解决方案1】:

    对于 Java2DRenderer,有一种方法是继承 Java2DRender

    final java.awt.Color TRANSPARENT = new Color(255, 255, 255, 0);
    final int imageType = BufferedImage.TYPE_INT_ARGB;
    final Java2DRenderer java2dRenderer = new Java2DRenderer(doc, width, height) {
        @Override
        protected BufferedImage createBufferedImage(final int width, final int height) {
            final BufferedImage image = org.xhtmlrenderer.util.ImageUtil.createCompatibleBufferedImage(width, height, imageType);
            org.xhtmlrenderer.util.ImageUtil.clearImage(image, TRANSPARENT);
            return image;
        }
    };
    java2dRenderer.setBufferedImageType(imageType);
    

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 2016-12-22
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2013-08-16
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多