#java #jasper-reports
#java #jasper-отчеты
Вопрос:
Короче говоря: перенесите из java символ UTF-8 ‘ u205F’ или ‘ u2007’ в ireport с идентификатором кодировки pdf -H и шрифтом SansSerif
Основная проблема заключается в печати древовидной структуры в Jasper. В качестве простого способа я создаю строки и печатаю их в одном текстовом поле, но проблема заключается в заполнении слева. Я бы решил это по шрифту, но это выдаст ошибку, если я выберу другой, а затем SansSerif.
В java (Eclipse имеет кодировку UTF-8) я хочу, чтобы в левой панели был пробел размером с число ‘ u205F’ или ‘ u2007’, затем эту строку я хочу распечатать через отчет jasper (jasperreports-javaflow-4.7.1) в PDF, и я хочу иметь соответствующее левое заполнение. iReport Desing имеет идентификатор кодировки -H (Unicode с горизонтальной записью)
7
8
0001
10
001
10
001
1001
1111
Я использую наше ядро, поэтому я не могу контролировать использование jars.
Ошибка в itext-2.1.7 с другим шрифтом:
com.lowagie.text.pdf.PdfXConformanceException: All the fonts must be embedded. This one isn't: Helvetica
at com.lowagie.text.pdf.internal.PdfXConformanceImp.checkPDFXConformance(Unknown Source)
at com.lowagie.text.pdf.PdfWriter.addSimple(Unknown Source)
at com.lowagie.text.pdf.PdfContentByte.setFontAndSize(Unknown Source)
at com.lowagie.text.pdf.PdfDocument.writeLineToContent(Unknown Source)
at com.lowagie.text.pdf.ColumnText.go(Unknown Source)
at com.lowagie.text.pdf.ColumnText.go(Unknown Source)
at net.sf.jasperreports.engine.export.SimplePdfTextRenderer.render(SimplePdfTextRenderer.java:125)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportText(JRPdfExporter.java:2164)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:858)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:818)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:695)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:396)
Хорошо, я добавляю тот же код samle, я могу поместить все свои. потому что он слишком огромен
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="RU1" pageWidth="595" pageHeight="695" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="0" bottomMargin="0" uuid="4923ab94-9bda-4a2a-98a1-f3924aaf44ef">
<property name="ireport.zoom" value="2.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name="name" class="java.lang.String"/>
<field name="_THIS" class="my.SimpleClass"/>
<sortField name="sortCode" type="Variable"/>
<variable name="listToSubreport_V" class="java.util.List">
<initialValueExpression><![CDATA[new ArrayList()]]></initialValueExpression>
</variable>
<variable name="sortCode" class="java.lang.String" resetType="None">
<variableExpression><![CDATA[$F{_THIS}.getCompleteCode().replaceAll(" ", "__")]]></variableExpression>
<initialValueExpression><![CDATA[]]></initialValueExpression>
</variable>
<variable name="code" class="java.lang.String" resetType="None">
<variableExpression><![CDATA[$F{_THIS}.getPaddedCode()]]></variableExpression>
<initialValueExpression><![CDATA[]]></initialValueExpression>
</variable>
<variable name="name" class="java.lang.String" resetType="None">
<variableExpression><![CDATA[$F{_THIS}.getPadedName()]]></variableExpression>
<initialValueExpression><![CDATA[]]></initialValueExpression>
</variable>
<columnHeader>
<band height="36" splitType="Stretch">
<staticText>
<reportElement uuid="7d799d57-6438-4d88-b111-8dbdef2e7cb4" x="20" y="0" width="96" height="30"/>
<textElement textAlignment="Left" verticalAlignment="Bottom">
<font size="7"/>
</textElement>
<text><![CDATA[Code]]></text>
</staticText>
<staticText>
<reportElement uuid="bac26704-4ea8-410a-8fac-eb67f1481791" x="121" y="0" width="259" height="30"/>
<textElement verticalAlignment="Bottom">
<font size="7"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
<line>
<reportElement uuid="be781202-5f0a-4652-9ba4-943b7bda9a11" x="0" y="32" width="555" height="1"/>
<graphicElement>
<pen lineWidth="0.5"/>
</graphicElement>
</line>
</band>
</columnHeader>
<detail>
<band height="9" splitType="Stretch">
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement uuid="8eabcf7a-be05-424e-9f63-e58819f0aeca" x="20" y="0" width="96" height="9"/>
<textElement textAlignment="Left" markup="none">
<font fontName="SansSerif" size="7" pdfEncoding="Identity-H" isPdfEmbedded="false"/>
</textElement>
<textFieldExpression><![CDATA[$V{code}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement uuid="3256d49c-b4e7-44ab-988c-29134977e55a" x="121" y="0" width="259" height="9"/>
<textElement>
<font size="7"/>
</textElement>
<textFieldExpression><![CDATA[$V{name}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Класс:
public class SimpleClass implements HasId, Serializable {
@NotNull
private int id;
@NotNull
@Length(min = 4, max = 4)
private String code;
@NotNull
private String name;
private SimpleClass parent;
private List<SimpleClass> children = new ArrayList<>();
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getCode() {
return this.code;
}
public void setCode( String code ) {
this.code = code;
}
public String getName() {
return this.name;
}
public void setName( String name ) {
this.name = name;
}
public SimpleClass getParent() {
return this.parent;
}
public void setParent( SimpleClass parent ) {
this.parent = parent;
}
public List<SimpleClass> getChildren() {
return this.children;
}
public List<String> getParentsCode() {
if ( getParent() == null )
return Collections.emptyList();
List<String> result = new ArrayList<>();
SimpleClass simCls = this;
while ( ( simCls = simCls.getParent() ) != null )
result.add( simCls.getCode() );
return resu<
}
public String getCompleteCode() {
StringBuilder sb = new StringBuilder();
for ( String code : getParentsCode() )
sb.append( code );
sb.append( code );
return sb.toString();
}
public String getPaddedCode() {
StringBuilder sb = new StringBuilder();
for ( String code : getParentsCode() )
for ( int i = 0; i < code.length(); i )
sb.append( " " ); // should be u2007
sb.append( code );
return sb.toString();
}
public String getPaddedName() {
StringBuilder sb = new StringBuilder();
for ( String code : getParentsCode() )
for ( int i = 0; i < code.length(); i )
sb.append( " " ); // should be u2007
sb.append( name );
return sb.toString();
}
}
Reportddatasource:
// IBeanCollectionReportDataSource is our core interface
public class SimpleClassReportDataSource implements IBeanCollectionReportDataSource {
// ReportDataContext is our class
public List<HasId> getData( ReportDataContext context, Map<String, Object> jasperParameters ) {
// ibatis read list from database by where clause
List<SimpleClass> list = simpleClassDao.getGetList( Filtr myFiltr );
// Our class to create map by record id
Map<Integer, SimpleClass> map = EntityUtil.createIdMap( list );
// Fill all parents, and get max code length
int maxCodeLength = 0;
for ( SimpleClass sc : list ) {
if ( sc.getCode().length() > maxCodeLength )
maxCodeLength = sc.getCode().length();
Integer rodicId = ( sc.getParent() == null ) ? null : sc.getParent().getId();
if ( rodicId != null )
sc.setParent( map.get( rodicId ) );
else
sc.setParent( null );
}
// Fill code to same length
for ( SimpleClass sc : list ) {
if ( sc.getCode().length() < maxCodeLength )
sc.setCode( leftPad( sc.getCode(), maxCodeLength, ' ' ) ); // should be u2007
SimpleClass parent = sc.getParent();
while ( parent != null ) {
parent = parent.getParent();
}
}
return new ArrayList<>( list );
}
}
Но, возможно, отчет jasper может обрабатывать дерево самостоятельно, но я пока не знаю, как
Комментарии:
1. В чем ваш вопрос?
2. Я хочу напечатать символ utf8 ‘ u2007’ в отчете pdf, теперь он не работает. Работает только с базовым пространством и табулятором. Или, если есть какой-нибудь простой способ печати дерева, я буду рад этому
3. Вы должны опубликовать свой код (Java jrxml ). Что такое
u2007
символ?4. Код опубликован, и вам следует использовать Google 😉 graphemica.com/