【问题标题】:Draw transparent lines with PDFBox用 PDFBox 画透明线
【发布时间】:2023-03-06 05:58:02
【问题描述】:

我想在 PDFBox 中用透明线绘制线条和多边形。这是我如何绘制蓝线的一些示例代码,但我无法弄清楚如何更改颜色的 alpha 值。

PDDocument document = new PDDocument();  
PDPage page = new PDPage();  
document.addPage(page);  
PDPageContentStream contentStream = new PDPageContentStream(document, page);  
contentStream.setStrokingColor(66, 177, 230);  
contentStream.drawLine(100, 100, 200, 200);  

【问题讨论】:

    标签: java pdfbox


    【解决方案1】:

    自 PDFBox 2.0 起,appendRawCommands 已弃用。

        float alpha = 0.5f;
        PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
        graphicsState.setStrokingAlphaConstant(alpha);
        stream.setGraphicsStateParameters(graphicsState);
        // draw line here
    

    【讨论】:

    • 不知何故这会导致 setGraphicsStateParameters() 中出现 NullPointerException
    • 流上为 null 还是 graphicsState 对象上为 null? GraphicsState 不应为 null,因为它正在那里初始化。
    • 内容流没有资源。这可能取决于代码,因为有时不需要资源,但是当内容流需要资源对象时,它应该自动实例化。解决方案是使用 stream.setResources(new PDResources());
    【解决方案2】:

    您可以通过使用自定义扩展图形状态来实现这一点:

    PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState(); graphicsState.setStrokingAlphaConstant(0.5f); COSName graphicsStateName = page.getResources().add(graphicsState); 尝试 (PDPageContentStream cs = new PDPageContentStream(document, page, true, true, true)) { cs.appendRawCommands("/" + graphicsStateName.getName() + "gs\n"); // 在这里画线。 }

    【讨论】:

      【解决方案3】:

      您不能使用 java.awt.Color 的 alpha 值,因为 PDFBox 仅使用 RGB 值。根据public void setStrokingColor(Color color)的javadoc,它只是:

      设置描边颜色,指定为 RGB。

      一种选择可能是将背景颜色设置为描边颜色以使线条不可见。 注意 - 不可见!= 透明(因此您不会获得透视效果)

      【讨论】:

      • 正如该问题的其他答案所表明的那样,即使使用 PDFBox,PDF 中的透明度也是可能的。
      猜你喜欢
      • 2021-09-22
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多