package com.yaoyicloud.render.test;

import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.parser.PdfTextExtractor;
import com.yaoyicloud.tools.OfficeUtil;
import fr.opensagres.poi.xwpf.converter.core.FileImageExtractor;
import fr.opensagres.poi.xwpf.converter.core.FileURIResolver;
import fr.opensagres.poi.xwpf.converter.core.ImageManager;
import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLConverter;
import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Entities;
import org.jsoup.select.Elements;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.awt.*;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestPdf {

    /**
     * 使用poi+itextpdf进行word转pdf 先将word转成html，再将html转成pdf
     */
    @SuppressWarnings("checkstyle:UncommentedMain")
    public static void main(String[] args) throws Exception {

        String basePath = "C:\\Users\\yyy\\Desktop";
        String docxPath = basePath + "\\ccc.docx";
        String pdfPath = basePath + "ccc.pdf";
        String imageDir = "D:\\li312\\Desktop\\image";

        String docxHtml = convert(
                "C:\\Users\\yyy\\dev\\yyc3\\easier-be\\temp\\1932256473198157826_1e0c248426e94a6da07285ce36b2eaff.docx",
                "C:\\Users\\yyy\\dev\\yyc3\\easier-be\\file\\image");
        // String docxHtml = convert("C:\\Users\\yyy\\dev\\yyc3\\easier-be\\temp\\1922178317200191489_d60ec021eb6b497eb6360ea8d78d8245.docx",
        // "C:\\Users\\yyy\\dev\\yyc3\\easier-be\\file\\image");
        // String docxHtml = convert("C:\\Users\\yyy\\Documents\\WXWork\\1688856358659369\\Cache\\File\\2025-04\\cso.docx",
        // "C:\\Users\\yyy\\dev\\yyc3\\easier-be\\file\\image");
        try (BufferedWriter writer2 = new BufferedWriter(new FileWriter("3.html"))) {
            writer2.write(docxHtml);
        } catch (IOException e) {
            System.err.println("写入 2.html 文件时发生错误: " + e.getMessage());
            e.printStackTrace();
        }

        String docxHtml1 = OfficeUtil.formatHtml(docxHtml);
        try (BufferedWriter writer1 = new BufferedWriter(new FileWriter("1.html"))) {
            writer1.write(docxHtml1);
        } catch (IOException e) {
            System.err.println("写入 1.html 文件时发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    //    convertHtmlToPdf(docxHtml1, "./output.pdf");
//
//        convertHtmlToPdf2(docxHtml, "./output2.pdf");

    }

    private static Map<String, Integer> pageNumberMap = new LinkedHashMap<>();

    /**
     * 将docx转为html
     *
     * @param docxPath 输入docx文件路径
     * @return 生成的HTML内容
     */
    // 日志记录器
    private static final org.slf4j.Logger OFFICE_UTIL_LOGGER  = org.slf4j.LoggerFactory.getLogger(TestPdf.class);


    public static String convert(String docxPath, String imageDir) throws IOException {
        File imageDirFile = new File(imageDir);
        if (!imageDirFile.exists() && !imageDirFile.mkdirs()) {
            throw new IOException("无法创建图片目录: " + imageDir);
        }

        try (InputStream docxIn = new FileInputStream(docxPath);
             XWPFDocument document = new XWPFDocument(docxIn);
             ByteArrayOutputStream htmlOut = new ByteArrayOutputStream()) {

            // 执行转换
            XHTMLOptions options = createHtmlOptions(imageDirFile);
            XHTMLConverter.getInstance().convert(document, htmlOut, options);

            return htmlOut.toString("UTF-8");
        } catch (Exception e) {
            OFFICE_UTIL_LOGGER.error("转换失败: {}", e.getMessage(), e);
            throw new IOException("DOCX转换失败", e);
        }
    }


    /**
     * 创建HTML转换选项
     */
    private static XHTMLOptions createHtmlOptions(File imageDirFile) {
        @SuppressWarnings("deprecation")
        XHTMLOptions options = XHTMLOptions.create()
                .setImageManager(new ImageManager(imageDirFile, "") {
                    @Override
                    public String resolve(String uri) {
                        return new File(imageDirFile, uri).getAbsolutePath().replace("/", "\\");
                    }
                })
                .URIResolver(new FileURIResolver(imageDirFile) {
                    @Override
                    public String resolve(String uri) {
                       // String filename = uri.replace("word/media/", "");
                        return new File(imageDirFile, uri).getAbsolutePath().replace("/", "\\");
                    }
                });

        options.setIgnoreStylesIfUnused(false);
        options.setExtractor(new FileImageExtractor(imageDirFile));
        return options;
    }

    /**
     * 使用jsoup规范化html
     *
     * @param html html内容
     * @return 规范化后的html
     */

//    public static String formatHtml(String html,boolean flag) {
//        Document doc = Jsoup.parse(html);
//
//        removeEmptyParagraphs(doc);
//        Elements images = doc.select("img");
//        Element firstImg = images.first();
//        // 4. 删除第一个img元素
//        firstImg.parent().remove();
//        String baseCss = "@page {"
//                + "  size: A4;"
//                + "}"
//                + "body { font-family: 思源黑体; }"
//                + "table {"
//                + "  width: 100%;"
//                + "  border-collapse: collapse;"
//                + "  page-break-inside: auto;"
//                + "  -fs-table-paginate: paginate;"
//                + "}"
//                + "thead {"
//                + "  display: table-header-group;"
//                + "}"
//                + "td, th {"
//                + "  -fs-table-paginate: paginate;"
//                + "  background-clip: padding-box;"
//                + "  -webkit-print-color-adjust: exact;"
//                + " page-break-inside: avoid; /* 防止单元格跨页 */"
//                + "}"
//                + ".avoid-break {"
//                + "  break-inside: avoid;"
//                + "  page-break-inside: avoid;"
//                + "}"
//                + "p.X1.X2 {"
//                + "  -fs-pdf-bookmark-level: 1;"
//                + "  -fs-pdf-bookmark-open: true;"
//                + "}"
//                + "p.X1.X3 {"
//                + "  -fs-pdf-bookmark-level: 2;"
//                + "}";
//
//        doc.head().appendElement("style").text(baseCss);
//
//        Elements trs = doc.select("tr");
//        for (Element tr : trs) {
//            String trStyle = tr.attr("style");
//            trStyle = (trStyle == null) ? "" : trStyle;
//            trStyle += " page-break-inside: avoid !important;"; // 强制不
//            tr.attr("style", trStyle);
//        }
//
//        processTableCells(doc);
//        Elements divs = doc.select("div");
//        divs.attr("style", "");
//        addTableOfContents(doc,flag);
//
//        // 7. 处理特殊span元素
//        Elements spans = doc.select("span.X1.X2");
//        for (Element span : spans) {
//            String style = span.attr("style");
//            style = style.replaceAll("margin-left:\\s*[^;]+;?", "");
//            if (!span.text().contains("重要声明")) {
//                style += "color:#1677ff; ";
//            }
//            span.attr("style", style);
//        }
//        // 8. 一级标题前分页样式
//        Elements paragraphs = doc.select("p.X1.X2");
//        for (Element p : paragraphs) {
//            p.attr("style", p.attr("style") + "page-break-before:always;");
//        }
//
//        processTables(doc);
//        doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
//        doc.outputSettings().escapeMode(Entities.EscapeMode.xhtml);
//        doc.head().prepend("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
//
//        return doc.html();
//    }

    public static String formatHtml(String html,boolean flag) {
        Document doc = Jsoup.parse(html);
        Elements pTags = doc.select("p");
        for (Element p : pTags) {
            boolean isValidEmpty = true;

            for (org.jsoup.nodes.Node child : p.childNodes()) {
                if (child instanceof Element) {
                    if (!((Element) child).tagName().equalsIgnoreCase("br")) {
                        isValidEmpty = false;
                        break;
                    }
                } else {
                    if (!child.outerHtml().trim().isEmpty()) {
                        isValidEmpty = false;
                        break;
                    }
                }
            }
            if (isValidEmpty) {
                p.attr("style", "line-height: 25px;");
            }
        }
        Integer startpage = pageNumberMap.getOrDefault("startpage", 0);

        String baseCss =
                "@page {" +
                        "  size: A4;" +
                        "  @bottom-center {" +
                        "    content: none;" +  // 只显示数字页码
                        "    font-family: 思源黑体;" +
                        "    font-size: 10pt;" +
                        "    color: #000000;" +
                        "  }" +
                        "}" +
                        "@page show-page-number {" +
                        "  @bottom-center {" +
                        "    content: counter(page);" +
                        "    font-family: 思源黑体;" +
                        "    font-size: 10pt;" +
                        "    color: #000000;" +
                        "  }" +
                        "  counter-reset: page 1;" +  // 关键！在这里重置页码
                        "}" +

                // 为最后一个div设置页码显示并重置计数器
                ".start-counting {" +
                "  page: show-page-number;" +
                "  counter-reset: page 1;" +  // 重置页码从1开始
                "}"
//                        // 隐藏 startpage 之前的所有页码
//                        "@page :nth(1-5) {" +
//                        "  @bottom-center { content: none; }" +
//                        "}" +
//                        // 重置计数器，使 startpage 页显示为1
//                        "@page :nth(8) {" +
//                        "  -fs-counter-reset: page 0;" +  // 从0开始计数，下一页就是1
//                        "}"


                + "td, th { "
                + "  page-break-inside: avoid; "  // 尽量保持单元格不分页
                + "  -fs-table-paginate: paginate; "  // 允许分页
                + "  background-clip: padding-box; "  // 确保背景色覆盖
                + "  -webkit-print-color-adjust: exact; "  // 确保打印时颜色准确
                + "}";
        Elements table = doc.select("table");
        String tbaleStyle = table.attr("style");
        tbaleStyle += "width:100%;";
        table.attr("style", tbaleStyle);

        Elements trs = doc.select("tr");
        for (Element tr : trs) {
            String trStyle = tr.attr("style");
            trStyle = (trStyle == null) ? "" : trStyle;
            trStyle += " page-break-inside: avoid !important;"; // 强制不分页
            tr.attr("style", trStyle);
        }
        doc.head().appendElement("style").text(baseCss);
        Elements tds = doc.select("td");
        for (Element td : tds) {
            Elements ps = td.select("p");
            if (ps.size() > 1) {
                for (int i = 1; i < ps.size(); i++) {
                    ps.get(i).remove();
                }
                Element p = ps.first();
                String pStyle = p.attr("style");
                pStyle = removeWhiteSpacePreWrap(pStyle);
                pStyle += " display: table-cell; vertical-align: middle;";
                p.attr("style", pStyle);
            }

            if (ps.size() > 0) {
                Element p = ps.first();
                String pStyle = p.attr("style");
                pStyle = removeWhiteSpacePreWrap(pStyle);
                p.attr("style", pStyle);

                Elements spans = p.select("span");
                if (!spans.isEmpty()) {
                    for (Element span : spans) {
                        String spanStyle = span.attr("style");
                        spanStyle = removeWhiteSpacePreWrap(spanStyle);
                        spanStyle = (spanStyle == null) ? "" : spanStyle;
                        spanStyle += " margin-left: 0.5em;";
                        span.attr("style", spanStyle);
                    }
                } else {
                    String oriPstyle = p.attr("style");
                    oriPstyle = removeWhiteSpacePreWrap(oriPstyle);
                    p.attr("style", oriPstyle + " margin-left: 0.5em;");
                }
            }

            String oristyle = td.attr("style");
            oristyle = (oristyle == null) ? "" : oristyle;
            oristyle += " border-collapse: collapse; border: 0.75pt solid #E3EDFB;";
            oristyle += " background-clip: padding-box; break-inside: avoid !important; page-break-inside: avoid";
            td.attr("style", oristyle);
        }
        Elements divs = doc.select("div");
        divs.attr("style", "");
divs.last().addClass("start-counting");
    //    divs.last().attr("style", "-fs-page-sequence:start");
        Elements images = doc.select("img");
        Element firstImg = images.first();
        // 4. 删除第一个img元素
        firstImg.parent().remove();
        // 方法二：将所有 white-space:pre-wrap 改为 normal去除转换时的奇怪空白
        Elements allElements = doc.getAllElements();

        for (Element element : allElements) {
            String style = element.attr("style");
            if (style.contains("white-space:pre-wrap")) {
                style = style.replaceAll("white-space\\s*:\\s*[^;]+;", "");
                element.attr("style", style);
            }
        }
        // 7. 处理特殊span元素
        Elements spans = doc.select("span.X1.X2");
        for (Element span : spans) {
            String style = span.attr("style");
            style = style.replaceAll("margin-left:\\s*[^;]+;?", "");
            if (!span.text().contains("重要声明")) {
                style += "color:#1677ff; ";
            }
            span.attr("style", style);
        }
        // 8. 一级标题前分页样式
        Elements paragraphs = doc.select("p.X1.X2");
        for (Element p : paragraphs) {
            p.attr("style", p.attr("style") + "page-break-before:always;");
        }

        addTableOfContents(doc,flag);

        doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
        doc.outputSettings().escapeMode(Entities.EscapeMode.xhtml);
        doc.head().prepend("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");

        return doc.html();
    }
    /**
     * 删除空白段落 清除因转换出的空白段落造成的空白页
     * @param doc
     */
    private static void removeEmptyParagraphs(Document doc) {
        Elements pTags = doc.select("p");
        for (Element p : pTags) {
            boolean isValidEmpty = true;

            for (org.jsoup.nodes.Node child : p.childNodes()) {
                if (child instanceof Element) {
                    if (!((Element) child).tagName().equalsIgnoreCase("br")) {
                        isValidEmpty = false;
                        break;
                    }
                } else {
                    if (!child.outerHtml().trim().isEmpty()) {
                        isValidEmpty = false;
                        break;
                    }
                }
            }

            if (isValidEmpty) {
                p.attr("style", "line-height: 25px;");            }
        }
    }

    /**
     * 添加目录
     * @param doc
     */
    private static void addTableOfContents(Document doc,boolean flag) {
        if (flag) {
            // 目录样式
            String tocCss = ".toc-container { margin: 20px 0; font-family: 思源黑体; }"
                    + ".toc-title { text-align: center; font-size: 18pt; margin-bottom: 15px; color: black; }"
                    + ".toc-list { list-style-type: none; padding: 0; width: 100%; }"
                    + ".toc-item { margin: 5px 0;     padding-top: 2px; padding-bottom: 2px;       line-height: 2;  }"
                    + ".toc-level-1 { padding-left: 0; }"
                    + ".toc-level-2 { padding-left: 2em; }"
                    + ".toc-link { "
                    + "  display: block; "
                    + "  position: relative; "
                    + "  color: black !important; "
                    + "  text-decoration: none !important; "
                    + "  line-height: 1.5; "  // 新增：控制整体行高
                    + "}"
                    + ".toc-line-container { "
                    + "  display: table; "
                    + "  width: 100%; "
                    + "  vertical-align: middle; "  // 关键：控制容器内垂直对齐
                    + "}"
                    + ".toc-text { "
                    + "  display: table-cell; "
                    + "  font-size: 9pt; "
                    + "  white-space: nowrap; "
                    + "  padding-right: 5px; "
                    + "  vertical-align: middle; "  // 改为middle对齐
                    + "}"
                    + ".toc-dots { "
                    + "  display: table-cell; "
                    + "  width: 100%; "
                    + "  vertical-align: middle; "  // 关键：改为middle对齐
                    + "  border-bottom: 1px dotted #000000; "
                    + "  height: 1em; "  // 固定高度
                    + "  margin-top: 2px; "  // 关键：正值下移，负值上移（按需调整）
                    + "}"
                    + "p.X1.X2 { -fs-pdf-bookmark: level 1; }"
                    + "p.X1.X3 { -fs-pdf-bookmark: level 2; }"
                     +  ".toc-page { "
                    + "  display: table-cell; "
                    + "  font-size: 9pt; "
                    + "  white-space: nowrap; "
                    + "  padding-left: 5px; "
                    + "  vertical-align: middle; "  // 改为middle对齐
                    + "}";
            doc.head().appendElement("style").text(tocCss);

            // 构建目录内容
            Element tocList = new Element("ul").addClass("toc-list");
            doc.select("p.X1.X2, p.X1.X3").forEach(el -> {
                boolean isLevel1 = el.hasClass("X2");
                String id = "sec_" + el.text().hashCode();

                el.attr("id", id);
                System.out.println(el.text());
                Integer pageNumber = pageNumberMap.getOrDefault(el.text(), 0);

                Element li = tocList.appendElement("li")
                        .addClass("toc-item " + (isLevel1 ? "toc-level-1" : "toc-level-2"));

                Element link = li.appendElement("a")
                        .attr("href", "#" + id)
                        .addClass("toc-link");

                // 使用表格布局替代flex
                Element lineContainer = link.appendElement("div").addClass("toc-line-container");



                lineContainer.appendElement("span").addClass("toc-text").text(el.text());


                lineContainer.appendElement("span").addClass("toc-dots");
                lineContainer.appendElement("span").addClass("toc-page").text(String.valueOf(pageNumber));
            });

            // 插入目录
            Element firstDiv = doc.select("div").first();
            if (firstDiv != null) {
                firstDiv.after(
                        "<div class='toc-container' style='page-break-before: always;'>"
                                + "<h1 class='toc-title'>目录</h1>"
                                + tocList.outerHtml()
                                + "</div>"
                );
            } else {
                doc.body().prepend(
                        "<div class='toc-container' style='page-break-before: always;'>"
                                + "<h1 class='toc-title'>目录</h1>"
                                + tocList.outerHtml()
                                + "</div>"
                );
            }
        }

    }

    /**
     * 处理表格单元格样式
     * @param doc
     */
    private static void processTableCells(Document doc) {
        Elements tds = doc.select("td");
        for (Element td : tds) {
            Elements ps = td.select("p");
            if (ps.size() > 1) {
                for (int i = 1; i < ps.size(); i++) {
                    ps.get(i).remove();
                }
                Element p = ps.first();
                String pStyle = p.attr("style");
                pStyle = removeWhiteSpacePreWrap(pStyle);
                pStyle += " display: table-cell; vertical-align: middle;";
                p.attr("style", pStyle);
            }

            if (ps.size() > 0) {
                Element p = ps.first();
                String pStyle = p.attr("style");
                pStyle = removeWhiteSpacePreWrap(pStyle);
                p.attr("style", pStyle);

                Elements spans = p.select("span");
                if (!spans.isEmpty()) {
                    for (Element span : spans) {
                        String spanStyle = span.attr("style");
                        spanStyle = removeWhiteSpacePreWrap(spanStyle);
                        spanStyle = (spanStyle == null) ? "" : spanStyle;
                        spanStyle += " margin-left: 0.5em;";
                        span.attr("style", spanStyle);
                    }
                } else {
                    String oriPstyle = p.attr("style");
                    oriPstyle = removeWhiteSpacePreWrap(oriPstyle);
                    p.attr("style", oriPstyle + " margin-left: 0.5em;");
                }
            }

            String oristyle = td.attr("style");
            oristyle = (oristyle == null) ? "" : oristyle;
            oristyle += " border-collapse: collapse; border: 0.75pt solid #E3EDFB;";
            oristyle += " background-clip: padding-box; break-inside: avoid !important; page-break-inside: avoid";
            td.attr("style", oristyle);
        }
    }
    /**
     * 处理表格头
     * @param doc
     */
    @SuppressWarnings("checkstyle:NestedIfDepth")
    private static void processTables(Document doc) {
        Elements tables = doc.select("table");
        tables.attr("style", tables.attr("style") + "width:100%;");

        for (Element table : tables) {
            Elements tbody = table.select("tbody");
            if (!tbody.isEmpty()) {
                Elements rows = tbody.select("tr");
                if (rows.size() >= 2) {
                    Element firstRow = rows.get(0);
                    Element secondRow = rows.get(1);

                    Element firstCell = firstRow.selectFirst("td, th");
                    String firstCellText = "";

                    if (firstCell != null) {
                        firstCellText = firstCell.text().trim();
                        Element span = firstCell.selectFirst("span");
                        if (span != null && "科目".equals(span.text().trim())) {
                            boolean secondRowIsHeader = isHeaderRow(secondRow);
                            if (secondRowIsHeader) {
                                Element thead = table.prependElement("thead").addClass("table-header");
                                thead.appendChild(firstRow.clone());
                                thead.appendChild(secondRow.clone());
                                firstRow.remove();
                                secondRow.remove();
                                continue;
                            }
                        }
                    }

                    if (isHeaderRow(firstRow)) {
                        Element thead = table.prependElement("thead").addClass("table-header");
                        thead.appendChild(firstRow.clone());
                        firstRow.remove();
                    }
                }
            }

            for (Element td : table.select("td")) {
                td.addClass("avoid-break");
            }
        }
    }

    /**
     *     移除 white-space:pre-wrap 并替换为 normal
     */
    private static String removeWhiteSpacePreWrap(String style) {
        if (style == null) {
            return "";
        }
        // 替换 pre-wrap 为 normal，并去除多余的分号
        style = style.replaceAll("white-space\\s*:\\s*pre-wrap\\s*;?", "");
        style = style.replaceAll(";\\s*;", ";"); // 清理多余分号
        if (!style.contains("white-space")) {
            style += " white-space: normal;";
        }
        return style.trim();
    }

    /**
     * 检查行是否为表头（所有单元格使用"思源黑体"）
     */
    private static boolean isHeaderRow(Element row) {
        Elements tds = row.select("td");
        for (Element td : tds) {
            // 跳过空单元格（可能是合并单元格的占位）
            if (td.text().trim().isEmpty()) {
                continue;
            }

            Element span = td.select("p > span").first();
            if (span == null || !hasFontFamily(span, "思源黑体", false)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 检查元素的 style 属性中是否包含指定的 font-family
     */
    private static final Pattern FONT_FAMILY_PATTERN = Pattern.compile(
            "font-family\\s*:\\s*'?(思源黑体)([^'\";]*)'?");

    private static boolean hasFontFamily(Element element, String fontFamily, boolean allowWeight) {
        if (element == null) {
            return false;
        }

        String style = element.attr("style");
        Matcher matcher = FONT_FAMILY_PATTERN.matcher(style);

        if (matcher.find()) {
            String baseFont = matcher.group(1);  // 捕获的基础字体名（如"思源黑体"）
            String weightSuffix = matcher.group(2);  // 捕获的字重后缀（可能为空）

            // 如果不允许字重后缀，则必须完全匹配
            return baseFont.equals(fontFamily) && (!allowWeight ? weightSuffix.isEmpty() : true);
        }
        return false;
    }


    public static void convertHtmlToPdf(String html, String outputPdfPath) throws Exception {
        try (OutputStream os = new FileOutputStream(outputPdfPath)) {
            ITextRenderer renderer = new ITextRenderer();
            ITextFontResolver fontResolver = renderer.getFontResolver();

            // 字体路径
            String mediumFont = "C:/Users/yyy/AppData/Local/Microsoft/Windows/Fonts/SourceHanSansSC-Medium-2.otf";
            String boldFont = "C:/Users/yyy/AppData/Local/Microsoft/Windows/Fonts/SourceHanSansSC-Bold-2.otf";

            // 注册字体并强制指定别名为 "思源黑体"
            fontResolver.addFont(
                    mediumFont,                // 字体文件路径
                    "思源黑体",                 // fontFamilyNameOverride：覆盖默认字体名
                    BaseFont.IDENTITY_H,       // 编码（必须用于中文）
                    true,                      // 是否嵌入PDF
                    null                       // PFB路径（仅AFM/PFM字体需要）
            );

            fontResolver.addFont(
                    boldFont,
                    "思源黑体 Medium",
                    BaseFont.IDENTITY_H,
                    true,
                    null
            );
            html = html.replace("C:\\", "file:///C:/")
                    .replace("\\", "/");
            // 设置HTML（确保CSS中使用相同的font-family）
            renderer.setDocumentFromString(html, "file:///");
            // 渲染PDF
            renderer.layout();
            renderer.createPDF(os);
        }
        addBackgroundToPdf(outputPdfPath,"./ou.pdf","C:\\Users\\yyy\\dev\\yyc3\\easier-be\\file\\image\\image1.jpeg");

    }

    public static void convertHtmlToPdf2(String html, String outputPdfPath) throws Exception {
        String s = formatHtml(html, true);

        try (OutputStream os = new FileOutputStream(outputPdfPath)) {
            ITextRenderer renderer = new ITextRenderer();
            ITextFontResolver fontResolver = renderer.getFontResolver();

            // 字体路径
            String mediumFont = "C:/Users/yyy/AppData/Local/Microsoft/Windows/Fonts/SourceHanSansSC-Medium-2.otf";
            String boldFont = "C:/Users/yyy/AppData/Local/Microsoft/Windows/Fonts/SourceHanSansSC-Bold-2.otf";

            // 注册字体并强制指定别名为 "思源黑体"
            fontResolver.addFont(
                    mediumFont,                // 字体文件路径
                    "思源黑体",                 // fontFamilyNameOverride：覆盖默认字体名
                    BaseFont.IDENTITY_H,       // 编码（必须用于中文）
                    true,                      // 是否嵌入PDF
                    null                       // PFB路径（仅AFM/PFM字体需要）
            );

            fontResolver.addFont(
                    boldFont,
                    "思源黑体 Medium",
                    BaseFont.IDENTITY_H,
                    true,
                    null
            );
            html = html.replace("C:\\", "file:///C:/")
                    .replace("\\", "/");

            // 设置HTML（确保CSS中使用相同的font-family）
            renderer.setDocumentFromString(s, "file:///");

            // 渲染PDF
            renderer.layout();
            renderer.createPDF(os);
        }

        addBackgroundToPdf(outputPdfPath,"./ou.pdf","C:\\Users\\yyy\\dev\\yyc3\\easier-be\\file\\image\\image1.jpeg");

    }


    private static void addBackgroundToPdf(String inputPdfPath, String outputPdfPath, String backgroundImagePath)
        throws Exception {
        PdfReader reader = new PdfReader(inputPdfPath);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdfPath));
        // 获取第一页
        PdfContentByte background = stamper.getUnderContent(1); // 在现有内容下方绘制
        int startPage = 0;
        // 加载背景图片
        Image image = Image.getInstance(backgroundImagePath);
        image.scaleAbsolute(PageSize.A4.getWidth(), PageSize.A4.getHeight()); // 撑满 A4
        image.setAbsolutePosition(0, 0); // 从 (0,0) 开始

        // 添加到第一页
        background.addImage(image);

        Pattern startPattern = Pattern.compile("^1\\.\\s+报告概述$");
        for (int pageNum = 1; pageNum <= reader.getNumberOfPages(); pageNum++) {
            String pageText = new PdfTextExtractor(reader).getTextFromPage(pageNum);
            String[] lines = pageText.split("\\r?\\n");
            for (String line : lines) {
                if (startPattern.matcher(line.trim()).matches()) {
                    startPage = pageNum;
                    pageNumberMap.put("startPage", startPage);
                }
            }
        }

        Pattern titlePattern = Pattern.compile(
            "^((\\d+)\\.\\s+|(\\d+\\.\\d+)\\s+)([\\u4e00-\\u9fa5a-zA-Z].*)$",
            Pattern.MULTILINE);
        Pattern specialPattern = Pattern.compile("^重要声明\\s*[:：]?\\s*(.*)$");
        for (int pageNum = startPage; pageNum <= reader.getNumberOfPages(); pageNum++) {
            String pageText = new PdfTextExtractor(reader).getTextFromPage(pageNum);
            String[] lines = pageText.split("\\r?\\n");
            for (int i = 0; i < lines.length; i++) {
                String line = lines[i].trim();
                if (line.isEmpty())
                    continue;
                if (line.startsWith("6.3 ISO体系认证证书或行业经营许可证")) {
                    String nextLine = (i + 1 < lines.length) ? lines[i + 1].trim() : "";
                    // 拼接当前行和下一行
                    line = line + (nextLine.isEmpty() ? "" :  nextLine);
                }
                Matcher matcher = titlePattern.matcher(line);
                if (matcher.matches()) {
                    pageNumberMap.put(line, pageNum - startPage + 1);
                    System.out.println("收集标题: " + line + " | 页码: " + pageNum);
                }

                if (line.startsWith("重要声明")) {
                    Matcher specialMatcher = specialPattern.matcher(line);
                    if (specialMatcher.matches()) {
                        pageNumberMap.put(line, pageNum - startPage + 1);
                        System.out.println("收集特殊标题: " + line + " | 页码: " + pageNum);
                        continue;
                    }
                }
            }
        }


        Pattern firstLevelTitlePattern = Pattern.compile("^(\\d+)\\.\\s+([\\u4e00-\\u9fa5a-zA-Z].*)$");
        Set<Integer> styledPages = new HashSet<>();
        startPage = pageNumberMap.get("startPage");
        for (Map.Entry<String, Integer> stringIntegerEntry : pageNumberMap.entrySet()) {
            String key = stringIntegerEntry.getKey();
            int value = stringIntegerEntry.getValue();
            if (firstLevelTitlePattern.matcher(key).find()) {
                styledPages.add(value + startPage-1);
            }
        }

        // 在识别出的页面添加标题样式
        for (Integer pageNum : styledPages) {
            if (pageNum < 1 || pageNum > reader.getNumberOfPages()) {
                continue;
            }
            PdfContentByte underContent = stamper.getUnderContent(pageNum);

            // 固定位置参数（可根据需要调整）
            float pageWidth = reader.getPageSize(pageNum).getWidth();
            float pageHeight = reader.getPageSize(pageNum).getHeight();
            float xPos = 50; // 左侧边距
            float yPos = pageHeight - 50; // 距离顶部50单位

            // 1. 绘制圆形背景
            underContent.saveState();
            underContent.setColorFill(new Color(210, 235, 255)); // 浅蓝色填充
            underContent.circle(
                    xPos ,  // 圆形中心X
                    yPos - 8,  // 圆形中心Y
                    10         // 半径
            );
            underContent.fill();
            underContent.restoreState();

            // 2. 绘制横线
            underContent.saveState();
            underContent.setColorStroke(new Color(0x16, 0x77, 0xFF)); // 浅蓝色线条
            underContent.setLineWidth(1.5f); // 线宽
            underContent.moveTo(xPos-10, yPos - 20); // 起点（左边界 + margin）
            underContent.lineTo(pageWidth -xPos+10 , yPos - 20);
            underContent.stroke();
            underContent.restoreState();

        }
        int lastPageIndex = reader.getNumberOfPages();
        String lastPageText = new PdfTextExtractor(reader).getTextFromPage(lastPageIndex);
        // 使用 selectPages 方法删除最后一页
        ArrayList<Integer> pagesToKeep = new ArrayList<>();
        for (int i = 1; i < lastPageIndex; i++) {
            pagesToKeep.add(i);
        }
        reader.selectPages(pagesToKeep);

        stamper.close();
        reader.close();
    }
}
