有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用iText的HTMLWorker类将多语言HTML字符串呈现为PDF

我的HTML字符串有时包含中文单词,我的代码在中文单词处显示空白

这是我的HTML,看起来像这样

<html>
<body>
<div>
<table  border='1'  align='center' cellpadding='1' cellspacing='0'>
<tr>
<td  bgcolor= '#d1eb9d' align='left' width='60%'><font size='2'><b>Answer choices</b></td>
<td  bgcolor= '#d1eb9d' align='center' width='20%'><font size='2'><b>Percentage</b></td>
<td  bgcolor= '#d1eb9d'  align='center' width='20%' ><font size='2'><b>Responses</b></div></td>
</tr>
</div>
</td>
<td  align='left' ><div>紅</div></td>
<td align='center' ><div >66.67%</div></td>
<td  align='center'><div >2</div></td><
/tr>
</div>
</td>
<td  align='left' ><div>黃</div></td>
<td align='center' ><div >66.67%</div></td>
<td  align='center'><div >2</div></td>
</tr>
</div>
</td>
<td  align='left' ><div>粉紅</div></td>
<td align='center' ><div >33.33%</div></td>
<td  align='center'><div >1</div></td>
</tr>
</div>
</td>
<td  align='left' ><div>藍</div></td>
<td align='center' ><div >33.33%</div></td>
<td  align='center'><div >1</div></td>
</tr>
</div>
</td>
<td  align='left' ><div>綠</div></td>
<td align='center' ><div >0.0%</div></td>
<td  align='center'><div >0</div></td>
</tr>
<tr>
<td  bgcolor= '#d1eb9d' ></td>
<td  bgcolor= '#d1eb9d' align='right' ><font size='2'><i><b>Total</b></i></td>
<td  bgcolor= '#d1eb9d' align='center' >3</td></tr>
</table>
</div>
</body>
</html>

这是我解析上述字符串的代码

StringBuilder sb= new StringBuilder();
    String startstr = "<div>"
            +"<table  border='1'  align='center' cellpadding='1' cellspacing='0'>"
            +"<tr>"
            +"<td  bgcolor= '#d1eb9d' align='left' width='60%'><font size='2'><b>Answer choices</b></td>"
            +"<td  bgcolor= '#d1eb9d' align='center' width='20%'><font size='2'><b>Percentage</b></td>"
            +"<td  bgcolor= '#d1eb9d'  align='center' width='20%' ><font size='2'><b>Responses</b></div></td>"
            +"</tr>";
    String endString="<tr>"
            +"<td  bgcolor= '#d1eb9d' ></td>"
            +"<td  bgcolor= '#d1eb9d' align='right' ><font size='2'><i><b>Total</b></i></td>"
            +"<td  bgcolor= '#d1eb9d' align='center' >";
    String finalString= "</td>"
                        +"</tr>"
                        +"</table>"
                        +"</div>";
    sb.append(startstr);
     int sum=0;

        for (Map.Entry<String, String> queMap1 : qvo.getResponseMap().entrySet()){
            String value=queMap1.getValue();
            sum+=Integer.parseInt(value);
        }
    ////////////////////////////////////////////////////////////////////////////System.out.println("type of question in gettable"+qvo.getType());
    for (Map.Entry<String, String> queMap1 : qvo.getResponseMap().entrySet()){

        String key=queMap1.getKey();
        String value=queMap1.getValue();
        String[] splitarr= key.split(",");
        String type= qvo.getType();
        sb.append("</div></td>");
        sb.append("<td  align='left' ><div>");
            if(surveyType.equalsIgnoreCase("singlesurvey")){
                sb.append(splitarr[2]);
            }else sb.append(splitarr[0]);
        sb.append("</div></td>");
        sb.append("<td align='center' ><div >");
        if(type.equalsIgnoreCase("M") || type.equalsIgnoreCase("P")){
            sum=Integer.parseInt(surveyNumberResponses);
        }
        double percent=getPercentage(value,String.valueOf(sum));
        sb.append(String.valueOf(percent)+"%");
        sb.append("</div></td>");

        // response
        sb.append("<td  align='center'><div >");
        sb.append(value);
        sb.append("</div></td>");
        sb.append("</tr>");

    }
    sb.append(endString);
    sb.append(String.valueOf(sum));
    sb.append(finalString);
     try {
        htmlWorker.parse(new StringReader(sb.toString()));
    } catch (IOException e) {}

以上代码可以正确地呈现英文,并在中文单词处显示空格

英语图像如下所示

enter image description here

中文图像如下所示 enter image description here

请建议我如何在PDF中显示可用的HTML字符串中的中文单词我正在使用iText api创建PDF

更新

现在我用这段代码来解析上面仍然显示空白的字符串

String  ttfFontName=System.getProperty("user.dir")+"/ARIALUNI.TTF";
    XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
             XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
             fontImp.register(ttfFontName);
             FontFactory.setFontImp(fontImp);
             InputStream is = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
             worker.parseXHtml(writer, document, is,null, Charset.forName("UTF-8"), fontImp);

请先帮我谢谢


共 (1) 个答案

  1. # 1 楼答案

    谢谢你布鲁诺洛瓦吉我终于找到了问题的解决办法。正如我在上面的问题中编辑的那样,在使用XMLWorkerHelper之后,我的PDF仍然在中文单词的位置显示空白,这是因为我没有在HTML代码的样式标记中指定字体(我注册了XMLWorkerFontProvider对象)。现在HTML代码将如下所示

    String str="<html><head>"
                + "<meta http-equiv=\"content-type\" content=\"application/xhtml+xml; charset=UTF-8\"/>"
                + "</head>"
                + "<body>"
                + "<div>"
                + "<table  border='1'  align='center' cellpadding='5' cellspacing='0'>"
                + "<tr>"
                + "<td  style='background-color:#d1eb9d;'  align='left' width='40%'><font size='3'><b>Answer choices</b></font></td>"
                + "<td  style='background-color:#d1eb9d; ' align='center' width='20%'><font size='3'><b>Percentage</b></font></td>"
                + "<td  style='background-color:#d1eb9d; '  align='center' width='20%' ><font size='3'><b>Responses</b></font></td>"
                + "</tr>"
                + "<tr>"
                + "<td  style=\"font-family: arial unicode ms, ARIALUNI; font-size:16px; font-weight: normal;\" align='left' ><div>藍</div></td>"
                + "<td style='text-align:center;' ><div >66.67%</div></td>"
                + "<td  style='text-align:center;'><div >2</div></td></tr>"
                + "<tr>"
                + "<td  style=\"font-family: arial unicode ms, ARIALUNI; font-size:16px; font-weight: normal;\" align='left' ><div>粉紅</div></td>"
                + "<td style='text-align:center;' ><div >66.67%</div></td>"
                + "<td  style='text-align:center;' ><div >2</div></td>"
                + "</tr>"
                + "<tr>"
                + "<td  style=\"font-family: arial unicode ms, ARIALUNI; fkont-size:16px; font-weight: normal;\" align='left' ><div>apple</div></td>"
                + "<td style='text-align:center;' ><div >33.33%</div></td>"
                + "<td  style='text-align:center;'><div >1</div></td>"
                + "</tr>"
                + "<tr>"
                + "<td  style=\"font-family: arial unicode ms, ARIALUNI; font-size:16px; font-weight: normal;\" align='left' ><div>紅</div></td>"
                + "<td style='text-align:center;' ><div >33.33%</div></td>"
                + "<td  style='text-align:center;'><div >1</div></td>"
                + "</tr>"
                + "<tr>"
                + "<td  align='left' style=\"font-family: arial unicode ms, ARIALUNI; font-size:16px; font-weight: normal;\" ><div>綠</div></td>"
                + "<td style='text-align:center;' ><div >0.0%</div></td>"
                + "<td  style='text-align:center;'><div >0</div></td>"
                + "</tr>"
                + "<tr>"
                + "<td style='background-color:#d1eb9d;' ></td>"
                + "<td  style='background-color:#d1eb9d;' align='right' ><font size='3'><i><b>Total</b></i></font></td>"
                + "<td  style='background-color:#d1eb9d;' align='center' >3</td></tr>"
                + "</table>"
                + "</div>"
                + "</body>"
                + "</html>";
    

    Java代码如下所示

    String  ttfFileName=System.getProperty("user.dir")+"/ARIALUNI.TTF";
     XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
             XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
             fontImp.register(ttfFileName);
             FontFactory.setFontImp(fontImp);
             InputStream is = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));
             worker.parseXHtml(writer, document, is,null, Charset.forName("UTF-8"), fontImp);
    

    现在桌子看起来像这样enter image description here

    希望这篇文章能帮助他人,谢谢你