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:
1 2 3 4 5 6 |
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<br /> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
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<String> adresy = new ArrayList<String>(); 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).