HTML组件的字体大小渲染问题

时间:2017-04-19 13:10:00

标签: html jasper-reports export-to-pdf

我在渲染嵌入式html组件时遇到了pdf报告的文本字体大小问题,例如:

我的Java代码:

StringBuilder htmlBody = new StringBuilder("");
htmlBody.append("<p class=\"m\">").append(mainSkillCategory.getName()).append("</p>\n");
for(SubSkillCategory subSkillCat : mainSkillCategory.getSubSkillCategories()){
    htmlBody.append("<p class=\"c\">").append(subSkillCat.getName()).append("</p>\n");
    for(Skill skill : subSkillCat.getSkills()){
        htmlBody.append("<p class=\"s\">").append(skill.getName()).append("</p>\n");
    }
}
StringBuilder html = new StringBuilder("");
html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n");
html.append("<html>\n");
html.append("<head>\n");
html.append("    <title>Sample of html based report</title>\n");
html.append("    <style type=\"text/css\">\n");
html.append("        p.m {\n");
html.append("              font-size: 12px;\n");
html.append("              font-family: \"Calibri\";\n");
html.append("              padding: 0pt 0pt 0pt 1cm;\n");
html.append("              font-weight: bold;\n");
html.append("              margin: 1pt 0pt 1pt 0pt;\n");
html.append("        }\n");
html.append("\n");
html.append("        p.c {\n");
html.append("              font-size: 12px;\n");
html.append("              font-family: \"Calibri\";\n");
html.append("              padding: 0pt 0pt 0pt 2cm;\n");
html.append("              font-weight: bold;\n");
html.append("              margin: 1pt 0pt 1pt 0pt;\n");
html.append("        }\n");
html.append("\n");
html.append("        p.s {\n");
html.append("              font-size: 12px;\n");
html.append("              font-family: \"Calibri\";\n");
html.append("              font-weight: normal;\n");
html.append("              padding: 0pt 0pt 0pt 3cm;\n");
html.append("              margin: 0pt 0pt 0pt 0pt;\n");
html.append("        }\n");
html.append("\n");
html.append("    </style>\n");
html.append("</head>\n");
html.append("\n");
html.append("<body>\n");
html.append(htmlBody.toString());                                                                                                                                                                                                                                                                           html.append("</body>\n");
html.append("</html>");
params.put("htmlCode", html.toString());

.jrxml模板:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Html component" pageWidth="595" pageHeight="842" columnWidth="200" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">    
    <style name="backgroundStyle" mode="Opaque" backcolor="green"/>
    <parameter name="htmlCode" class="java.lang.String"/>
    <title>
        <band height="200">
            <componentElement>
                <reportElement style="backgroundStyle" x="0" y="0" width="550" height="200"/>
                <hc:html xmlns:hc="http://jasperreports.sourceforge.net/htmlcomponent" xsi:schemaLocation="http://jasperreports.sourceforge.net/htmlcomponent http://jasperreports.sourceforge.net/xsd/htmlcomponent.xsd" scaleType="RetainShape" horizontalAlign="Left" verticalAlign="Top">                   
                    <hc:htmlContentExpression><![CDATA[$P{htmlCode}]]></hc:htmlContentExpression>
                </hc:html>
            </componentElement>
        </band>
    </title>
</jasperReport>

如果我继续使用JasperExportManager.exportReportToHtmlFile()生成报告,则输出为: html output

但是,如果我继续JasperExportManager.exportReportToPdfStream(),我会得到: pdf output

可能很难区分加入的屏幕截图,但似乎在CSS类(iepm,pc,ps)中指定的生成的pdf报告的字体大小比实际大应该是(即12)。

此前有人可能遇到过这个问题。任何帮助都将受到欢迎。

2 个答案:

答案 0 :(得分:1)

JasperReports中的htmlcomponent仍然处于实验状态(它与核心库分开,在样本中),并且很可能会保持这种状态。

这是因为在创建图像的非HTML格式中,其输出是不可预测的。那个图像可能会溢出,引擎无法决定在哪里打破它。

对于小型HTML,您可能没问题,但默认的图像生成器基于Java的默认JEditorPane,它支持CSS。

您可以尝试使用此属性设置一个更加CSS友好的图像生成器(支持CSS 2.1):

net.sf.jasperreports.html.printelement.factory = net.sf.jasperreports.engine.util.FlyingSaucerHtmlPrintElementFactory

看看是否有任何改善。因为此组件的输出毕竟是图像,所以切换到不同的比例类型可能有助于保留内容的原始形状。

请注意,在JasperReports版本中设置上述属性大于6.2.2将破坏使用此组件的报告的非HTML导出。这将在即将发布的版本中修复。

答案 1 :(得分:0)

(我们发现了什么(JSS 6.3.2):)

HTML组件具有允许调整缩放内容的属性。 尝试 Properties View -> HTML Properties -> Scale Type -> [Clip] ,例如..

(为了清晰起见,还有一些更广泛的图片)

但这仅适用于JavaPreview标签中的默认设置)或PDF呈现:

scale type Java differences(&lt; - Java预览或PDF呈现) enter image description here(&lt; - Design标签)

右侧浮点数列显示Scale Type(和Horizontal Align: Right的效果,其中9966.26显示输出所需的标准字体大小:

Retain Shape
Clip
Fill Frame
Real Height
Real Size

切换到HTML渲染没有任何效果(因此必须处理一些封闭的(可能是固定宽度/高度)div或类似的基于HTML的样式:

enter image description here

(旧的/过时的解决方案:)

在某些情况下(如果您知道html元素中返回的行数),可以通过将 html element height按比例设置为返回的文本行数 < /强>

E.g。如果您的文字大小等于15px并且您获得以下2-liner(不太长,因此它不会自动缩小)

some sample broken
text

然后将html元素高度设置为30px将呈现适当的大小。 这当然意味着 要么你知道设计时的行数(它是固定的),要么你必须使用Java API 动态设置它