OpenHtmlToPdf工具rgba转rgb

本文讲述了在使用OpenHtmlToPdf工具将HTML转换为PDF时遇到的问题,即不识别rgba颜色属性导致颜色显示异常。作者提供了自定义的正则表达式和方法,将HTML中的rgba颜色转换为rgb格式以解决问题。
摘要由CSDN通过智能技术生成

使用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();
  }

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值