org.oscarehr.document.web.SplitDocumentAction.java Source code

Java tutorial

Introduction

Here is the source code for org.oscarehr.document.web.SplitDocumentAction.java

Source

/**
 * Copyright (c) 2008-2012 Indivica Inc.
 *
 * This software is made available under the terms of the
 * GNU General Public License, Version 2, 1991 (GPLv2).
 * License details are available via "indivica.ca/gplv2"
 * and "gnu.org/licenses/gpl-2.0.html".
 */
package org.oscarehr.document.web;

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.oscarehr.common.dao.PatientLabRoutingDao;
import org.oscarehr.common.dao.ProviderInboxRoutingDao;
import org.oscarehr.common.dao.ProviderLabRoutingDao;
import org.oscarehr.common.dao.QueueDocumentLinkDao;
import org.oscarehr.common.model.PatientLabRouting;
import org.oscarehr.common.model.ProviderInboxItem;
import org.oscarehr.common.model.ProviderLabRoutingModel;
import org.oscarehr.document.dao.DocumentDAO;
import org.oscarehr.document.model.CtlDocument;
import org.oscarehr.document.model.CtlDocumentPK;
import org.oscarehr.document.model.Document;
import org.oscarehr.util.LoggedInInfo;
import org.oscarehr.util.SpringUtils;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import oscar.dms.EDoc;
import oscar.dms.EDocUtil;
import oscar.oscarLab.ca.all.upload.ProviderLabRouting;

public class SplitDocumentAction extends DispatchAction {

    private DocumentDAO documentDAO = null;

    public void setDocumentDAO(DocumentDAO documentDAO) {
        this.documentDAO = documentDAO;
    }

    public ActionForward split(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        String docNum = request.getParameter("document");
        String[] commands = request.getParameterValues("page[]");

        Document doc = documentDAO.getDocument(docNum);

        //      String docdownload = oscar.OscarProperties.getInstance().getProperty("DOCUMENT_DIR");
        //      new File(docdownload);
        String docdownload = EDocUtil.getDocumentDir(doc.getDocfilename());

        String newFilename = doc.getDocfilename();
        String dbPrefix = EDocUtil.getDocumentPrefix(doc.getDocfilename());

        //      FileInputStream input = new FileInputStream(docdownload + doc.getDocfilename());
        FileInputStream input = new FileInputStream(EDocUtil.getDocumentPath(newFilename));
        PDFParser parser = new PDFParser(input);
        parser.parse();
        PDDocument pdf = parser.getPDDocument();

        PDDocument newPdf = new PDDocument();

        List pages = pdf.getDocumentCatalog().getAllPages();

        if (commands != null) {
            for (String c : commands) {
                String[] command = c.split(",");
                int pageNum = Integer.parseInt(command[0]);
                int rotation = Integer.parseInt(command[1]);

                PDPage p = (PDPage) pages.get(pageNum - 1);
                p.setRotation(rotation);

                newPdf.addPage(p);
            }

        }

        //newPdf.save(docdownload + newFilename);

        if (newPdf.getNumberOfPages() > 0) {
            LoggedInInfo loggedInInfo = LoggedInInfo.loggedInInfo.get();

            //         EDoc newDoc = new EDoc("","", newFilename, "", loggedInInfo.loggedInProvider.getProviderNo(), doc.getDoccreator(), "", 'A', oscar.util.UtilDateUtilities.getToday("yyyy-MM-dd"), "", "", "demographic", "-1",0);
            EDoc newDoc = new EDoc("", "", EDocUtil.getDocumentFileName(newFilename), "",
                    loggedInInfo.loggedInProvider.getProviderNo(), doc.getDoccreator(), "", 'A',
                    oscar.util.UtilDateUtilities.getToday("yyyy-MM-dd"), "", "", "demographic", "-1", 0);
            newDoc.setFileName(dbPrefix + '.' + newDoc.getFileName());
            newDoc.setDocPublic("0");
            newDoc.setContentType("application/pdf");
            newDoc.setNumberOfPages(newPdf.getNumberOfPages());

            String newDocNo = EDocUtil.addDocumentSQL(newDoc);

            //         //newPdf.save(docdownload + newDoc.getFileName());
            System.gc(); //avoid Windows lock on channel
            newPdf.save(docdownload + EDocUtil.getDocumentFileName(newDoc.getFileName()));
            newPdf.close();

            WebApplicationContext ctx = WebApplicationContextUtils
                    .getRequiredWebApplicationContext(request.getSession().getServletContext());
            ProviderInboxRoutingDao providerInboxRoutingDao = (ProviderInboxRoutingDao) ctx
                    .getBean("providerInboxRoutingDAO");
            providerInboxRoutingDao.addToProviderInbox("0", newDocNo, "DOC");

            List<ProviderInboxItem> routeList = providerInboxRoutingDao.getProvidersWithRoutingForDocument("DOC",
                    docNum);
            for (ProviderInboxItem i : routeList) {
                providerInboxRoutingDao.addToProviderInbox(i.getProviderNo(), newDocNo, "DOC");
            }

            providerInboxRoutingDao.addToProviderInbox(loggedInInfo.loggedInProvider.getProviderNo(), newDocNo,
                    "DOC");

            QueueDocumentLinkDao queueDocumentLinkDAO = (QueueDocumentLinkDao) ctx.getBean("queueDocumentLinkDAO");
            Integer qid = 1;
            Integer did = Integer.parseInt(newDocNo.trim());
            queueDocumentLinkDAO.addToQueueDocumentLink(qid, did);

            ProviderLabRoutingDao providerLabRoutingDao = (ProviderLabRoutingDao) SpringUtils
                    .getBean("providerLabRoutingDao");

            List<ProviderLabRoutingModel> result = providerLabRoutingDao.getProviderLabRoutingDocuments(docNum);
            if (!result.isEmpty()) {
                new ProviderLabRouting().route(newDocNo, result.get(0).getProviderNo(), "DOC");
            }

            PatientLabRoutingDao patientLabRoutingDao = (PatientLabRoutingDao) SpringUtils
                    .getBean("patientLabRoutingDao");
            List<PatientLabRouting> result2 = patientLabRoutingDao.findDocByDemographic(docNum);

            if (!result2.isEmpty()) {
                PatientLabRouting newPatientRoute = new PatientLabRouting();

                newPatientRoute.setDemographicNo(result2.get(0).getDemographicNo());
                newPatientRoute.setLabNo(Integer.parseInt(newDocNo));
                newPatientRoute.setLabType("DOC");

                patientLabRoutingDao.persist(newPatientRoute);
            }

            DocumentDAO documentDao = (DocumentDAO) SpringUtils.getBean("documentDAO");
            CtlDocument result3 = documentDao.getCtrlDocument(Integer.parseInt(docNum));

            if (result3 != null) {
                CtlDocumentPK ctlDocumentPK = new CtlDocumentPK(Integer.parseInt(newDocNo), "demographic");
                CtlDocument newCtlDocument = new CtlDocument(ctlDocumentPK, result3.getModuleId());
                newCtlDocument.setStatus(result3.getStatus());
                documentDao.saveCtlDocument(newCtlDocument);
            }

        }

        pdf.close();
        input.close();

        return mapping.findForward("success");
    }

    public ActionForward rotate180(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        Document doc = documentDAO.getDocument(request.getParameter("document"));

        //      String docdownload = oscar.OscarProperties.getInstance().getProperty("DOCUMENT_DIR");
        String docdownload = EDocUtil.getDocumentPath(doc.getDocfilename());

        if (doc.getContenttype().equals("application/pdf")) {
            FileInputStream input = null;
            PDDocument pdf = null;
            try {
                //      FileInputStream input = new FileInputStream(docdownload + doc.getDocfilename());
                input = new FileInputStream(docdownload);
                PDFParser parser = new PDFParser(input);
                parser.parse();
                pdf = parser.getPDDocument();
                int x = 1;
                for (Object p : pdf.getDocumentCatalog().getAllPages()) {
                    PDPage pg = (PDPage) p;
                    Integer r = (pg.getRotation() != null ? pg.getRotation() : 0);
                    pg.setRotation((r + 180) % 360);

                    ManageDocumentAction.deleteCacheVersion(doc, x);
                    x++;
                }

                //      pdf.save(docdownload + doc.getDocfilename());
                pdf.save(docdownload);

            } finally {
                if (pdf != null)
                    pdf.close();
                input.close();
            }

        } else if (doc.getContenttype().equals("image/jpg") || doc.getContenttype().equals("image/png")
                || doc.getContenttype().equals("image/gif")) {
            String documentDir = EDocUtil.getDocumentDir(doc.getDocfilename());
            File file = new File(documentDir + doc.getDocfilename());
            BufferedImage image = ImageIO.read(file);
            if (image == null)
                return null;
            BufferedImage rotatedImage = new BufferedImage(image.getHeight(), image.getWidth(),
                    BufferedImage.TYPE_INT_ARGB);

            String suffix = null;
            String contentType = doc.getContenttype();
            if (contentType.equalsIgnoreCase("image/jpg") || contentType.equalsIgnoreCase("image/jpeg")) {
                suffix = "jpg";
            } else if (contentType.equalsIgnoreCase("image/png")) {
                suffix = "png";
            } else if (contentType.equalsIgnoreCase("image/gif")) {
                suffix = "gif";
            }
            AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
            tx = AffineTransform.getScaleInstance(-1, -1);
            tx.translate(-image.getWidth(null), -image.getHeight(null));
            AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
            image = op.filter(image, null);
            ImageIO.write(image, suffix, file);
        } else {
            //umknown type - does nothing
        }

        return null;
    }

    public ActionForward rotate90(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        Document doc = documentDAO.getDocument(request.getParameter("document"));

        FileInputStream input = new FileInputStream(EDocUtil.getDocumentPath(doc.getDocfilename()));
        PDFParser parser = new PDFParser(input);
        parser.parse();
        PDDocument pdf = parser.getPDDocument();
        int x = 1;
        for (Object p : pdf.getDocumentCatalog().getAllPages()) {
            PDPage pg = (PDPage) p;
            Integer r = (pg.getRotation() != null ? pg.getRotation() : 0);
            pg.setRotation((r + 90) % 360);

            ManageDocumentAction.deleteCacheVersion(doc, x);
            x++;
        }

        pdf.save(EDocUtil.getDocumentPath(doc.getDocfilename()));
        pdf.close();

        input.close();

        return null;

    }

    public ActionForward removeFirstPage(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        Document doc = documentDAO.getDocument(request.getParameter("document"));

        //      String docdownload = oscar.OscarProperties.getInstance().getProperty("DOCUMENT_DIR");
        String docdownload = EDocUtil.getDocumentPath(doc.getDocfilename());

        //      FileInputStream input = new FileInputStream(docdownload + doc.getDocfilename());
        FileInputStream input = new FileInputStream(docdownload);
        PDFParser parser = new PDFParser(input);
        parser.parse();
        PDDocument pdf = parser.getPDDocument();

        // Documents must have at least 2 pages, for the first page to be removed.
        if (pdf.getNumberOfPages() <= 1) {
            return null;
        }

        int x = 1;
        for (Object p : pdf.getDocumentCatalog().getAllPages()) {
            ManageDocumentAction.deleteCacheVersion(doc, x);
            x++;
        }

        pdf.removePage(0);

        EDocUtil.subtractOnePage(request.getParameter("document"));

        //      pdf.save(docdownload + doc.getDocfilename());
        System.gc(); //avoid Win channel lock problem
        pdf.save(docdownload);
        pdf.close();

        input.close();

        return null;
    }

}