当前位置: 首页 > 知识库问答 >
问题:

无法使用PDPageContentStream绘制多个半圆

李捷
2023-03-14

我想使用pdfbox 1.8.2 c#包装器实现在矩形边界上绘制云的功能。我能够使用此链接中提到的代码绘制单个半圆。但问题是,我只能绘制单个半圆。当我尝试绘制多个相邻的半圆时,它不起作用。下面是我使用的代码。

(CreateSallarc()由Hans Muller编写,许可证:知识共享归因3.0。所做的更改:将原始代码实现为java。算法由Aleksas Riškus提出)

public void addCloud(PDRectangle rect,PDDocument doc)
            {
                PDGamma yellow = new PDGamma();
                yellow.setR(255);
                yellow.setG(255);
                yellow.setB(0);
                PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(pageNum);
                float width = 215;
                float height = 156;
                int noXSemiCircles = 21;
                int noYSemiCircles = 15;
                float leftX = 203;
                float bottomY = 424;
                int index = 0;
                PDPageContentStream cs = new PDPageContentStream(doc, page,true,false);
                Matrix mt = Matrix.getTranslatingInstance(leftX + (index * 10), bottomY);
                AffineTransform at = mt.createAffineTransform();
                cs.concatenate2CTM(at);
                cs.setStrokingColor(255, 0, 0);
                while (index<noXSemiCircles)
                {
                    cs.moveTo(leftX + (index * 10), bottomY);
                    DrawSlice(cs, 5, 180,270, true);
                    DrawSlice(cs, 5, 270, 360, false);
                    index++;
                }
                cs.stroke();
                cs.close();
                doc.save(System.IO.Path.Combine(FilePath));
                doc.close();
            }
             private void DrawSlice(PDPageContentStream cs, float rad, float startDeg, float endDeg,bool move)
            {
                try
                {
                    List<float> smallArc = CreateSmallArc(rad, ConvertDegreesToRadians(startDeg), ConvertDegreesToRadians(endDeg));
                    if (move)
                    {
                        cs.moveTo(smallArc[0], smallArc[1]);
                    }
                    cs.addBezier312(smallArc[2], smallArc[3], smallArc[4], smallArc[5], smallArc[6], smallArc[7]);
                }
                catch (Exception ex)
                {

                }
            }

共有1个答案

符畅
2023-03-14

concatenate2CTM()方法是相对于当前位置的,而不是绝对的。并将stroke()调用移到内部,否则它将不会显示在Adobe Reader中(PDFBox会显示它)。因此,请按如下方式更改代码:

    while (index < noXSemiCircles)
    {
        cs.saveGraphicsState();
        Matrix mt = Matrix.getTranslatingInstance(leftX + (index * 10), bottomY);
        AffineTransform at = mt.createAffineTransform();
        cs.concatenate2CTM(at);
        DrawSlice(cs, 5, 180, 270, true);
        DrawSlice(cs, 5, 270, 360, true);
        cs.stroke();
        cs.restoreGraphicsState();
        index++;
    }

这就是我得到的:

 类似资料:
  • 我在想哪里出了问题。我以前做过这个,但由于某种原因,这次我不能让它工作。 我用Netbeans设计了这个项目。最相关的部分是initTiras方法,它被认为可以绘制一些东西,但它没有。我包含了NetBeans生成的代码。 这是代码的最简化版本,但它仍然没有绘制任何内容。 所以我在项目中创建了一个新的框架。然后我把一个JPanel放进去(在设计模式下)。JPanel称为ElPanel和JFrame

  • 问题内容: 我知道熊猫支持次要Y轴,但我很好奇是否有人知道将三次Y轴放置在地块上的方法。目前,我正在用numpy + pyplot来实现这一点,但是对于大数据集来说它的速度很慢。 这是为了在同一张图上绘制具有不同单位的不同测量值,以便于比较(例如,相对湿度/温度/和电导率) 所以真的很好奇是否有人在没有太多工作的情况下就能做到这一点。 [编辑]我怀疑是否有办法做到这一点(没有太多的开销),但是我希

  • 本文向大家介绍python使用matplotlib:subplot绘制多个子图的示例,包括了python使用matplotlib:subplot绘制多个子图的示例的使用技巧和注意事项,需要的朋友参考一下 数据可视化的时候,常常需要将多个子图放在同一个画板上进行比较,python 的matplotlib包下的subplot可以帮助完成子功能。 part1 绘制如下子图 其中: plt.figure(

  • 如何连接多点与流动曲线,使用PyQt5?例如,我试图使用quitTo()对8个点执行此操作,使用交替点作为控制点,但弧不接触控制点(见下面的代码和图表)。我也尝试使用cubicTo(),但这也导致了一个奇怪的曲线。use是否有任何其他函数调用,我应该使用,或自定义的方式来做到这一点?

  • 问题内容: 我正在尝试制作一个在鼠标本地化处绘制一个圆的简单Java程序,它获取了鼠标的X和Y坐标,但是它没有绘制任何内容,我试图绘制一个String,一个圆和一条线,但是没有任何效果,我稍微修改了代码,但仍然无法正常工作 问题答案: 不要直接在上执行自定义绘画。如果可以,请始终在替代方法上进行操作。 为此,请勿使用无限循环。有用于Mouse Motion收听的

  • 问题内容: 我有一个我想解决的GUI问题,但是我对所发生的事情感到困惑,希望你们中的一个能解释一下。代码太大了,无法上传,但是我将详细解释发生了什么: 我有一堂课,里面有秋千。我有一些getter和setter方法来更改我喜欢的标准,但是问题来了。 ProgressBar在方法内部产生 实质上,当用户单击此按钮时,处理开始并生成。 用户当前在他们前面有一个,并且该进度条在中弹出。在Netbeans