How to relocate summaryband in jasperstudio - jasper-reports

I am appending the contentn of my table of content like here: Append an In-Report ToC
Now I have my TOC at the summary band. How can I move it to the second page? Is there any better way to create table of content in jasperstudio?
As recommended in coments i used jasper book. The problem is in the table of content i get dots instead of real text which should be there.
but as you can seen in the picture by hovering the mouse on the dots the real text is shown although without page number!
Here is the XML generated with jasperstudio:
<textField evaluationTime="Group" evaluationGroup="id" hyperlinkType="Reference" bookmarkLevel="2">
<reportElement isPrintRepeatedValues="false" x="-4" y="37" width="534" height="20" printWhenGroupChanges="id" uuid="f6d9376f-7106-4292-b491-7229b297ce04"/>
<textElement markup="html"/>
<textFieldExpression><![CDATA[$F{id}.toString()}]]></textFieldExpression>
<anchorNameExpression><![CDATA[$F{id}.toString()]]></anchorNameExpression>
<hyperlinkReferenceExpression><![CDATA[$F{id}.toString()]]></hyperlinkReferenceExpression>
<hyperlinkTooltipExpression><![CDATA[$F{id}.toString()]]></hyperlinkTooltipExpression>
</textField>

Related

How to styling a static text partially according to a global style in a Jasper Report

Question
I have a simple text field like this:
<staticText>
<reportElement x="0" y="0" width="120" height="10" />
<text>Hello world!</text>
</staticText>
Also in my document I have a style like this:
<style name="highlight" forecolor="#FF3333" />
How can I apply the style highlight to just the word "world" in my text field?
What I have tried so far
I checked whether I can just use multiple text fields (in this case three, one for "Hello ", one for "world" and one for "!"). In this case I could just use <reportElement ... style="highlight" /> on the element for "world". But it looks like there is no way to align the three text field vertically automatically. Since in my case the text is static I could of course align the text fields manually, however this is quite cumbersome to do and as soon as someone wants to change the font or the font size or exchange just a single letter in the text I need to realign everything.
Another option is to use styled text. This actually works:
<textField>
<reportElement x="0" y="0" width="120" height="10" />
<textElement markup="styled" />
<textFieldExpression><![CDATA[
"Hello <style forecolor='#FF3333'>world</style>!"
]]></textFieldExpression>
</textField>
This works fine by itself, but I cannot refer to my highlight-style - I have to repeat the color here which is not maintenance friendly either.

Indentation in generated PDF using JasperReports

I have a piece of HTML stored in a database as:
<ul>
<li>Pretend you're talking to a busy colleague and have to sum up your entire question in one sentence: what details can you include that will help someone identify and solve your problem?</li>
<li>Spelling, grammar and punctuation are important! Remember, this is the first part of your question others will see - you want to make a good impression. If you're not comfortable writing in English, ask a friend to proof-read it for you. </li>
<li>If you're having trouble summarizing the problem, write the title last - sometimes writing the rest of the question first can make it easier to describe the problem. </li>
</ul>
I am displaying this piece of HTML in a PDF using a JasperReports textField, the above HTML should display like this in the generated PDF.
Pretend you're talking to a busy colleague and have to sum up your entire question in one sentence: what details can you include that will help someone identify and solve your problem?
Spelling, grammar and punctuation are important! Remember, this is the first part of your question others will see - you want to make a good impression. If you're not comfortable writing in English, ask a friend to proof-read it for you.
If you're having trouble summarizing the problem, write the title last - sometimes writing the rest of the question first can make it easier to describe the problem.
But this HTML is showing as :
The snippet from jrxml file:
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement positionType="Float" x="7" y="47" width="501" height="15" isRemoveLineWhenBlank="true" forecolor="#283234"/>
<textElement markup="html">
<font size="10"/>
</textElement>
<textFieldExpression><![CDATA[$F{description}]]></textFieldExpression>
</textField>
HTML is feeded in description variable.
Any idea how can I align text?
My solution shows the plain JRXML which is the desired result independent from the tools someone is using, e.g. iReport GUI, dynamic reports or java code designing Jasper reports.
First define a style, which corrects the indentation pulling the first line some pixels to the left and pushes the whole box the same width to the right:
<style name="hanging-indentation-style">
<box leftPadding="23"/>
<paragraph firstLineIndent="-23"/>
</style>
Second, this style is applied to the reportElement of the textField:
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement style="hanging-indentation-style" positionType="Float" mode="Transparent" x="0" y="0" width="555" height="20" isRemoveLineWhenBlank="true"/>
<textElement markup="html"/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{description}]]></textFieldExpression>
</textField>
Depending on your font size you may vary the style values to fit your needs.
I adapted input from Aligning Bullets in Jasper Reports, where dynamic reports api is used, and Jasper Report HTML bullet hanging indent, where it is shown through the GUI, which was not possible in my case using iReport Designer 4.5.1, because there is no option to apply padding directly to a textField.

How to prevent repeating data in JasperReports TextField

I am using JasperReports and have some problem with textField data continue on next page.
I have 3 textField in detail band.
Band splitType="Stretch".
Every textfiled has borders and isPrintWhenDetailOverflows param set "true".
When data in textfield does not fit on page it continues on next. So i need to print other textfileds of same band (because i need to print borders of every textfield)
But isPrintWhenDetailOverflows="true also leads to repeating data in other textfields on second page though their contents fits on first page.
Illustration:
The jasper report documentation says:
isPrintWhenDetailOverflows()
If this is set to true, the element will be reprinted on the next page if the band does not fit in the current page.
So I think it might be a problem. Remove isPrintWhenDetailOverflows="true". The two things isStretchWithOverflow="true" and stretchType="RelativeToTallestObject" are working for me in this case. So your textField will be like:
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement style="cell" stretchType="RelativeToTallestObject" x="266" y="0" width="266" height="15"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<font fontName="Arial" size="9" isBold="false" pdfEncoding="Cp1251" isPdfEmbedded="true"/>
<paragraph leftIndent="2"/>
</textElement>
<textFieldExpression><![CDATA[$F{structure}]]></textFieldExpression>
</textField>

Make lines with iReport?

How can I do this with iReport (using iReport v4.0)?
Here is jrxml file
it depend on the size of Sub-report, check the sub-repot preview, if you want to increase the size of sub-rport in main report , for this you have to increase the size of sub-reportas where it is separately created.
You could try using background band for those lines.
Maybe inside your parent report
When you create a sub-report you can delete; Page Header, Column Header and Page Footer bands on your main report. After then, you can drag and drop sub-report icon on Summary part of your main report. You will probably use ColumnHeader and Detail bands on your Sub-Report. (It depends on your design. If you use subreports recursively, you can use again summary band.) Later,you will select Remove Report Margins on your subreport. To get expected result; your subreport icon Width on main report should equal your subreport page width.
Adding borders worked great for me. Expand your text element to cell size, right click -> Padding and Borders and add them all around. It's easier than having to handle draw lines. Less elements and faster editing.
You can add lines via the iReport Designer gui interface using the Palette (go to Window > Palette, then click Line, then drag it over to the Designer).
You can also add lines by modifying the jrxml code directly. I haven't found guidance in the documentation on this. But this answer to another question shows how to create a vertical line:
<line>
<reportElement x="0" y="0" width="1" height="30"/>
</line>
And it also shows how to create a horizontal line:
<line>
<reportElement x="0" y="0" width="30" height="1"/>
</line>
Also, the JRXML Sources and Jasper Files section of the documentation has some more involved code such as the following, which uses a direction parameter with value BottomUp (there are also references to TopDown in the community site or here):
<line direction="BottomUp">
<reportElement key="line" x="1" y="4" width="554" height="1"/>
</line>
And this, which uses positionType parameter of FixRelativeToBottom:
<line>
<reportElement positionType="FixRelativeToBottom" x="0" y="51" width="555"
height="1"/>
</line>

How to create a multi language report?

I want to create a document, which prints in more than one language, based on the Locale.
I have created 2 resource bundles, one in English and one in Chinese, but I am not sure how to use them.
Here is the sample of how to implement internationalization support for JasperReports.
The main idea is to use special expression $R{} for localizing text and images.
The sample for images:
<image scaleImage="Clip">
<reportElement positionType="Float" x="20" y="20" width="100" height="50"/>
<imageExpression class="java.lang.String"><![CDATA[$R{image.flag}]]></imageExpression>
</image>
The samples for text (the $R{} syntax):
<textField isBlankWhenNull="true">
<reportElement x="20" y="100" width="530" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$R{sampleString}]]></textFieldExpression>
</textField>
or (the msg() method):
text.message=The program picked up {0} as a random number.
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
<reportElement x="20" y="210" width="530" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[msg($R{text.message}, $P{number})]]></textFieldExpression>
</textField>
Since the document generator may be part of your application, you should somewhere have a language selector menu-item, check-box or combo-box which is already preselected.
So, why don't you just add an if statement that reads the Locale, or the needed language before the report generation, and load the appropriate report accordingly to the locale.
This way you will need to keep one jrxml file for every language. It will be fairly easy to just translate the headers and labels manually.
Your data should be already translated in your database, where you have to keep the relevant attribute values multilingual anyway.
You will need to modify the SQL query for the appropriate language, but since the Query is part of your jrxml it will be executed automatically.