Как заставить летающую тарелку генерировать изображение с прозрачным фоном?

#pdf-generation #alpha-transparency #flying-saucer

#pdf-генерация #альфа-прозрачность #летающая тарелка

Вопрос:

Я использую flyingsaucer для рендеринга 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, имеет в качестве цвета фона сплошной белый … поэтому принтер заполняет всю страницу очень светло-серым цветом (я считаю, что масштабирование превращает сплошной белый цвет в светло-серый).

Как я могу заставить flyingsaucer генерировать прозрачное изображение, чтобы избежать этой проблемы?

Ответ №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);