Migrating from other tools
Map OZ Report, ClipReport, Crystal Reports, ActiveReports and JasperReports concepts to FreeReport, the migration steps, and moving forms with AI or paste.
There is no automatic converter for .ozr, .crf, .rpt, .rdlx or .jrxml files. Forms are rebuilt in the designer (or written as JSON), usually a few hours per form; the tables below show where each concept goes, and the AI assistant and paste from Excel/Hangul do most of the typing.
Korean tools: OZ Report and ClipReport
Names on the left are the general concepts of each product; check them against the version you use.
| Concept | OZ Report | ClipReport | FreeReport |
|---|---|---|---|
| Form file | .ozr form + .odi data module | .crf form | JSON definition (one file, versioned with your code) |
| Bands | Title, page header, data band, group header/footer, summary, page footer | Header, data and footer bands per dataset | bands.title, pageHeader, columnHeader, groups[].header/footer, detail, summary, pageFooter, noData |
| Data | ODI with DB queries on the OZ server | Datasets from the report server | JSON from your own API: data or fetchData, or a REST source (definition.data) |
| Fields | Data-bound labels | Data fields | field element with expr: "name", "customer.name" |
| Parameters | Form / ODI parameters | Report parameters | definition.params (text, number, date, select…) shown in the viewer panel; params.x in expressions |
| Viewer and printing | OZ viewer (HTML5 or installed), print module | Viewer, print plug-in | createViewer in the browser; browser printing at exact paper size; optional signed Windows agent for silent printing |
Crystal Reports, ActiveReports, JasperReports
| Concept | Crystal Reports | ActiveReports | JasperReports | FreeReport |
|---|---|---|---|---|
| Bands | Report Header, Page Header, Group Header #n, Details, Group Footer, Report Footer, Page Footer | Section reports: ReportHeader, PageHeader, GroupHeader, Detail, … | title, pageHeader, columnHeader, groupHeader/Footer, detail, columnFooter, summary, pageFooter, noData | title, pageHeader, columnHeader, groups[], detail, summary, pageFooter, noData |
| Fields | {Table.Field} | DataField / =Fields!Name.Value | $F{name} | field element, expr "name" |
| Formulas | Formula fields (Crystal / Basic syntax) | Expressions, scripts | Java/Groovy expressions, variables $V{} | one safe expression language: price * qty, iif(), format(), koreanAmount(), date functions; no scripts |
| Totals | Summary fields, running totals | SummaryType / Sum() | Variables with calculation and resetType | sum(amount), sum(amount, 'group' | 'page' | 'report'), count, avg, min, max |
| Parameters | {?Param} | Parameters | $P{param} | definition.params → params.param |
| Conditional display | Suppress formulas | Visible expression | printWhenExpression | visible: expression; suppressRepeated |
| Subreports | Subreport | SubReport control | subreport | subreport element (ref to definition.subreports, rows: "row.items"), or nested tables |
| Cross-tabs | Cross-Tab | Matrix / Tablix | crosstab | crosstab element (rowKey, columnKey, value, totals) |
| Charts | Chart | Chart | chart (JFreeChart) | chart element: bar, horizontal bar, line, area, pie, doughnut |
| Export | PDF, Excel, Word, … | PDF, Excel, Word, … | JRPdfExporter, JRXlsxExporter, … | in the browser: PDF (Korean font subset, AES-256), Excel as printed or as data, CSV, HWPX, DOCX, PNG; on servers renderPdf / renderXlsx |
| Printing agent | Printer settings in the runtime | Print from the viewer or code | JRPrintServiceExporter (server side) | browser print dialog; or agent.print(pdf, { printer, copies }) through the optional Windows program |
Migration, step by step
- List the forms. For each: paper, bands, data source, parameters, totals, subreports, how it is printed (dialog, silent, batch) and which exports people use. Start with the most-printed forms.
- Turn the data into JSON. Move the queries from the report server (ODI, datasets, SQL commands) to your own API, which returns JSON: top-level values for the header ({ customer: {…} }) and an array for the detail rows ({ items: [...] }). See the backend examples. Backend examples
- Rebuild the layout. Start from a matching template, paste the form's table from Excel or Hangul, or ask the AI assistant; then fix positions in the designer. Templates
- Rewrite formulas. Crystal {Table.Field}, Jasper $F{name} and $P{name} become name and params.name; Sum({x}) becomes sum(x) with a scope; IIF and ToText become iif() and format(). Scripts that change the layout at run time become visible, canGrow and group options. Expressions
- Compare the output. Print or save a PDF of the old and the new form with the same data and lay them over each other. The designer's [Check] finds unknown fields and broken expressions.
- Switch the screens. Replace the old viewer tag or plug-in call with createViewer (or the React, Vue, Svelte, Angular component); for silent printing at counters, install the Windows program. Remove the old print module from PCs last. Windows print program
Moving forms with AI, Excel and Hangul
Two tools do most of the typing. Neither reads the old form file itself; you give them the layout.
- Paste from Excel or Hangul: many forms already exist as an Excel or HWP table. Copy the table and press Ctrl+V in the designer: every cell becomes a text element with the same width, height, merged cells, borders, background and alignment. Then replace the value cells with field elements.
- Designer AI assistant: when your application turns on the assistant option, describe the old form (bands, fields, formulas, totals) and the assistant writes or changes the definition; every answer is checked before you apply it. Without it, give any AI chat the description below together with llms-full.txt and paste the JSON into the designer's JSON view. Designer · Asking an AI assistant
Below is a report from our old reporting tool. Rebuild it as a FreeReport report definition (JSON).
- Paper: A4 portrait, 15 mm margins
- Top: title "Statement", supplier block (name, CEO, business number, address) and a seal
- Detail: items array (name, spec, qty, price, amount = qty * price)
- Bottom: total and the amount in Korean words
- Old formula: {Total} = Sum({Amount}) -> rewrite as a FreeReport expression
Do not invent options that are not in https://freereport.app/llms-full.txt.Check AI output with the designer's [Check] and a printout before using it: AI can misread positions and formulas. To show a converted form to us or other users, use the designer's [Share link] and post it in the forum. Forum