> For the complete documentation index, see [llms.txt](https://docs.cloudio.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cloudio.io/working-with-additional-functionality/working-with-additional-functionality/creating-pdf-documents-using-magicbox.md).

# Creating PDF documents using MagicBox

CloudIO supports **MagicBox**, a Java tool to create PDF documents. Its “Design and Data Centric” approach allows you to create PDF documents with minimal code that is easy to write and understand.

* To create a PDF page, refer to the code below:

```java
MagicBox magicBox = MagicBox.getInstance(); 
PDFPage page = magicBox.createPage();
```

* To save a PDF to stream, refer to the code below:

```java
magicBox.save(outputStream);
```

{% hint style="info" %}
You can add the code to create PDF documents in the ***Java Snippets*** page.
{% endhint %}

The platform supports a list of widgets for page formatting.\
A widget is the parent type to use the available child methods, such as, Div, Image, and many more.

## Available methods:

```java
void setWidth(float width); 
float getWidth(); 
float getOffsetWidth(); 
void setHeight(float height); 
float getHeight(); 
float getOffsetHeight(); 
void setStartX(float startX); 
float getStartX(); 
void setStartY(float startY); 
float getStartY(); 
void resetStartY(float startY); 
void setWidthPercentage(int widthPerc); 
void setMarginTop(float marginTop); 
void appendMarginTop(float mt); 
float getMarginTop(); 
void setMarginRight(float marginRight); 
float getMarginRight(); 
void setMarginLeft(float marginLeft); 
void appendMarginLeft(float ml); 
float getMarginLeft();
void setParent(MBWidget parent); 
MBWidget getParent(); 
Void setIgnoreNewPage(Boolean ignoreNewPage) ; 
Boolean isIgnoreNewPage();
```

## Sample widget snippets

```java
import java.awt.Color; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.util.ArrayList; 
import java.util.List; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
import io.cloudio.pdfutil.magicbox.MagicBox; 
import io.cloudio.pdfutil.magicbox.widgets.PDFPage; 
import io.cloudio.pdfutil.magicbox.widgets.images.Image; 
import io.cloudio.pdfutil.magicbox.widgets.layouts.Div; 
import io.cloudio.pdfutil.magicbox.widgets.layouts.FormPanel; 
import io.cloudio.pdfutil.magicbox.widgets.tables.DataTable; 
import io.cloudio.pdfutil.widgets.widgets.tables.Panel; 
import io.cloudio.pdfutil.magicbox.widgets.tables.Table.FontAlignment; 
import io.cloudio.pdfutil.magicbox.widgets.tables.components.CellConfig; 
import io.cloudio.pdfutil.magicbox.widgets.tables.components.RowData; 
import io.cloudio.pdfutil.magicbox.widgets.text.TextBox; 
import io.cloudio.pdfutil.magicbox.widgets.text.PageCounter; 
import io.cloudio.pdfutil.magicbox.widgets.layouts.Footer; 
import io.cloudio.pdfutil.magicbox.widgets.layouts.Header; 
static Color primaryColor = Color.decode("#057dcd"); 
static Color secondaryColor = Color.decode("#057dcd"); 
static Color textPrimaryColor = Color.decode("#464646"); 
static PDType1Font primaryFont = PDType1Font.HELVETICA; 
public static void main(String[] args) throws Exception { 
    MagicBox magicBox = new MagicBox(); 
    PDFPage page = magicBox.createPage(); 

    //Footer 
    Footer footer = new Footer(); 
    footer.borders(true);

    // Page Counter 
    PageCounter pc = new PageCounter(); 
    pc.setMarginLeft(250); 
    pc.setMarginTop(-5); 
    pc.setExpression("Page " + PageCounter.CURRENT_PAGE_INDEX + " of " + PageCounter.TOTAL_PAGES); 
    footer.appendChild(pc); 
    page.addWidget(footer); 
    //addLogo(page, "Local path/URL to your logo")

    RowData formPanel1Data = new RowData(); 
    formPanel1Data.add("cutOff", "Monday"); 
    formPanel1Data.add("delivery", "By Thursday"); 
    formPanel1Data.add("weight", "500 lbs. or $50.00"); 
    formPanel1Data.add("little", " "); 
    formPanel1Data.add("customerNumber", "50950"); 
    formPanel1Data.add("customerBook", "ENCO006342"); 
    addFormPanel1(page, formPanel1Data); 
    List < RowData > rows = new ArrayList(); 
    RowData row1 = new RowData(); 
    row1.add("superSpan", "29 GA. GALVALUME Plus"); 
    row1.add("grade", "(AZ55 Grade 80)"); 
    row1.add("priceSqr", "$95.25"); 
    row1.add("priceLft", "$3.04"); 
    rows.add(row1); 
    RowData row2 = new RowData(); 
    row2.add("superSpan", "29 GA. GALVALUME Plus"); 
    row2.add("grade", "(AZ55 Grade 80)"); 
    row2.add("priceSqr", "$125.50"); 
    row2.add("priceLft", "$4.00"); 
    rows.add(row2); 
    RowData row3 = new RowData(); 
    row3.add("superSpan", "26 GA. Commodity Colors"); 
    row3.add("grade", "(AZ55 Grade 80)"); 
    row3.add("priceSqr", "$125.75"); 
    row3.add("priceLft", "$3.92"); 
    rows.add(row3); 
    addDataTable1(page, primaryColor, 30 f, rows); 
    List < RowData > commerialPaneldata = getTable2Data(); 
    addCommercialPanelTable(page, commerialPaneldata); 
    addDataTable2(page, secondaryColor, 10, rows); 
    response.setHeader("Content-Disposition","attachment; filename=\"test.pdf\"");
    response.setContentType("application/pdf"); 
    magicBox.save(response.getOutputStream()); 
} 

private static void addLogo(PDFPage page, String logoPath) { 
    Image headerLogo = new Image(logoPath, 200, 96); 
    float mr = (page.getWidth() - headerLogo.getWidth()) / 2 .5 f; 
    headerLogo.setMarginLeft(mr); 
    page.addWidget(headerLogo); 
} 

private static void addFormPanel1(PDFPage page, RowData row) { 
    addFormPanel1Header(page); 
    FormPanel formPanel = new FormPanel(); 
    formPanel.setMarginTop(20); 
    formPanel.setMarginLeft(20); 
    Panel panel1 = formPanel.createPanel(); 
    panel1.setHeaderFontSize(8); 
    panel1.setCellPadding(0); 
    panel1.setCellFontSize(8); 
    panel1.setCellFontColor(textPrimaryColor); 
    panel1.setHeaderFontColor(textPrimaryColor); 
    panel1.setCellFontAlignment(FontAlignment.LEFT); 
    panel1.setHeaderFontAlignment(FontAlignment.LEFT); 
    List < CellConfig > cellConfigs = new ArrayList(); 
    CellConfig c = new CellConfig("cutOff", "Cutoff"); 
    cellConfigs.add(new CellConfig("cutOff", "Cutoff")); 
    cellConfigs.add(new CellConfig("delivery", "Delivery")); 
    cellConfigs.add(new CellConfig("weight", "Weight min.")); 
    panel1.setCellConfigs(cellConfigs); 
    panel1.setData(row); 
    Panel panel2 = formPanel.createPanel(); 
    panel2.setHeaderFontSize(8); 
    panel2.setCellPadding(0); 
    panel2.setCellFontSize(8); 
    panel2.setCellFontColor(textPrimaryColor); 
    panel2.setHeaderFontColor(textPrimaryColor); 
    panel2.setCellFontAlignment(FontAlignment.LEFT); 
    panel2.setHeaderFontAlignment(FontAlignment.LEFT); 
    List < CellConfig > cellConfigs2 = new ArrayList(); 
    cellConfigs2.add(new CellConfig("little", "Little Rock, AR 72204")); 
    cellConfigs2.add(new CellConfig("customerNumber", "Customer Number")); 
    cellConfigs2.add(new CellConfig("customerBook", "Customer Book")); 
    panel2.setCellConfigs(cellConfigs2); 
    panel2.setData(row); 
    page.addWidget(formPanel); 
}

private static void addFormPanel1Header(PDFPage page) { 
    Div div = new Div(); 
    div.setWidth(page.getOffsetWidth()); 
    div.setMarginTop(30); 
    Div div1 = new Div(); 
    div1.setWidthPercentage(50); 
    div.appendChild(div1); 
    TextBox deliveryText = new TextBox("DELEVERY"); 
    deliveryText.setFontColor(secondaryColor); 
    deliveryText.setFontSize(10); 
    deliveryText.setFontType(primaryFont); 
    div1.appendChild(deliveryText); 
    Div separator = getSeparator(100, 200); 
    div1.appendChild(separator); 
    Div div2 = new Div(); 
    div2.setWidthPercentage(50); 
    div2.setMarginLeft(div.getWidth() / 2); 
    div.appendChild(div2); 
    TextBox encoreText = new TextBox("ENCORE STEEL BUILDINGS LLC"); 
    encoreText.setFontColor(secondaryColor); 
    encoreText.setFontSize(10); 
    encoreText.setFontType(primaryFont); 
    div2.appendChild(encoreText); 
    div2.appendChild(separator); 
    page.addWidget(div); 
}

private static void addDataTable1(PDFPage page, Color color, float marginTop, List < RowData > rows) { 
    DataTable table = new DataTable(); 
    table.setMarginTop(marginTop); 
    table.setBorderLineSize(0 .1 f; 
    table.setBorderColor(color); 
    table.setHeaderBackgroundColor(color); 
    table.setCellFontColor(textPrimaryColor); 
    table.setHeaderFontColor(Color.WHITE); 
    table.setCellFontSize(8); 
    table.setCellAlignment(FontAlignment.CENTER); 
    table.setHeaderFontSize(8); 
    List < CellConfig > cellConfigs = new ArrayList(); 
    cellConfigs.add(new CellConfig("superSpan", "SUPER SPAN / LOW RIB")); 
    cellConfigs.add(new CellConfig("grade", "Grade")); 
    cellConfigs.add(new CellConfig("priceSqr", "PRICE/SQR")); 
    cellConfigs.add(new CellConfig("priceLft", "PRICE/LFT")); 
    table.setCellConfigs(cellConfigs); 
    table.setRows(rows); 
    page.addWidget(table); 
}

private static void addCommercialPanelTable(PDFPage page, List < RowData > rows) { 
    addCommercialPanelHeader(page); 
    DataTable table = new DataTable(); 
    table.setMarginTop(0); 
    table.setBorderLineSize(0 .1 f); 
    table.setCellFontSize(8); 
    table.setBorderColor(Color.WHITE); 
    table.setCellPadding(2); 
    table.setCellFontColor(textPrimaryColor); 
    table.setHeaderBackgroundColor(Color.WHITE); 
    table.setFontType(primaryFont); 
    table.setCellAlignment(FontAlignment.LEFT); 
    List < CellConfig > cellConfigs = new ArrayList(); 
    cellConfigs.add(new CellConfig("superSpan", "")); 
    cellConfigs.add(new CellConfig("grade", "")); 
    cellConfigs.add(new CellConfig("priceSqr", ""));
     cellConfigs.add(new CellConfig("priceLft", ""));
     table.setCellConfigs(cellConfigs); 
    table.setRows(rows); 
    page.addWidget(table); 
}

private static void addCommercialPanelHeader(PDFPage page) { 
    Div div = new Div(); 
    div.setWidthPercentage(100); 
    div.setMarginTop(30); 
    TextBox textBox = new TextBox("COMMERCIAL/INDUSTRIAL PANELS"); 
    textBox.setFontSize(10); 
    textBox.setFontColor(secondaryColor); 
    textBox.setFontType(primaryFont); 
    div.appendChild(textBox); 
    Div line = getSeparator(200, page.getOffsetWidth()); 
    div.appendChild(line); 
    page.addWidget(div); 
}

private static void addDataTable2(PDFPage page, Color color, float marginTop, List < RowData > rows) { 
    TextBox textBox = new TextBox("SUPER SPAN X / LOW RIB X / MONARCH"); 
    textBox.setFontSize(10); 
    textBox.setFontType(PDType1Font.HELVETICA); 
    textBox.setFontColor(secondaryColor); 
    textBox.setMarginTop(30); 
    page.addWidget(textBox); 
    addDataTable1(page, color, marginTop, rows); 
}

private static List < RowData > getTable2Data() { 
    List < RowData > rows = new ArrayList(); 
    RowData row1 = new RowData(); 
    row1.add("superSpan", "29 GA. GALVALUME Plus"); 
    row1.add("grade", "(AZ55 Grade 80)"); 
    row1.add("priceSqr", "$9999.00"); 
    row1.add("priceLft", "$318.95"); 
    rows.add(row1); 
    RowData row2 = new RowData(); 
    row2.add("superSpan", "26 GA. SMP Colors"); 
    row2.add("grade", "(AZ55 Grade 80)"); 
    row2.add("priceSqr", "$131.50"); 
    row2.add("priceLft", "$132.50"); 
    rows.add(row2); 
    RowData row3 = new RowData(); 
    row3.add("superSpan", "22 GA. Poly Polar White"); 
    row3.add("grade", "(AZ55 Grade 80)"); 
    row3.add("priceSqr", "$201.95"); 
    row3.add("priceLft", "$3.92"); 
    rows.add(row3); 
    RowData row4 = new RowData(); 
    row4.add("superSpan", "22 GA. Poly Polar White"); 
    row4.add("grade", "(AZ55 Grade 80)"); 
    row4.add("priceSqr", "$201.95"); 
    row4.add("priceLft", "$3.92"); 
    rows.add(row4); 
    RowData row5 = new RowData(); 
    row5.add("superSpan", "29 GA. GALVALUME Plus"); 
    row5.add("grade", "(AZ55 Grade 80)"); 
    row5.add("priceSqr", "$9999.00"); 
    row5.add("priceLft", "$318.95"); 
    rows.add(row5); 
    return rows; 
}

private static Div getSeparator(float length1, float length2) { 
    Div div = new Div(); 
    div.setMarginTop(30); 
    Div div1 = new Div(); 
    div1.setWidth(length1); 
    div1.setHeight(2); 
    div1.setBackgroundColor(secondaryColor); 
    div.appendChild(div1); 
    Div div2 = new Div(); 
    div2.setWidth(length2); 
    div2.setHeight(1); 
    div2.setMarginTop(1); 
    div2.setBackgroundColor(secondaryColor); 
    div.appendChild(div2);    
    return div; 
}
main(null);
```
