@Override
    public List<PrintableHorizontalLineObject> transformBody(int lineHeight, int width, int margin, FontMetrics fontMetrics) {
	/*
	 * Formatting variables
	 */
	int half = width/2;
	width-=10; // small correction...
	half-=5;
	int[] tabs = new int[]{0, half, 3*width/5+10, 4*width/5+5, width-9};
	int threeZeroesWidth = fontMetrics.charsWidth(",000".toCharArray(), 0, 4);
	int commaWidth = fontMetrics.charsWidth(",".toCharArray(), 0, 1);
	int zeroWidth = fontMetrics.charsWidth("0".toCharArray(), 0, 1);
	
	/*
	 * Incremental print model
	 */
	List<PrintableHorizontalLineObject> printModel = new ArrayList<PrintableHorizontalLineObject>();
	
	/*
	 * Actual transformation
	 * Start by printing header
	 */
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight/2));
	printModel.add(new PrintableLine(lineHeight, half, width));
	printModel.add(new PrintableNewline(lineHeight));
	
	ArrayList<PrintableHorizontalLineObject> header = new ArrayList<PrintableHorizontalLineObject>();
	
	header.add(new PrintableString(lineHeight, "FACTUUR: "+model.getNumber(), half+3));
	String dateString = "DATUM : "+model.getDate();
	int dateAnchor = width - fontMetrics.charsWidth(dateString.toCharArray(), 0, dateString.length()) - 5;
	header.add(new PrintableString(lineHeight, dateString, dateAnchor-15));
	
	printModel.add(new PrintableMulti(lineHeight, header));
	
	printModel.add(new PrintableLine(lineHeight, half, width));
	
	/*
	 * Print client information
	 */
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	
//	printModel.add(new PrintableString(model.getClient().getContact(), half+3));
	printModel.add(new PrintableString(lineHeight, model.getClient().getFirm(), half+3));
	
	printModel.add(new PrintableNewline(lineHeight));
	
	printModel.add(new PrintableString(lineHeight, model.getClient().getAddress(), half+3));
	
	printModel.add(new PrintableNewline(lineHeight));
	
	printModel.add(new PrintableString(lineHeight, model.getClient().getZipcode()+" "+model.getClient().getMunicipality(), half+3));
	
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableString(lineHeight, "BE 0"+model.getClient().getTaxnumber(), half+3));
	
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	printModel.add(new PrintableNewline(lineHeight));
	
	/*
	 * Print article header
	 */
	printModel.add(new PrintableLine(lineHeight, 0, width));
	printModel.add(new PrintableNewline(lineHeight));
	ArrayList<PrintableHorizontalLineObject> group = new ArrayList<PrintableHorizontalLineObject>();
	group.add(new PrintableString(lineHeight, "Omschrijving artikels", tabs[0]));
	group.add(new PrintableString(lineHeight, "BTW", tabs[1]-commaWidth-zeroWidth*2));
	group.add(new PrintableString(lineHeight, "Hoeveelheid", tabs[2]-threeZeroesWidth));
	group.add(new PrintableString(lineHeight, "Prijs", tabs[3]));
	group.add(new PrintableString(lineHeight, "Totaal", tabs[4]-fontMetrics.charsWidth("Totaal".toCharArray(), 0, "Totaal".length())));
	printModel.add(new PrintableMulti(lineHeight, group));
	printModel.add(new PrintableLine(lineHeight, 0, width));
	printModel.add(new PrintableNewline(lineHeight));
	
	/*
	 * Print invoice articles (InvoiceItems)
	 */
	
//	int offsetPix = fontMetrics.charsWidth("00".toCharArray(), 0, 2) - fontMetrics.charWidth('0');
//	int offsetPix = fontMetrics.charsWidth("00".toCharArray(), 0, 2) - zeroWidth;
	int offsetPix = zeroWidth+2;
	
	for (InvoiceItem invoiceItem : model.items()) {
	    /*
	     * Group per savings?
	     */
	    ArrayList<PrintableHorizontalLineObject> ii = new ArrayList<PrintableHorizontalLineObject>();
	    ii.add(new PrintableString(lineHeight, invoiceItem.getArticlename(), tabs[0]));
	    String tax = oneFormatter.format(invoiceItem.getTaxes());
	    String[] tp = tax.split(",");
	    int offset = tp[0].length();
	    for (char c : tp[0].toCharArray()) {
		ii.add(new PrintableString(lineHeight, ""+c, tabs[1]-offsetPix*offset));
		offset--;
	    }
//	    ii.add(new PrintableString(lineHeight, tp[0], tabs[1]-commaWidth-fontMetrics.charsWidth(tp[0].toCharArray(), 0, tp[0].length())));
	    ii.add(new PrintableString(lineHeight, ","+tp[1], tabs[1]));
	    
	    String amount = threeFormatter.format(invoiceItem.getAmount());
	    String[] ap = amount.split(",");
	    offset = ap[0].length();
	    for (char c : ap[0].toCharArray()) {
		ii.add(new PrintableString(lineHeight, ""+c, tabs[2]-offsetPix*offset));
		offset--;
	    }
//	    ii.add(new PrintableString(lineHeight, ap[0], tabs[2]-commaWidth-fontMetrics.charsWidth(ap[0].toCharArray(), 0, ap[0].length())));
	    ii.add(new PrintableString(lineHeight, ","+ap[1]+" "+invoiceItem.getArticle().getUnit(), tabs[2]));
	    
	    String price = threeFormatter.format(invoiceItem.getPrice());
	    String[] pp = price.split(",");
	    offset = pp[0].length();
	    for (char c : pp[0].toCharArray()) {
		ii.add(new PrintableString(lineHeight, ""+c, tabs[3]-offsetPix*offset));
		offset--;
	    }
//	    ii.add(new PrintableString(lineHeight, pp[0], tabs[3]-commaWidth-fontMetrics.charsWidth(pp[0].toCharArray(), 0, pp[0].length())));
	    ii.add(new PrintableString(lineHeight, ","+pp[1], tabs[3]));
	    
	    String tot = threeFormatter.format(invoiceItem.getPrice()*invoiceItem.getAmount());
	    String[] parts = tot.split(",");
	    offset = parts[0].length();
	    for (char c : parts[0].toCharArray()) {
		ii.add(new PrintableString(lineHeight, ""+c, tabs[4]-threeZeroesWidth-offsetPix*offset));
		offset--;
	    }
//	    ii.add(new PrintableString(lineHeight, parts[0], tabs[4]-commaWidth-threeZeroesWidth-fontMetrics.charsWidth(parts[0].toCharArray(), 0, parts[0].length())));
	    ii.add(new PrintableString(lineHeight, ","+parts[1], tabs[4]-threeZeroesWidth));
	    
	    printModel.add(new PrintableMulti(lineHeight, ii));
	    
	    printModel.add(new PrintableNewline(lineHeight/2));
	}
	
	return printModel;
    }