pdfbox无法绘制贝塞尔曲线

时间:2015-08-18 05:39:04

标签: java pdfbox

我正在使用pdfbox的1.8版本。我试图在页面上绘制一条曲线,我对如何使用控制点绘制它有一些基本知识。所以我只是尝试绘制一条基本曲线,但没有任何东西出现。

我从以下代码行开始:

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

我还缺少什么吗?我似乎无法弄明白。

1 个答案:

答案 0 :(得分:2)

我没有尝试测试您的示例究竟出现了什么问题(请参阅我的问题下面的评论,但也可能有其他原因),但这里有一些代码可以满足您的需求:

    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();

enter image description here

更高级的东西:要填写你得到的东西,请使用以下代码:

    // 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 *的更多信息,请阅读PDF specification,然后从“运营商摘要”开始。

结果是: enter image description here