StampaFattura.java

package control;

import model.acquisto.AcquistoBean;
import model.ordine.OrdineBean;
import model.utente.UtenteBean;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Collection;
import java.util.Map;

@WebServlet("/StampaFattura")
public class StampaFattura extends HttpServlet {

    private static final String FILE_NAME = "fattura.pdf";

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        final String PATH = req.getServletContext().getRealPath("/pdf/");

        PDDocument document = null;
        PDPageContentStream contentStream = null;

        try {
            int idOrdine = Integer.parseInt(req.getParameter("IDOrdine"));

            document = PDDocument.load(new File(PATH + FILE_NAME));

            UtenteBean utenteBean = (UtenteBean) req.getSession().getAttribute("utente");
            Map<OrdineBean, Collection<AcquistoBean>> ordini =
                    (Map<OrdineBean, Collection<AcquistoBean>>) req.getSession().getAttribute("ordini");

            Map.Entry<OrdineBean, Collection<AcquistoBean>> result =
                    findOrder(ordini, idOrdine);

            if (result == null) {
                throw new ServletException();
            }

            OrdineBean ordine = result.getKey();
            Collection<AcquistoBean> acquisti = result.getValue();


            PDPage page = document.getPage(0);
            contentStream = new PDPageContentStream(
                    document,
                    page,
                    PDPageContentStream.AppendMode.APPEND,
                    true
            );

            contentStream.setFont(PDType1Font.HELVETICA, 8);

            contentStream.beginText();
            contentStream.newLineAtOffset(446.609f, 767.3385f);
            contentStream.showText(utenteBean.getNumCarta());
            contentStream.endText();

            contentStream.beginText();
            contentStream.newLineAtOffset(430.864f, 635.7037f);
            contentStream.showText(LocalDate.now()
                    .format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)));
            contentStream.endText();

            contentStream.beginText();
            contentStream.newLineAtOffset(430.864f, 618.963f);
            contentStream.showText(ordine.getDataOrdine()
                    .format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)));
            contentStream.endText();

            contentStream.beginText();
            contentStream.newLineAtOffset(46.6203f, 642.2537f);
            contentStream.showText(utenteBean.getNome());
            contentStream.endText();

            contentStream.beginText();
            contentStream.newLineAtOffset(46.6203f, 631.2537f);
            contentStream.showText(utenteBean.getCognome());
            contentStream.endText();

            contentStream.beginText();
            contentStream.newLineAtOffset(46.6203f, 620.2537f);
            contentStream.showText(utenteBean.getVia() + " " + utenteBean.getCap());
            contentStream.endText();

            contentStream.beginText();
            contentStream.newLineAtOffset(46.6203f, 609.2537f);
            contentStream.showText(utenteBean.getCitta());
            contentStream.endText();

            contentStream.beginText();
            contentStream.newLineAtOffset(405.1517f, 591.2341f);
            contentStream.showText(ordine.getPrezzoTotale() + " euro");
            contentStream.endText();

            float coord = 448.0316f;

            for (AcquistoBean a : acquisti) {
                contentStream.beginText();
                contentStream.newLineAtOffset(92.7409f, coord);
                contentStream.showText(String.valueOf(a.getIDMaglietta()));
                contentStream.endText();

                contentStream.beginText();
                contentStream.newLineAtOffset(288.2813f, coord);
                contentStream.showText(String.valueOf(a.getQuantita()));
                contentStream.endText();

                contentStream.beginText();
                contentStream.newLineAtOffset(344.4793f, coord);
                contentStream.showText(a.getPrezzoAq() + " euro");
                contentStream.endText();

                contentStream.beginText();
                contentStream.newLineAtOffset(515.6068f, coord);
                contentStream.showText((a.getPrezzoAq() * a.getQuantita()) + " euro");
                contentStream.endText();

                coord -= 15;
            }

            contentStream.close();
            document.save(new File(PATH + "output.pdf"));
            document.close();

            resp.setContentType("application/pdf");
            resp.setCharacterEncoding("UTF-8");
            resp.setHeader("Content-Disposition", "attachment; filename=output.pdf");
            resp.sendRedirect("pdf/output.pdf");

        } catch (NumberFormatException | IOException | ServletException e) {
            if (contentStream != null) {
                try {
                    contentStream.close();
                } catch (IOException ignored) {
                    // Ignored
                }
            }
            if (document != null) {
                try {
                    document.close();
                } catch (IOException ignored) {
                    // Ignored
                }
            }
            req.getRequestDispatcher("/pages/errorpage.jsp").forward(req, resp);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

    private Map.Entry<OrdineBean, Collection<AcquistoBean>> findOrder(
            Map<OrdineBean, Collection<AcquistoBean>> ordini,
            int idOrdine) {

        for (Map.Entry<OrdineBean, Collection<AcquistoBean>> entry : ordini.entrySet()) {
            if (entry.getKey().getID() == idOrdine) {
                return entry;
            }
        }
        return null;
    }

}