Java generovani PDF: vytvoreni stitku na obalky z MS Excelu

Nedavno jsem si hral s generovanim PDF v Jave. Napsal jsem jednoduchy kod, ktery vygeneruje seznam adres na obalky do PDF. Data jsou pripavena v MS Excelu. Kod je priserne zpraseny, ale treba se nekomu pro inspiraci bude hodit 😉

Soubor s daty v MS Excelu musi mit presne stejne nadpisy bunek, jako je na obrazku. Tato slova jsou napevne zadratovana v kodu, samozrejme by nebyl problem udelat jednoduche GUI, ve kterem by si uzivatel naklikal, co chce. Data v Excelu je nutne ulozit do formatu CSV.

Vysledny CSV soubor vypada nasledovne:

Jmeno;Ulice;Mesto;Pohlavi
Karel Smolny;Nadrazni 123;Hradec Kralové III;muz
Marek Jurda;Studentska 95;Pardubice 2;muz
Pavla Novakova;Zerotinovo nam. 617/9;Brno;zena
Martin Pavlasek;17.listopadu 2172/15;Ostrava-Poruba;muz
Pavel Jirasek;Technicka 1902/2;Praha 6;muz

V Jave vyuzivam knihovnu JavaCSV z CSVReader.com pod LGPL 2 licenci na zpracovani CSV.
S knihovnou na praci s PDF je to mnohem horsi. ASi nejlepsi a nejznamejsi je iText. Jedna se o dualne licencovanou knihovnu. Prvni je licence AGPL 3 (GNU Affero General Public License) – ta je skoro nepouzitelna. Druha je placena, prave pro pripady, kdy nelze pouzit AGPL. 
Pred nekolika lety byla open source verze iText dostupna pod mnohem mene restriktivni licenci LGPL 2. Tato verze je uz dost obtizne k sehnani (prekvapive). Nastasti si mi ji podarilo najit na GitHubu. Pro kompatibilitu s novou knihovnou je urcena tato. Knihovna pod LGPL je uz nekolik let neudrzovana a neumi vsechno, co jeji aktualni verze!
Knihovny jako Apache PDFBox jsou jen pekne hracky bez dokumentace a tutorialu – ztrata casu se jimi vubec zabyvat…

Tady je ta prasarna: 


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.csvreader.CsvReader;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class AdresyNaObalky {	

    public static void main(String[] args) {

    	List adresy = new ArrayList();

    	try {
  
    		// ############### zpracovani CSV
    		
			CsvReader adresa = new CsvReader("data.csv", ';'); // oddelovac je strednik
			adresa.readHeaders();

	    	while (adresa.readRecord())
			{
				String jmeno = adresa.get("Jmeno"); // *musi* odpovidat nadpisum v excel tabulce
				String ulice = adresa.get("Ulice");
				String mesto = adresa.get("Mesto");			
				String pohlavi = adresa.get("Pohlavi");
				if (pohlavi.equals("muz")) {
					pohlavi = "Pan";				
				} else if (pohlavi.equals("zena")) {
					pohlavi = "Pani";					
				}
				System.out.println(pohlavi + ":" + jmeno + ":" + ulice + ":" + mesto);
				adresy.add(pohlavi + "\n" + jmeno + "\n" + ulice + "\n" + mesto); // pridame adresu
			}

	    	adresa.close();
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	
    	// ############### zpracovani CSV   	
    	
    	
    	// ############### generovani PDF
    	   	
        Document document = new Document(PageSize.A4, 50, 20, 20, 20); // format papiru a okraje
        document.addAuthor("Martin Vancl"); // autor PDF
        document.addCreationDate(); // datum vytvoreni
        document.addTitle("Seznam adres pro tisk"); // nazev PDF dokumentu
        
        try {
            PdfWriter.getInstance(document,
                new FileOutputStream("adresy.pdf"));

            document.open();

            Font font1 = new Font(Font.TIMES_ROMAN, 15, Font.BOLD); // (family, size, style) - http://goo.gl/tm5DG

            int pocet = adresy.size();
            System.out.println(adresy.size());
            if ((pocet % 2) != 0) {
            	pocet++;	
			}
            
    		PdfPTable table = new PdfPTable(2);   
    		table.setWidthPercentage(100);
    		table.getDefaultCell().setBorder(Rectangle.NO_BORDER);

            for (String a : adresy) {
            	System.out.println(a);
            	PdfPCell bunka = new PdfPCell(new Paragraph(a, font1));
            	bunka.setBorder(Rectangle.NO_BORDER);
            	bunka.setPadding(20);
            	table.addCell(bunka);
			}
            if (pocet > adresy.size()) {
            	table.addCell("");				
			}

            document.add(table);
            
            document.close();

        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // ############### generovani PDF
    }
}

 

Po spusteni vyplivne takovyto PDF soubor. JAR soubor ke stazeni. Komplet vse ke stazeni (tabulka v Excelu, zdrojak, knihovny, jar).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *