package fi.lpam.ruokamanageri.tulostajat; import fi.lpam.ruokamanageri.gui.virheDialogit.SiirtoVirhe; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.apache.pdfbox.pdmodel.font.Standard14Fonts; import org.apache.pdfbox.printing.PDFPageable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.IOException; public abstract class Tulostaja { final PDRectangle SIVUKOKO = PDRectangle.A4; final PDFont FONTTI = new PDType1Font(Standard14Fonts.FontName.HELVETICA); final float FONTTI_KOKO = 13; final float MARGINAALI = 50; final float RIVI_KORKEUS = FONTTI_KOKO * 1.2F; final PDDocument dokumentti; PDPage nykyinenSivu = null; PDPageContentStream sisältö = null; final float sivunLeveys; final float startX; final float startY; float yOffset; float xOffset; public Tulostaja() { dokumentti = new PDDocument(); sivunLeveys = SIVUKOKO.getWidth() - 2 * MARGINAALI; startX = SIVUKOKO.getLowerLeftX() + MARGINAALI; startY = SIVUKOKO.getUpperRightY() - MARGINAALI; yOffset = startY; xOffset = 0; uusiSivu(); } /**Luo uuden sivun dokumenttiin ja alustaa sisältö muuttujan valmiiksi*/ void uusiSivu() { try { if (sisältö != null) { sisältö.endText(); sisältö.close(); } PDPage uusiSivu = new PDPage(SIVUKOKO); dokumentti.addPage(uusiSivu); nykyinenSivu = uusiSivu; sisältö = new PDPageContentStream(dokumentti, uusiSivu); sisältö.setFont(FONTTI, FONTTI_KOKO); sisältö.beginText(); sisältö.newLineAtOffset(startX, startY); yOffset = startY; } catch (IOException e) { handleIOException(e); } } /**Siirtää osoittimen rivin alkuun, siirtää riviä alaspäin tY verran*/ void uusiRivi(float tY) { try { sisältö.newLineAtOffset(-xOffset, -tY); xOffset = 0; yOffset -= tY; } catch (IOException e) { handleIOException(e); } } /**Siirtää osoittimen uuden rivin alkuun*/ void uusiRivi() { uusiRivi(RIVI_KORKEUS); } /**Siirtää osoitinta sivulla. + oikealle, - vasemmalle*/ void siirräOsoitinta(@SuppressWarnings("SameParameterValue") float tX) { try { sisältö.newLineAtOffset(tX, 0); xOffset += tX; } catch (IOException e) { handleIOException(e); } } /**Avaa järjestelmän tulostusikkunan dokumentille*/ void tulosta() { try { sisältö.endText(); sisältö.close(); PrinterJob tuloste = PrinterJob.getPrinterJob(); tuloste.setPageable(new PDFPageable(dokumentti)); if (tuloste.printDialog()) { tuloste.print(); } } catch (PrinterException ex) { System.out.println("Error: " + ex.getMessage()); } catch (IOException ex) { handleIOException(ex); } } /**Käsittelee pdfboxin IOExceptionit*/ void handleIOException(IOException e) { SiirtoVirhe virhe = new SiirtoVirhe(e); virhe.showAndWait(); } }