/* * $Id: DocumentServiceBean.java,v 1.4 2005/10/13 18:36:11 laddi Exp $ * Created on 15.10.2004 * * Copyright (C) 2004 Idega Software hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. * Use is subject to license terms. */ package se.idega.idegaweb.commune.printing.business; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Collection; import java.util.Iterator; import javax.ejb.CreateException; import se.idega.idegaweb.commune.message.business.CommuneMessageBusiness; import se.idega.idegaweb.commune.message.data.MessageConstants; import se.idega.idegaweb.commune.message.data.PrintMessage; import se.idega.idegaweb.commune.message.data.PrintedLetterMessage; import se.idega.idegaweb.commune.message.data.SystemArchivationMessage; import se.idega.idegaweb.commune.printing.data.PrintDocuments; import se.idega.idegaweb.commune.printing.data.PrintDocumentsHome; import com.idega.block.pdf.business.PrintingContext; import com.idega.block.pdf.business.PrintingService; import com.idega.business.IBOLookupException; import com.idega.business.IBORuntimeException; import com.idega.business.IBOServiceBean; import com.idega.core.file.data.ICFile; import com.idega.core.file.data.ICFileHome; import com.idega.idegaweb.IWUserContext; import com.idega.io.MemoryFileBuffer; import com.idega.io.MemoryInputStream; import com.idega.io.MemoryOutputStream; import com.lowagie.text.Document; import com.lowagie.text.pdf.PdfCopy; import com.lowagie.text.pdf.PdfImportedPage; import com.lowagie.text.pdf.PdfReader; /** * * Last modified: $Date: 2005/10/13 18:36:11 $ by $Author: laddi $ * * @author <a href="mailto:aron@idega.com">aron</a> * @version $Revision: 1.4 $ */ public class DocumentServiceBean extends IBOServiceBean implements DocumentService{ /** * Creates a pdf letter from a template which is chosen from the message type. * Returns a primaryKey to a file in database */ public Integer createPDF(IWUserContext iwuc,PrintMessage msg, String fileName, boolean flagPrinted)throws ContentCreationException{ try { MemoryFileBuffer buffer = new MemoryFileBuffer(); OutputStream mos = new MemoryOutputStream(buffer); InputStream mis = new MemoryInputStream(buffer); PrintingContext pcx = getPrintingContext(iwuc,msg); pcx.setDocumentStream(mos); getPrintingService().printDocument(pcx); return storeStreamToICFile(iwuc,getMessageService(),msg,mis,fileName,buffer.length(),flagPrinted); } catch (Exception e) { throw new ContentCreationException(e); } } private Integer storeStreamToICFile(IWUserContext iwuc,CommuneMessageBusiness msgServ,PrintMessage msg,InputStream is,String fileName,int lengthOfFile,boolean flagPrinted) { try { ICFile file = createFile(null,fileName,is,lengthOfFile); msgServ.setMessageFile(msg,flagPrinted,iwuc.getCurrentUser(),file); return (Integer)file.getPrimaryKey(); } catch (Exception e){ throw new IBORuntimeException(e); } } public Integer createPDF(IWUserContext iwuc,String[] ids, String type, String fileName,boolean flagPrinted){ try { Collection msgs = getBusiness().getPrintedMessagesByPrimaryKeys(ids,type); return createPDF(iwuc,msgs,type,fileName,flagPrinted); } catch (Exception e) { throw new ContentCreationException(e); } } /** * Creates a pdf letter from a template which is chosen from the message type. * Returns a primaryKey to a file in database */ public Integer createPDF(IWUserContext iwuc,Collection msgs,String type, String fileName,boolean flagPrinted){ OutputStream outerOs = null; InputStream outerIs = null; try { MemoryFileBuffer outerBuf = new MemoryFileBuffer(); outerOs = new MemoryOutputStream(outerBuf); outerIs = new MemoryInputStream(outerBuf); // // step 1: creation of a document-object Document document = new Document(); // step 2: we create a writer that listens to the document PdfCopy writer = new PdfCopy(document, outerOs); // step 3: we open the document document.open(); ICFile bulkFile = getICFileHome().create(); bulkFile.store(); PrintingService pserv = getPrintingService(); CommuneMessageBusiness msgBuiz = getMessageService(); int lettersProcessed = 0; for (Iterator iter = msgs.iterator(); iter.hasNext();) { PrintMessage msg = (PrintMessage) iter.next(); MemoryFileBuffer buffer = new MemoryFileBuffer(); OutputStream mos = new MemoryOutputStream(buffer); InputStream mis = new MemoryInputStream(buffer); PrintingContext pcx = getPrintingContext(iwuc,msg); pcx.setDocumentStream(mos); pserv.printDocument(pcx); PdfReader reader = new PdfReader(buffer.buffer()); PdfImportedPage page; int n = reader.getNumberOfPages(); for (int i = 0; i < n; ) { ++i; page = writer.getImportedPage(reader, i); writer.addPage(page); } lettersProcessed++; storeStreamToICFile(iwuc,msgBuiz,msg,mis,fileName,buffer.length(),flagPrinted); msg.setMessageBulkData(bulkFile); msg.store(); } document.close(); bulkFile = createFile(bulkFile,fileName,outerIs,outerBuf.length()); PrintDocuments pdocs = getPrintDocumentsHome().create(); pdocs.setDocument(bulkFile); pdocs.setNumberOfSubDocuments(lettersProcessed); pdocs.setCreator(iwuc.getCurrentUser()); pdocs.setType(type); pdocs.store(); return (Integer)bulkFile.getPrimaryKey(); } catch (Exception e) { throw new ContentCreationException(e); } finally{ try { outerOs.close(); outerIs.close(); } catch (Exception ex) { ex.printStackTrace(); } } } public PrintingContext getPrintingContext(IWUserContext iwuc,PrintMessage msg){ if (msg instanceof PrintedLetterMessage) { PrintedLetterMessage pmsg = (PrintedLetterMessage) msg; if (pmsg.getLetterType().equals(MessageConstants.LETTER_TYPE_PASSWORD)) return new PasswordLetterContext(iwuc,msg); else if (pmsg.getLetterType().equals(MessageConstants.LETTER_TYPE_DEFAULT)) return new DefaultLetterContext(iwuc,msg); } else if (msg instanceof SystemArchivationMessage) { return new ArchiveLetterContext(iwuc,msg); } return new MessageLetterContext(iwuc,msg); } private ICFile createFile(ICFile file,String fileName,InputStream is,int length) throws CreateException{ if(file==null) file = getICFileHome().create(); if(!fileName.endsWith(".pdf") && !fileName.endsWith(".PDF")) fileName +=".pdf"; createBackup(fileName,is); file.setFileValue(is); file.setMimeType("application/x-pdf"); file.setName(fileName ); file.setFileSize(length); file.store(); return file; } private void createBackup(String fileName,InputStream mis){ try { /* *** writing pdf to cachefolder manually*/ String folder = getIWApplicationContext().getIWMainApplication().getRealPath(getIWApplicationContext().getIWMainApplication().getCacheDirectoryURI()+"/prints"); java.io.File tfile = com.idega.util.FileUtil.getFileAndCreateIfNotExists(folder,fileName); java.io.FileOutputStream fos = new java.io.FileOutputStream(tfile); java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); while (mis.available() > 0) { baos.write(mis.read()); } baos.writeTo(fos); baos.flush(); baos.close(); mis.reset(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* public void rugl(){ int f = 0; String outFile = args[args.length-1]; Document document = null; PdfCopy writer = null; while (f < args.length-1) { // we create a reader for a certain document PdfReader reader = new PdfReader(args[f]); reader.consolidateNamedDestinations(); // we retrieve the total number of pages int n = reader.getNumberOfPages(); List bookmarks = SimpleBookmark.getBookmark(reader); if (bookmarks != null) { if (pageOffset != 0) SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset, null); master.addAll(bookmarks); } pageOffset += n; System.out.println("There are " + n + " pages in " + args[f]); if (f == 0) { // step 1: creation of a document-object document = new Document(reader.getPageSizeWithRotation(1)); // step 2: we create a writer that listens to the document writer = new PdfCopy(document, new FileOutputStream(outFile)); // step 3: we open the document document.open(); } // step 4: we add content PdfImportedPage page; for (int i = 0; i < n; ) { ++i; page = writer.getImportedPage(reader, i); writer.addPage(page); System.out.println("Processed page " + i); } PRAcroForm form = reader.getAcroForm(); if (form != null) writer.copyAcroForm(reader); f++; } if (master.size() > 0) writer.setOutlines(master); // step 5: we close the document document.close(); } */ protected ICFileHome getICFileHome() { try { return (ICFileHome) getIDOHome(ICFile.class); } catch (Exception e) { throw new IBORuntimeException(e); } } protected PrintDocumentsHome getPrintDocumentsHome() { try { return (PrintDocumentsHome) getIDOHome(PrintDocuments.class); } catch (Exception e) { throw new IBORuntimeException(e); } } public PrintingService getPrintingService()throws IBOLookupException{ return (PrintingService)getServiceInstance(PrintingService.class); } private DocumentBusiness getBusiness()throws IBOLookupException{ return (DocumentBusiness)getServiceInstance(DocumentBusiness.class); } public CommuneMessageBusiness getMessageService()throws IBOLookupException { return (CommuneMessageBusiness) getServiceInstance(CommuneMessageBusiness.class); } }