How can I convert XHTML nested list to pdf with iText?

前端 未结 2 1496
情书的邮戳
情书的邮戳 2020-11-30 14:21

I have XHTML content, and I have to create from this content a PDF file on the fly. I use iText pdf converter. I tried the simple way, but I always get bad result after call

2条回答
  •  臣服心动
    2020-11-30 15:05

    Here's a workaround for nested ordered and un-ordered lists.

    The rich Text editor I am using giving the class attribute "ql-indent-1/2/2/" for li tags, based on the attribute adding ul/ol starting and ending tags.

    public String replaceIndentSubList(String htmlContent) {
        org.jsoup.nodes.Document document = Jsoup.parseBodyFragment(htmlContent);
        Elements element_UL = document.select("ul");
        Elements element_OL = document.select("ol");
        if (!element_UL.isEmpty()) {
            htmlContent = replaceIndents(htmlContent, element_UL, "ul");
        }
        if (!element_OL.isEmpty()) {
            htmlContent = replaceIndents(htmlContent, element_OL, "ol");
        }
        return htmlContent;
    }
    
    
    public String replaceIndents(String htmlContent, Elements element, String tagType) {
        String attributeKey = "class";
        String startingULTgas = "<" + tagType + ">";
        String endingULTags = "";
        int lengthOfQLIndenet = new String("ql-indent-").length();
        HashMap startingLiTagMap = new HashMap();
        HashMap lastLiTagMap = new HashMap();
        Pattern regex = Pattern.compile("ql-indent-\\d");
        HashSet hash_Set = new HashSet();
        Elements element_Tag = element.select("li");
        for (org.jsoup.nodes.Element element2 : element_Tag) {
            org.jsoup.nodes.Attributes att = element2.attributes();
            if (att.hasKey(attributeKey)) {
                String attributeValue = att.get(attributeKey);
                Matcher matcher = regex.matcher(attributeValue);
                if (matcher.find()) {
                    if (!startingLiTagMap.containsKey(attributeValue)) {
                        startingLiTagMap.put(attributeValue, element2.toString());
                    }
                    hash_Set.add(matcher.group(0));
                    if (!startingLiTagMap.get(attributeValue)
                            .equalsIgnoreCase(element2.toString())) {
                        lastLiTagMap.put(attributeValue, element2.toString());
                    }
                }
            }
        }
        System.out.println(htmlContent);
        Iterator value = hash_Set.iterator();
        while (value.hasNext()) {
            String liAttributeKey = (String) value.next();
            int noOfIndentes = Integer
                    .parseInt(liAttributeKey.substring(lengthOfQLIndenet));
            if (noOfIndentes > 1)
                for (int i = 1; i < noOfIndentes; i++) {
                    startingULTgas = startingULTgas + "<" + tagType + ">";
                    endingULTags = endingULTags + "";
                }
            htmlContent = htmlContent.replace(startingLiTagMap.get(liAttributeKey),
                    startingULTgas + startingLiTagMap.get(liAttributeKey));
            if (lastLiTagMap.get(liAttributeKey) != null) {
                System.out.println("Inside last Li Map");
                htmlContent = htmlContent.replace(lastLiTagMap.get(liAttributeKey),
                        lastLiTagMap.get(liAttributeKey) + endingULTags);
            }
            else {
                htmlContent = htmlContent.replace(startingLiTagMap.get(liAttributeKey),
                        startingLiTagMap.get(liAttributeKey) + endingULTags);
            }
            startingULTgas = "<" + tagType + ">";
            endingULTags = "";
        }
        System.out.println(htmlContent);[enter image description here][1]
        return htmlContent;
    }
    

提交回复
热议问题