首页 > 其他分享 >OpenHtmlToPdf工具rgba转rgb

OpenHtmlToPdf工具rgba转rgb

时间:2024-03-21 11:00:11浏览次数:20  
标签:String int matcher builder OpenHtmlToPdf rgb rgba new alpha

使用OpenHtmlToPdf工具将html转pdf时不识别html中的rgba属性,导致颜色显示出现问题

测试字符串

    String pdflFile = "/yourPath/ppm-3.pdf";
    FileOutputStream outputStream = new FileOutputStream(pdflFile);

    try (FileOutputStream fos = new FileOutputStream(pdflFile)) {
      PdfRendererBuilder builder = new PdfRendererBuilder();
      File fontFile = new File(
          "/yourPath/fonts/AlibabaSansSEA-Rg.ttf");

      Font font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
      System.out.println("Font Family: " + font.getFamily());
      builder.useFont(fontFile,
          "Alibaba Sans SEA");
      builder.toStream(fos);
      builder.useFastMode();
      String html = "<meta charset="UTF-8">"
+ "<h1 style ="font-family: 'BabelStoneHan',sans-serif;">中文HTML转PDF示例"
+ "这是一个包含中文的 HTML 内容。"
+ "<table style="width:100%; border-collapse: collapse;font-family: 'BabelStoneHan',sans-serif;">"
+ "<th style="border: 1px solid rgb(10, 18, 10); padding: 8px;font-family: 'BabelStoneHan',sans-serif;">表头1"
+ "<th style="border: 1px solid red; padding: 8px;">表头2"
+ "<th style="border: 1px solid rgba(0, 0, 0, 0.06); padding: 8px;">表头3"
+ "<td style="border: 1px solid black; padding: 8px;">数据1"
+ "<td style="border: 1px solid black; padding: 8px;">数据2"
+ "<td style="border: 1px solid black; padding: 8px;">数据3";
      builder.withHtmlContent(
          html,
          null);
      try {
        builder.run();
      } catch (Exception e) {
        e.printStackTrace();
      }
    } catch (FontFormatException e) {
      e.printStackTrace();
    }

问题官方反馈:https://github.com/danfickle/openhtmltopdf/issues/966

需要将rgba转成rgb格式

自己写了一个转换代码将html中的rgba替换成rgb

  public static final Color BACK_GROUND = new Color(255, 255, 255);
  /**
   * 定义匹配RGBA颜色的正则表达式
   */
  public static final String RGBA_REGEX = "rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d.]+)\\s*\\)";

  /**
   * 编译正则表达式
   */
  public static final Pattern PATTERN = Pattern.compile(RGBA_REGEX);

  public static String rgbaToRgb(String htmlString) {

    Matcher matcher = PATTERN.matcher(htmlString);

    // 替换匹配的RGBA颜色为RGB格式
    StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
      int red = Integer.parseInt(matcher.group(1));
      int green = Integer.parseInt(matcher.group(2));
      int blue = Integer.parseInt(matcher.group(3));
      // alpha
      float alpha = Float.parseFloat(matcher.group(4));
      red = (int) (red * alpha + BACK_GROUND.getRed() * (1 - alpha));
      green = (int) (green * alpha + BACK_GROUND.getGreen() * (1 - alpha));
      blue = (int) (blue * alpha + BACK_GROUND.getBlue() * (1 - alpha));
      // 将RGBA转换为RGB
      String rgbColor = "rgb(" + red + ", " + green + ", " + blue + ")";
      matcher.appendReplacement(sb, rgbColor);
    }
    matcher.appendTail(sb);
    return sb.toString();
  }

标签:String,int,matcher,builder,OpenHtmlToPdf,rgb,rgba,new,alpha
From: https://blog.csdn.net/weixin_41832394/article/details/136901660

相关文章

  • RGBLCD基本知识
    学习资料来源于网络https://www.bilibili.com/video/BV1yE411h7uQ?p=55&spm_id_from=pageDriver&vd_source=432ba293ecfc949a4174ab91ccc526d6https://doc.embedfire.com/linux/imx6/driver/zh/latest/bare_metal/elcdif.html# 基础概念:LCD:LiquidCrystalDisplay液晶是一......
  • 693、基于51单片机的RGB调色(PWM)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能采用PWM调制方式进行三基色LED配色控制的研究,实验证明其电路简单、操作方便,能很好的实现各种颜色的配置和切换使用6个按键分别......
  • Monitor test Philips 279P1B 4K 60FPS 10bit HDR400 99%-Adobe RGB, 99% P3, 99% SRG
    SoIboughtthismonitor.Thespecsarefromhere: https://www.usa.philips.com/c-p/279P1B_27/brilliance-lcd-monitor-with-usb-c ---wordsinshort,DP1.4,HDMI2.0,DP1.4viaUSB-CPD90WmaxWhenenablingUSB-Chigh-resolutionmode(10bit),withmym1......
  • Python教程:如何获取颜色的RGB值
    简介在许多计算机图形和图像处理应用中,颜色的RGB值是至关重要的信息。Python作为一种多功能的编程语言,提供了丰富的工具和库,可以轻松地获取颜色的RGB值。本文将介绍如何使用Python获取颜色的RGB值,以及一些实际应用的示例。使用PIL工具获取颜色的RGB值PIL(PythonImagingLibrar......
  • YUV与RGB转换公式(BT601、BT709、BT2020)
    1、在图像处理中经常需要对图像数据进行转换,最常见的莫过于YUV2RGB。并且这个转化在不同的标准下有不同的转化公式。2、如果公式不匹配,则会导致转换后的图像效果有偏差。3、full_range下Y\U\V的取值范围都为[0,255];limit_range(也叫part_range)下Y的取值范围为[16,235],UV的......
  • 通用定时器功能案例 RGB 直流电机 舵机 超声波
    复盘局:RGB彩灯:(定时器输出比较功能)        功能效果:按下按键1亮红灯 按下按键2亮绿灯 按下按键3亮蓝灯 按下按键4随机变色RGB彩灯原理:通过改变三个灯不同的亮度混合在一起形成不同的颜色总体配置思路:    1.初始化配置        {     ......
  • XADC采集外部信号实时显示在RGB屏幕中
    概述XADC在Xilinx7系列器件上可用。TheXADCisavailableinallArtix-7,Kintex-7,Virte-7,andZynq-7000SoCdevices.XADC需要例化使用,但是如果使用JTAG访问的话,就不需要例化,直接在Vivado软件中就可以直接访问XADC的各项数据,包括芯片温度、电压等数据。The......
  • RGBA中的阿尔法通道
    RGB颜色模型是一种基于红色(R)、绿色(G)、蓝色(B)三个颜色通道的加色模型,用于通过不同的颜色混合产生广泛的颜色。而在RGB模型基础上添加的阿尔法通道(Alphachannel)则用于表示透明度信息,可以控制颜色的不透明度或透明度,使得可以实现颜色的混合以及创建具有透明或半透明效果的图像。......
  • RGB和YCbCR 的420/444格式
    目录RGBYUVYCbCrRGBRGB图像具有三个通道R、G、B,分别对应红、绿、蓝三个分量,由三个分量的值决定颜色;通常,会给RGB图像加一个通道alpha,即透明度,于是共有四个分量共同控制颜色。那么对于一张1920*1080的图片,如果采用RGBA编码格式,这一张图片加载到内存并在设备中显示时,所占用的内......
  • [ARC121B] RGB Matching 题解
    题意有\(2N\)个物品,每个物品有可爱度\(a_i\)和颜色\(c_i\),将其两两配对。假设物体\(i\)和\(j\)配对,则\(c_i\neqc_j\),则会增加\(|a_i-a_j|\)的不满意度,求最小的不满意度。分析这道题可以贪心解决。我们尽量让每一对物品颜色相同,令每种颜色的总个数为\(cnt_c\),......