如何使用 PDFBox 在 JavaFX Canvas 上绘制具有透明背景的 InDesign 文件?
How to draw an InDesign file with transparent background on a JavaFX Canvas using PDFBox?
我能够使用 PDF-Box 使用以下代码在 Java 生成的 .pdf 文件上绘制 InDesign 绘图:
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contents = new PDPageContentStream(document, page);
[...]
PDDocument doc = PDDocument.load(file);
PdfBoxGraphics2D pdfBoxGraphics2D = new PdfBoxGraphics2D(document, crop);
PDFRenderer r = new PDFRenderer(doc);
r.renderPageToGraphics(0, pdfBoxGraphics2D);
doc.close();
pdfBoxGraphics2D.dispose();
PDFormXObject xform = pdfBoxGraphics2D.getXFormObject();
contents.drawForm(xform);
现在我需要在 JavaFX 程序中的 Canvas(不必是 Canvas)上显示完全相同的绘图。我收到警告:
ICC profile is Perceptual, ignoring, treating as Display class
.ia 文件在 mac 上生成,Java-程序在 Windows.
上运行
FXGraphics2D 是 https://github.com/jfree/fxgraphics2d
到 fx.GraphicsContext 的 awt.Graphics2D 包装器
Canvas canvas = new Canvas();
PDDocument doc = PDDocument.load(file);
PDRectangle crop = doc.getPage(0).getCropBox();
canvas.setWidth(crop.getWidth());
canvas.setHeight(crop.getHeight());
PDFRenderer r = new PDFRenderer(doc);
FXGraphics2D g = new FXGraphics2D(canvas.getGraphicsContext2D());
r.renderPageToGraphics(0, g);
doc.close();
g.dispose();
vbContent.getChildren().add(canvas);
使用上面的代码我几乎看不到它被绘制,因为背景被涂成了黑色。我猜 .ia 文件有一个透明背景,但没有正确绘制?
我已经尝试在渲染前设置 canvas.getGraphicsContext2D().setGlobalBlendMode(BlendMode.SCREEN);
但没有效果。
嗯...找到了。
用于初始清除图形区域的标准背景色在 FXGraphics2D 中为黑色。
我在渲染之前添加了以下内容。 FX 颜色转换为 awt 颜色。我在评论James_D提供的link里找到了
Color bg = Color.TRANSPARENT;
java.awt.Color awtBg = new java.awt.Color(
(float)bg.getRed(),
(float)bg.getGreen(),
(float)bg.getBlue(),
(float)bg.getOpacity());
g.setBackground(awtBg);
我能够使用 PDF-Box 使用以下代码在 Java 生成的 .pdf 文件上绘制 InDesign 绘图:
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contents = new PDPageContentStream(document, page);
[...]
PDDocument doc = PDDocument.load(file);
PdfBoxGraphics2D pdfBoxGraphics2D = new PdfBoxGraphics2D(document, crop);
PDFRenderer r = new PDFRenderer(doc);
r.renderPageToGraphics(0, pdfBoxGraphics2D);
doc.close();
pdfBoxGraphics2D.dispose();
PDFormXObject xform = pdfBoxGraphics2D.getXFormObject();
contents.drawForm(xform);
现在我需要在 JavaFX 程序中的 Canvas(不必是 Canvas)上显示完全相同的绘图。我收到警告:
ICC profile is Perceptual, ignoring, treating as Display class
.ia 文件在 mac 上生成,Java-程序在 Windows.
上运行
FXGraphics2D 是 https://github.com/jfree/fxgraphics2d
Canvas canvas = new Canvas();
PDDocument doc = PDDocument.load(file);
PDRectangle crop = doc.getPage(0).getCropBox();
canvas.setWidth(crop.getWidth());
canvas.setHeight(crop.getHeight());
PDFRenderer r = new PDFRenderer(doc);
FXGraphics2D g = new FXGraphics2D(canvas.getGraphicsContext2D());
r.renderPageToGraphics(0, g);
doc.close();
g.dispose();
vbContent.getChildren().add(canvas);
使用上面的代码我几乎看不到它被绘制,因为背景被涂成了黑色。我猜 .ia 文件有一个透明背景,但没有正确绘制?
我已经尝试在渲染前设置 canvas.getGraphicsContext2D().setGlobalBlendMode(BlendMode.SCREEN);
但没有效果。
嗯...找到了。 用于初始清除图形区域的标准背景色在 FXGraphics2D 中为黑色。
我在渲染之前添加了以下内容。 FX 颜色转换为 awt 颜色。我在评论James_D提供的link里找到了
Color bg = Color.TRANSPARENT;
java.awt.Color awtBg = new java.awt.Color(
(float)bg.getRed(),
(float)bg.getGreen(),
(float)bg.getBlue(),
(float)bg.getOpacity());
g.setBackground(awtBg);