Java pdfbox无法绘制贝塞尔曲线

Java pdfbox无法绘制贝塞尔曲线,java,pdfbox,Java,Pdfbox,我使用的是pdfbox的1.8版。我试图在页面上绘制一条曲线,我有一些如何使用控制点绘制曲线的基本知识。所以我只是试着画一条基本曲线,但什么都没有出现 我从以下代码行开始: stream.setNonStrokingColor(155); stream.stroke(); stream.addBezier321(...); stream.closeAndStroke(); 有什么我遗漏的吗?我似乎不明白 我没有尝试测试您的示例到底出了什么问题(请参见问题下方我的评论,但也可能有其他原因),但下

我使用的是pdfbox的1.8版。我试图在页面上绘制一条曲线,我有一些如何使用控制点绘制曲线的基本知识。所以我只是试着画一条基本曲线,但什么都没有出现

我从以下代码行开始:

stream.setNonStrokingColor(155);
stream.stroke();
stream.addBezier321(...);
stream.closeAndStroke();

有什么我遗漏的吗?我似乎不明白

我没有尝试测试您的示例到底出了什么问题(请参见问题下方我的评论,但也可能有其他原因),但下面的一些代码可以满足您的需要:

    PDDocument doc = new PDDocument();
    PDPage pdpage = new PDPage();
    doc.addPage(pdpage);
    PDPageContentStream stream = new PDPageContentStream(doc, pdpage, false, false);

    // move stuff a bit up and right
    stream.concatenate2CTM(AffineTransform.getTranslateInstance(100, 400));

    stream.setStrokingColorSpace(PDDeviceRGB.INSTANCE);
    stream.setStrokingColor(Color.red);
    stream.setLineWidth(10f);
    stream.moveTo(1, 1);
    stream.addBezier32(111, 075, 200, 200);
    stream.addBezier32(352, 124, 80, 80);
    stream.addBezier32(432, 333, 300, 333);
    stream.stroke();

    stream.close();
    doc.save(filename);
    doc.close();

更高级的东西:要填充您得到的内容,请使用以下代码:

    // move stuff a bit up
    stream.concatenate2CTM(AffineTransform.getTranslateInstance(100, 400));

    stream.setStrokingColorSpace(PDDeviceRGB.INSTANCE);
    stream.setStrokingColor(Color.red);
    stream.setNonStrokingColorSpace(PDDeviceRGB.INSTANCE);
    stream.setNonStrokingColor(Color.blue);

    stream.setLineWidth(10f);
    stream.moveTo(1, 1);
    stream.addBezier32(111, 075, 200, 200);
    stream.addBezier32(352, 124, 80, 80);
    stream.addBezier32(432, 333, 300, 333);
    stream.addBezier32(234, 129, 200, 300);
    stream.closeSubPath();
    stream.appendRawCommands("\nB*\n"); // Fill and then stroke the path, using the even-odd rule
    // to use the nonzero winding number rule, use "B" instead of "B*"
要了解有关运算符B和B*的更多信息,请阅读,然后从“运算符摘要”开始

结果是:

嗯-您不应该设置笔划颜色吗?此外,请发布更多代码(即,您创建文档、内容流、页面),并画一条普通线。只是想看看有没有什么东西出现。如果不存在曲线,“stroke()”命令没有任何意义。我已经设置好了所有的页面,我已经能够用线条画出一个完整的矩形,并用颜色填充它。现在我正在尝试我的手在贝塞尔曲线。我想我们必须先调用stream.stroke()。然后添加曲线,最后调用stream.closeAndStroke();我最初的移动是addBezier321()。所以我从某个位置开始,给它最后一个点和一个控制点来绘制曲线。谢谢我想最后我不得不调用stroke(),我还有一个问题。我需要做一个椭圆,一旦我画了它,我如何用纯色填充它?另外,addBezier32()和addBezier31()之间有什么区别?请使用fill()。别忘了选择一种非笔划颜色。我会努力改进我的例子,以便有一些东西可以填补。谢谢蒂尔曼。我似乎无法理解addBezier32()和addBezier31()之间的区别?文档也没有多大帮助。对于不同的addBezier调用,我建议您阅读API文档和PDF规范(8.5.2.2立方Bézier曲线)。这涉及到一些数学问题。