我现在使用 PDFBox,我尝试使用 PDPageContentStream 中的 fillAndStroke() 方法绘制一个具有大边框描边的多边形。 实际上,它适用于中心模式下的笔划(一半在多边形内部,一半在多边形外部)。
如何指定多边形的笔画类型inside或outside,就像我在JavaFX中使用此类代码所做的那样。
谢谢您的帮助。
// Create a polygon
Polygon polygon = new Polygon();
polygon.getPoints().addAll(
50.0, 150.0, // Point 1 (x, y)
150.0, 50.0, // Point 2 (x, y)
250.0, 150.0, // Point 3 (x, y)
150.0, 250.0 // Point 4 (x, y)
);
polygon.setFill(Color.LIGHTBLUE);
polygon.setStroke(Color.BLACK);
polygon.setStrokeWidth(3);
// Here we specify the stroke type to inside
polygon.setStrokeType(StrokeType.INSIDE);
我在文档中搜索帮助没有成功,目前我使用的PDFBox版本:2.0.25。
PDFBox 类
PDPageContentStream
提供的方法对应于 PDF 标准为内容流定义的操作。因此,您正在寻找的文档是 ISO 32000 零件。
不幸的是,您会发现 PDF 没有类似 JavaFX 的
StrokeType
选项。尽管如此,您可以使用剪辑路径来模拟效果,例如如下:
这是 PDF 始终使用的模式。因此,不需要剪辑路径:
canvas.moveTo(50, 150);
canvas.lineTo(150, 50);
canvas.lineTo(250, 150);
canvas.lineTo(150, 250);
canvas.closeAndFillAndStroke();
(DrawPolygons方法
drawPolygonCenterStroke
)
为了模拟这一点,我们沿着多边形边界设置一个剪辑路径。
canvas.saveGraphicsState();
canvas.moveTo(50, 150);
canvas.lineTo(150, 50);
canvas.lineTo(250, 150);
canvas.lineTo(150, 250);
canvas.closePath();
canvas.clip();
canvas.moveTo(50, 150);
canvas.lineTo(150, 50);
canvas.lineTo(250, 150);
canvas.lineTo(150, 250);
canvas.closeAndFillAndStroke();
canvas.restoreGraphicsState();
(DrawPolygons方法
drawPolygonInsideStroke
)
为了模拟这一点,我们首先填充整个多边形的内部,然后设置剪辑路径以包括除多边形之外的页面其余部分,最后描边多边形边框。
canvas.moveTo(50, 150);
canvas.lineTo(150, 50);
canvas.lineTo(250, 150);
canvas.lineTo(150, 250);
canvas.fill();
canvas.saveGraphicsState();
canvas.addRect(0, 0, 300, 300);
canvas.moveTo(50, 150);
canvas.lineTo(150, 50);
canvas.lineTo(250, 150);
canvas.lineTo(150, 250);
canvas.closePath();
canvas.clipEvenOdd();
canvas.moveTo(50, 150);
canvas.lineTo(150, 50);
canvas.lineTo(250, 150);
canvas.lineTo(150, 250);
canvas.closeAndStroke();
canvas.restoreGraphicsState();
(DrawPolygons方法
drawPolygonOutsideStroke
)
很明显,在内部和外部情况下,一半的描边线被切断。因此,要实现一定的笔画宽度,您必须将线宽设置为该值的两倍。