/* * $Id: MessageBusinessBean.java,v 1.16 2002/10/08 22:16:29 tryggvil Exp $ * * Copyright (C) 2002 Idega 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.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.rmi.RemoteException; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; import java.util.StringTokenizer; import javax.ejb.FinderException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import se.idega.idegaweb.commune.business.CommuneUserBusiness; import se.idega.idegaweb.commune.business.NoUserAddressException; import se.idega.idegaweb.commune.message.business.CommuneMessageBusiness; import se.idega.idegaweb.commune.message.business.MessagePdfHandler; import se.idega.idegaweb.commune.message.data.MessageConstants; import se.idega.idegaweb.commune.message.data.MessageHandlerInfo; import se.idega.idegaweb.commune.message.data.MessageHandlerInfoHome; import se.idega.idegaweb.commune.message.data.PrintMessage; import se.idega.idegaweb.commune.message.data.PrintedLetterMessage; import se.idega.idegaweb.commune.message.data.PrintedLetterMessageHome; import se.idega.idegaweb.commune.message.data.SystemArchivationMessage; import se.idega.idegaweb.commune.message.data.SystemArchivationMessageBMPBean; import se.idega.idegaweb.commune.message.data.SystemArchivationMessageHome; import se.idega.idegaweb.commune.presentation.CommuneBlock; import se.idega.idegaweb.commune.printing.data.PrintDocuments; import se.idega.idegaweb.commune.printing.data.PrintDocumentsHome; import com.idega.block.process.data.Case; import com.idega.business.IBORuntimeException; import com.idega.core.file.data.ICFile; import com.idega.core.file.data.ICFileHome; import com.idega.core.location.data.Address; import com.idega.core.location.data.Country; import com.idega.idegaweb.IWBundle; import com.idega.io.MemoryFileBuffer; import com.idega.io.MemoryInputStream; import com.idega.io.MemoryOutputStream; import com.idega.user.data.User; import com.idega.util.IWColor; import com.idega.util.IWTimestamp; import com.idega.util.LocaleUtil; import com.idega.xml.XMLDocument; import com.idega.xml.XMLElement; import com.idega.xml.XMLOutput; import com.lowagie.text.BadElementException; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.ElementTags; import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.Rectangle; import com.lowagie.text.markup.MarkupTags; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.ColumnText; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfTemplate; import com.lowagie.text.pdf.PdfWriter; import com.lowagie.text.xml.SAXmyHandler; import com.lowagie.text.xml.XmlPeer; /** * @author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson </a> * @author <a href="mailto:aron@idega.is">Aron Birkir </a> * @version 1.0 * * Scale dimension of the logo and the position of it can be set with bundle * properties in the commune bundle. (Use BundlePropertySetter) * * The position of the address box can also be set with bundle properties. * * The properties concerning these settings are all prefixed with "printing.". * * To activate the bundle property changes you need to set the bundle property * "printing.dimension_refresh" to "true"; * * Every measure is in millimeters(mm). X coordinates are measured from the left * side of the page(paper). y coordinates are measured from bottom of the page * * The address box is specified with its lower left corner coordinates and upper * right corner coordinates */ public class DocumentBusinessBean extends com.idega.business.IBOServiceBean implements DocumentBusiness { //private Font defaultTitleFont; private static Font defaultParagraphFont; //private Font defaultTagFont; private static Font defaultTextFont; private static Font defaultAddressTextFont; //private boolean oldstyle = false; private static final int ADDRESS_ERROR = -5; ///////////////////////////////// // defined in millimeters: private static int logoScaleHeight = 15; private static int logoScaleWidth = 30; private static int logoAbsPosX = 25; private static int logoAbsPosY = 267; private static int addressLowerLeftX = 20 + 95; private static int addressLowerLeftY = 231; private static int addressUpperRightX = 193; private static int addressUpperRightY = 257; private static int newlinesBetween = 8; private static boolean initRefresh = true; ////////////////////////////// /** * Method getDefaultTextFont. * * @return Font */ private Font getDefaultTextFont() { if (defaultTextFont == null) { defaultTextFont = new Font(Font.HELVETICA); defaultTextFont.setSize(12); } return defaultTextFont; } private Font getDefaultAddressTextFont() { if (defaultAddressTextFont == null) { defaultAddressTextFont = new Font(Font.HELVETICA); defaultAddressTextFont.setSize(12); } return defaultAddressTextFont; } /* * Commented out since it is never used... private Font getDefaultTagFont() { * if (defaultTagFont == null) { defaultTagFont = new Font(Font.HELVETICA); * defaultTagFont.setSize(12); } return defaultTagFont; } */ /** * Method getDefaultParagraphFont. * * @return Font */ private Font getDefaultParagraphFont() { if (defaultParagraphFont == null) { defaultParagraphFont = new Font(Font.HELVETICA, 12, Font.BOLD); } return defaultParagraphFont; } /* * Commented out since it is never used... private Font getDefaultTitleFont() { * if (defaultTitleFont == null) { defaultTitleFont = new * Font(Font.HELVETICA); defaultTitleFont.setSize(12); } return * defaultTitleFont; } */ private Font getTextFont() { return getDefaultTextFont(); } private Font getAddressFont() { return getDefaultAddressTextFont(); } /* * Commented out since it is never used... private Font * getTagFont(PrintedLetterMessage msg) { return getDefaultTagFont(); } */ /* * Commented out since it is never used... private Font * getParagraphFont(PrintedLetterMessage msg) { return * getDefaultParagraphFont(); } */ /* * Commented out since it is never used... private Font * getTitleFont(PrintedLetterMessage msg) { return getDefaultTitleFont(); } */ public String getAddressString(User user) { StringBuffer addrString = new StringBuffer(); try { addrString.append(user.getName()); addrString.append("\n"); Address addr = getPostalAddress(user); if (addr != null) { addrString.append(addr.getStreetAddress()); addrString.append("\n"); addrString.append(addr.getPostalAddress()); addrString.append("\n"); if (addr.getCountryId() != -1) { Country country = addr.getCountry(); if (!country.getIsoAbbreviation().equalsIgnoreCase("se")) { // see scarab issue nasc58 addrString.append(addr.getCountry().getName()); addrString.append("\n"); } } } } catch (Exception e) { throw new IBORuntimeException(e); } return addrString.toString(); } /** * @param user * @return * @throws NoUserAddressException * @throws RemoteException * @throws RemoteException * @throws NoUserAddressException */ private Address getPostalAddress(User user) throws RemoteException, NoUserAddressException { return getUserBusiness().getPostalAddress(user); } public Collection getPrintedDocuments() throws FinderException { return getPrintDocumentsHome().findAllPrintedLetterDocuments(); } public Collection getPrintedDocuments(String type) throws FinderException { return getPrintDocumentsHome().findAllDocumentByType(type); } public Collection getPrintedDocuments(String type, IWTimestamp from, IWTimestamp to,int resultSize,int startingIndex) throws FinderException { return getPrintDocumentsHome().findAllDocumentByType(type, from, to,resultSize,startingIndex); } public Collection getPrintedMessages(String type,int resultSize,int startingIndex) throws FinderException { if (isTypeSystemArchiveMessage(type)) return getSystemArchivationMessageHome().findPrintedMessages(); return getPrintedLetterMessageHome().findPrintedLettersByType(type,resultSize, startingIndex); } public Collection getPrintedMessagesByPrimaryKeys(String[] primaryKeys, String type) throws FinderException { PrintMessage msg; ArrayList coll = new ArrayList(primaryKeys.length); if (isTypeSystemArchiveMessage(type)) { SystemArchivationMessageHome msgHome = getSystemArchivationMessageHome(); if (msgHome != null) { for (int i = 0; i < primaryKeys.length; i++) { msg = (PrintMessage) msgHome.findByPrimaryKey(primaryKeys[i]); coll.add(msg); } } } else { PrintedLetterMessageHome msgHome = getPrintedLetterMessageHome(); if (msgHome != null) { for (int i = 0; i < primaryKeys.length; i++) { msg = (PrintMessage) msgHome.findByPrimaryKey(primaryKeys[i]); coll.add(msg); } } } return coll; } public Collection getPrintedMessages(String type, IWTimestamp from, IWTimestamp to,int resultSize,int startingIndex) throws FinderException { if (isTypeSystemArchiveMessage(type)) return getSystemArchivationMessageHome().findPrintedMessages(from, to); return getPrintedLetterMessageHome().findPrintedLettersByType(type, from, to, resultSize, startingIndex); } public Collection getUnPrintedMessages(String type,int resultSize,int startingIndex) throws FinderException { if (isTypeSystemArchiveMessage(type)) return getSystemArchivationMessageHome().findUnPrintedMessages(); return getPrintedLetterMessageHome().findUnPrintedLettersByType(type,resultSize, startingIndex); } public Collection getUnPrintedMessages(String type, IWTimestamp from, IWTimestamp to,int resultSize,int startingIndex) throws FinderException { if (isTypeSystemArchiveMessage(type)) return getSystemArchivationMessageHome().findUnPrintedMessages(from, to); return getPrintedLetterMessageHome().findUnPrintedLettersByType(type, from, to,resultSize, startingIndex); } public int getUnPrintedDefaultLettersCount() { return getPrintedLetterMessageHome().getNumberOfUnPrintedDefaultLetters(); } public int getUnPrintedPasswordLettersCount() { return getPrintedLetterMessageHome().getNumberOfUnPrintedPasswordLetters(); } public int getPrintedLettersCountByStatusAndType(String caseStatus, String type) { return getPrintedLetterMessageHome().getNumberOfLettersByStatusAndType(caseStatus, type); } public int getUnprintedLettersCountByType(String type) { return getUnprintedMessagesCountByType(type); } public int getUnprintedMessagesCountByType(String type) { if (isTypeSystemArchiveMessage(type)) return getSystemArchivationMessageHome().getNumberOfUnPrintedMessages(); return getPrintedLetterMessageHome().getNumberOfUnprintedLettersByType(type); } public int getPrintedLettersCountByType(String type) { return getPrintedLetterMessageHome().getNumberOfPrintedLettersByType(type); } public String[] getPrintMessageTypes() { String[] ptypes = getPrintedLetterMessageHome().getPrintMessageTypes(); String[] atypes = getSystemArchivationMessageHome().getPrintMessageTypes(); String[] types = new String[ptypes.length + atypes.length]; System.arraycopy(ptypes, 0, types, 0, ptypes.length); System.arraycopy(atypes, 0, types, ptypes.length, atypes.length); return types; } public boolean isTypeSystemArchiveMessage(String type) { String[] atypes = getSystemArchivationMessageHome().getPrintMessageTypes(); for (int i = 0; i < atypes.length; i++) { if (type.equals(atypes[i])) return true; } return false; } public boolean isBulkLetterType(String type) { if (type.equals(MessageConstants.LETTER_TYPE_PASSWORD)) return true; if (type.equals(SystemArchivationMessageBMPBean.PRINT_TYPE)) return true; return false; } private boolean addTemplateHeader() { return getIWApplicationContext().getApplicationSettings().getDefaultLocale().equals(LocaleUtil.getSwedishLocale()); } /** * Returns an empty array if nothing is found. */ public int[] getUnPrintedLettersIDs(String type,int resultSize,int startingIndex) { try { Collection coll = getPrintedLetterMessageHome().findUnPrintedLettersByType(type,resultSize,startingIndex); if (coll != null && coll.size() > 0) { int[] theReturn = new int[coll.size()]; Iterator iter = coll.iterator(); int counter = 0; while (iter.hasNext()) { PrintedLetterMessage pMessage = (PrintedLetterMessage) iter.next(); theReturn[counter++] = ((Integer) pMessage.getPrimaryKey()).intValue(); } return theReturn; } else { int[] theReturn = new int[0]; return theReturn; } } catch (Exception e) { e.printStackTrace(); throw new IBORuntimeException(e, this); } } /** * Gets the point equal to given millimetercount */ public float getPointsFromMM(float millimeters) { float pointPerMM = 72 / 25.4f; return millimeters * pointPerMM; } protected Document getLetterDocumentTemplate() { //Margins defined in millimeters: float headFootMarginsMM = 9.0f; float leftRightMarginsMM = 30.0f; //Margins defined in points: float headFootMargins = getPointsFromMM(headFootMarginsMM); float leftRightMargins = getPointsFromMM(leftRightMarginsMM); Document document = new Document(PageSize.A4, leftRightMargins, leftRightMargins, headFootMargins, headFootMargins); //document.setMargins(leftRightMargins,leftRightMargins,headFootMargins,headFootMargins); document.addAuthor("IdegaWeb"); document.addSubject("PrintedLetter"); //document.open(); return document; } protected PrintDocumentsHome getPrintDocumentsHome() { try { return (PrintDocumentsHome) getIDOHome(PrintDocuments.class); } catch (Exception e) { throw new IBORuntimeException(e); } } public PrintedLetterMessageHome getPrintedLetterMessageHome() { try { return (PrintedLetterMessageHome) getIDOHome(PrintedLetterMessage.class); } catch (Exception e) { throw new IBORuntimeException(e); } } public SystemArchivationMessageHome getSystemArchivationMessageHome() { try { return (SystemArchivationMessageHome) getIDOHome(SystemArchivationMessage.class); } catch (Exception e) { throw new IBORuntimeException(e); } } protected ICFileHome getICFileHome() { try { return (ICFileHome) getIDOHome(ICFile.class); } catch (Exception e) { throw new IBORuntimeException(e); } } protected CommuneMessageBusiness getMessageBusiness() { try { return (CommuneMessageBusiness) getServiceInstance(CommuneMessageBusiness.class); } catch (Exception e) { throw new IBORuntimeException(e); } } protected CommuneUserBusiness getUserBusiness() { try { return (CommuneUserBusiness) getServiceInstance(CommuneUserBusiness.class); } catch (Exception e) { throw new IBORuntimeException(e); } } public int writeBulkPDF(String[] messageIDs, User performer, String fileName, Locale locale, String type, boolean isAddressMessages, boolean flagMessages, boolean registerBulkData) throws FinderException { int fileId = -1; if (messageIDs.length > 0) { fileId = writeBulkPDF(getPrintedMessagesByPrimaryKeys(messageIDs, type), performer, fileName, locale, type, isAddressMessages, flagMessages, registerBulkData); } return fileId; } public int writeBulkPDF(Collection messages, User performer, String fileName, Locale locale, String type, boolean areAddressMessages, boolean flagMessages, boolean registerBulkData) { int fileId = -1; try { Iterator iter = messages.iterator(); PrintMessage msg = null; PdfTemplate template = null; if (registerBulkData) { MemoryFileBuffer outerBuf = new MemoryFileBuffer(); OutputStream outerDocOS = new MemoryOutputStream(outerBuf); InputStream outerDocIS = new MemoryInputStream(outerBuf); Document outerDocument = getLetterDocumentTemplate(); PdfWriter writer = PdfWriter.getInstance(outerDocument, outerDocOS); outerDocument.open(); ICFile bulkFile = getICFileHome().create(); bulkFile.store(); if (!areAddressMessages) { template = getLetterTemplate(type, writer); } int contentReturn = 0; int lettersProcessed = 0; DocumentPrintContext dpc = new DocumentPrintContext(); dpc.setLocale(locale); dpc.setDocument(outerDocument); dpc.setPdfWriter(writer); dpc.setIWApplicationContext(getIWApplicationContext()); while (iter.hasNext()) { msg = (PrintMessage) iter.next(); dpc.setMessage(msg); if (!areAddressMessages) addTemplateToPage(template, writer, type); //contentReturn = createContent(outerDocument, msg, // performer,writer,locale); //contentReturn = createContent(dpc); createHandlerContent(dpc); //System.err.println("letter content returns : "+contentReturn+" for // msg: "+msg.getPrimaryKey().toString()); if (contentReturn != ADDRESS_ERROR) { outerDocument.newPage(); try { //System.err.println("bulk id = // "+bulkFile.getPrimaryKey().toString()); msg.setMessageBulkData(bulkFile); if (areAddressMessages) { writePDF(msg, performer, fileName, locale, flagMessages); } else if (flagMessages) { getMessageBusiness().flagMessageAsPrinted(performer, msg); } else { msg.store(); } } catch (Exception ex) { ex.printStackTrace(); } lettersProcessed++; } } outerDocument.close(); if (lettersProcessed > 0) { if (registerBulkData) { bulkFile.setFileValue(outerDocIS); bulkFile.setMimeType("application/x-pdf"); bulkFile.setName(fileName + ".pdf"); bulkFile.setFileSize(outerBuf.length()); bulkFile.store(); PrintDocuments pdocs = getPrintDocumentsHome().create(); pdocs.setDocument(bulkFile); pdocs.setNumberOfSubDocuments(lettersProcessed); pdocs.setCreator(performer); pdocs.setType(type); pdocs.store(); fileId = pdocs.getDocumentFileID(); } } try { outerDocOS.close(); outerDocIS.close(); } catch (Exception ex) { ex.printStackTrace(); } } else { while (iter.hasNext()) { msg = (PrintMessage) iter.next(); writePDF(msg, performer, fileName, locale, flagMessages); } } } catch (Exception ex) { ex.printStackTrace(); } return fileId; } public int writePDF(PrintMessage msg, User performer, String fileName, Locale locale, boolean flagPrinted) throws Exception { MemoryFileBuffer buffer = new MemoryFileBuffer(); OutputStream mos = new MemoryOutputStream(buffer); InputStream mis = new MemoryInputStream(buffer); Document document = getLetterDocumentTemplate(); PdfWriter writer = PdfWriter.getInstance(document, mos); document.open(); document.newPage(); DocumentPrintContext dpc = new DocumentPrintContext(); dpc.setDocument(document); dpc.setPdfWriter(writer); dpc.setUser(performer); dpc.setLocale(locale); dpc.setMessage(msg); dpc.setIWApplicationContext(getIWApplicationContext()); //int contentReturn = createContent(document, msg, // performer,writer,locale); //int contentReturn = createContent(dpc); createHandlerContent(dpc); /* * if(contentReturn==ADDRESS_ERROR){ document.close(); try { mos.close(); * mis.close(); } catch (Exception ex) { * } return -1; } */ document.close(); ICFile file = getICFileHome().create(); if(!fileName.endsWith(".pdf") && !fileName.endsWith(".PDF")) fileName +=".pdf"; /* *** 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(); file.setFileValue(mis); file.setMimeType("application/x-pdf"); file.setName(fileName ); file.setFileSize(buffer.length()); file.store(); msg.setMessageData(file); try { if (flagPrinted) { getMessageBusiness().flagMessageAsPrinted(performer, msg); } else { msg.store(); } return msg.getMessageDataFileID(); } catch (Exception ex) { ex.printStackTrace(); } try { mos.close(); mis.close(); } catch (Exception ex) { } return -1; } private void createHandlerContent(DocumentPrintContext dpc) throws ContentCreationException { MessagePdfHandler handler = getMessagePdfHandler(dpc.getMessage()); if (handler != null) handler.createMessageContent(dpc); else { createMessageContent(dpc); } } //private int createContent(Document doc,PrintMessage msg,User // performer,PdfWriter writer,Locale locale)throws Exception { private int createContent(DocumentPrintContext dpc) throws ContentCreationException { PrintMessage msg = dpc.getMessage(); if (msg instanceof PrintedLetterMessage) { PrintedLetterMessage pmsg = (PrintedLetterMessage) msg; if (pmsg.getLetterType().equals(MessageConstants.LETTER_TYPE_PASSWORD)) return createPasswordLetterContent(dpc); else if (pmsg.getLetterType().equals(MessageConstants.LETTER_TYPE_DEFAULT)) return createDefaultLetterContent(dpc); } else if (msg instanceof SystemArchivationMessage) { createArchiveMessageContent(dpc); } return 0; } private void addTemplateToPage(PdfTemplate template, PdfWriter writer, String type) throws Exception { if (template != null) { if (type.equals(MessageConstants.LETTER_TYPE_PASSWORD)) { PdfContentByte cb = writer.getDirectContent(); cb.addTemplate(template, getPointsFromMM(15f), getPointsFromMM(297 - 22)); } } } private PdfTemplate getLetterTemplate(String type, PdfWriter writer) throws Exception { if (type.equals(MessageConstants.LETTER_TYPE_PASSWORD)) { return createPasswordLetterTemplate(writer); } return null; } private PdfTemplate createPasswordLetterTemplate(PdfWriter writer) throws Exception { IWBundle iwb = getIWApplicationContext().getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER); PdfContentByte cb = writer.getDirectContent(); float tempLength = 511f; float tempHeight = getPointsFromMM(40); PdfTemplate template = cb.createTemplate(tempLength, tempHeight); if (addTemplateHeader()) { BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); String mail_zip = iwb.getProperty("commune.mail_zip"); String mail_name = iwb.getProperty("commune.mail_name"); float convLengt = 100f; float convHeight = 60f; template.rectangle(0f, 0f, convLengt, convHeight); template.moveTo(0f, 0f); template.lineTo(convLengt, convHeight); template.moveTo(convLengt, 0f); template.lineTo(0f, convHeight); template.stroke(); template.beginText(); template.setFontAndSize(bf, 11f); template.setTextMatrix(5f, 40f); template.showText(mail_name); template.endText(); template.beginText(); template.setFontAndSize(bf, 11f); template.setTextMatrix(5f, 25f); template.showText(mail_zip); template.endText(); Image porto = Image.getInstance(iwb.getResourcesRealPath() + "/shared/porto_betalt.jpg"); porto.scaleAbsolute(60f, 60f); //Image portoA =Image.getInstance(iwb.getResourcesRealPath()+ // "/shared/porto_a_logo.jpg"); //float Awidth = 2.3f*60f; //portoA.scaleToFit(Awidth,60f); float portoXPos = tempLength - 90f; //float portoAXPos = portoXPos-Awidth-5f; template.addImage(porto, 60f, 0f, 0f, 60f, portoXPos, 0); //template.addImage(portoA,Awidth,0f,0f,60f,portoAXPos,0); } return template; } //private int createPasswordLetterContent(Document // document,PrintedLetterMessage msg,PdfWriter writer,Locale locale) throws // Exception{ private int createPasswordLetterContent(DocumentPrintContext dpc) throws ContentCreationException { IWBundle iwb = getIWApplicationContext().getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER); System.out.println("Default locale: " + getIWApplicationContext().getApplicationSettings().getDefaultLocale().toString()); String sAddrString = ""; PdfContentByte cb = dpc.getPdfWriter().getDirectContent(); Document document = dpc.getDocument(); Locale locale = dpc.getLocale(); PrintMessage msg = dpc.getMessage(); //String mail_zip = iwb.getProperty("commune.mail_zip"); //String mail_name = iwb.getProperty("commune.mail_name"); try { sAddrString = getAddressString(dpc.getMessage().getOwner()); } catch (Exception nouser) { handleNoAddressUser(); System.err.println(nouser.getMessage()); //nouser.printStackTrace(); return ADDRESS_ERROR; } try { if (addTemplateHeader()) { ColumnText ct = new ColumnText(cb); float margin = getPointsFromMM(14); float lly = getPointsFromMM(297 - 22); float ury = lly + 60f; float urx = 595f - margin - 60f - 5f; float llx = 110f + margin; Phrase Ph0 = new Phrase(sAddrString, new Font(Font.HELVETICA, 12, Font.BOLD)); ct.setSimpleColumn(Ph0, llx, lly, urx, ury, 15, Element.ALIGN_LEFT); ct.go(); document.add(new Paragraph("\n\n\n\n\n\n\n")); } { User owner = msg.getOwner(); HashMap tagmap = new CommuneUserTagMap(getIWApplicationContext(), owner); tagmap.putAll(getMessageTagMap(msg, locale)); XmlPeer date = new XmlPeer(ElementTags.CHUNK, "date"); date.setContent(new IWTimestamp().getDateString("dd.MM.yyyy")); tagmap.put(date.getAlias(), date); System.out.println("Date tag: " + date.getTag()); String letterUrl = getXMLLetterUrl(iwb, locale, "password_letter.xml"); if (msg.getBody().indexOf("|") > 0) { StringTokenizer tokenizer = new StringTokenizer(msg.getBody(), "|"); XmlPeer peer = new XmlPeer(ElementTags.ITEXT, "letter"); tagmap.put(peer.getAlias(), peer); if (tokenizer.hasMoreTokens()) { peer = new XmlPeer(ElementTags.CHUNK, "username"); peer.setContent(tokenizer.nextToken()); tagmap.put(peer.getAlias(), peer); } if (tokenizer.hasMoreTokens()) { peer = new XmlPeer(ElementTags.CHUNK, "password"); peer.setContent(tokenizer.nextToken()); tagmap.put(peer.getAlias(), peer); } } javax.xml.parsers.SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); SAXmyHandler handler = new SAXmyHandler(document, tagmap); handler.setControlOpenClose(false); parser.parse(letterUrl, handler); } } catch (Exception e) { throw new ContentCreationException(e); } return 0; } private void handleNoAddressUser() { /* * try{ String status = * getMessageBusiness().getCaseStatusError().getStatus(); * getMessageBusiness().flagMessageWithStatus(performer,msg,status); } * catch(Exception ex){ ex.printStackTrace(); } */ } /** * */ public int createDefaultLetterHeader(Document document, String addressString, PdfWriter writer) throws Exception { createLogoContent(document); if (addressString != null) { createAddressContent(addressString, writer); } createNewlinesContent(document); return 0; } public void createNewlinesContent(Document document) throws DocumentException { StringBuffer newlines = new StringBuffer(newlinesBetween); for (int i = 0; i < newlinesBetween; i++) { newlines.append('\n'); } document.add(new Paragraph(newlines.toString())); } public void createLogoContent(Document document) throws BadElementException, MalformedURLException, IOException, DocumentException { IWBundle iwb = getIWApplicationContext().getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER); checkBundleDimensions(iwb); Image image = Image.getInstance(iwb.getResourcesRealPath() + "/shared/commune_logo.png"); image.scaleToFit(getPointsFromMM(logoScaleWidth), getPointsFromMM(logoScaleHeight)); image.setAbsolutePosition(getPointsFromMM(logoAbsPosX), getPointsFromMM(logoAbsPosY)); document.add(image); } public void createHeaderDate(Document document, PdfWriter writer, String dateString) throws DocumentException { /* * final PdfPTable header = new PdfPTable(new float[]{1}); * header.setWidthPercentage(100f); final PdfPCell defaultCell = * header.getDefaultCell(); defaultCell.setBorder(0); * //defaultCell.setFixedHeight(getPointsFromMM(40)); * defaultCell.setPadding(0); defaultCell.setNoWrap(true); * defaultCell.setVerticalAlignment(align); header.addCell(new Phrase(new * Chunk(dateString, getDefaultParagraphFont()))); document.add(header); */ PdfContentByte cb = writer.getDirectContent(); cb.beginText(); Font font = getDefaultParagraphFont(); try { BaseFont bf = BaseFont.createFont(font.getFamilyname(), BaseFont.CP1252, BaseFont.NOT_EMBEDDED); cb.setFontAndSize(bf, font.size()); // we show some text starting on some absolute position with a given // alignment cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, dateString, getPointsFromMM(210 - 20), getPointsFromMM(297 - 20), 0); cb.endText(); } catch (IOException e) { e.printStackTrace(); } } public void createAddressContent(String addressString, PdfWriter writer) throws DocumentException { IWBundle iwb = getIWApplicationContext().getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER); checkBundleDimensions(iwb); Phrase Ph0 = new Phrase(addressString, getAddressFont()); ColumnText ct = new ColumnText(writer.getDirectContent()); /* * public void setSimpleColumn(Phrase phrase, float llx, float lly, float * urx, float ury, float leading, int alignment) Parameters: phrase - a * Phrase llx - the lower left x corner lly - the lower left y corner urx - * the upper right x corner ury - the upper right y corner leading - the * leading alignment - the column alignment * */ float llx = getPointsFromMM(addressLowerLeftX);//getPointsFromMM((20f+95f)); float lly = getPointsFromMM(addressLowerLeftY);//655f; float urx = getPointsFromMM(addressUpperRightX);//getPointsFromMM((193f)); float ury = getPointsFromMM(addressUpperRightY);//getPointsFromMM(257f); //ct.setSimpleColumn(Ph0,getPointsFromMM((20f+95f)), 655f, // getPointsFromMM((193f)), getPointsFromMM(257f), 15, Element.ALIGN_LEFT); //ct.setSimpleColumn(Ph0,getPointsFromMM(new // Float(addressLowerLeftX).floatValue()), new // Float(addressLowerLeftY).floatValue(), new // Float(addressUpperRightX).floatValue(), new // Float(addressUpperRightY).floatValue(), 15, Element.ALIGN_LEFT); ct.setSimpleColumn(Ph0, llx, lly, urx, ury, 15, Element.ALIGN_LEFT); ct.go(); } //private int createDefaultLetterContent( Document // document,PrintedLetterMessage msg, PdfWriter writer,Locale locale)throws // Exception{ private int createDefaultLetterContent(DocumentPrintContext dpc) throws ContentCreationException { try { IWBundle iwb = getIWApplicationContext().getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER); PdfWriter writer = dpc.getPdfWriter(); Document document = dpc.getDocument(); Locale locale = dpc.getLocale(); PrintMessage msg = dpc.getMessage(); createLogoContent(document); String addressString = getAddressString(msg.getOwner()); createAddressContent(addressString, writer); document.add(new Paragraph("\n\n\n\n\n\n\n\n")); { User owner = msg.getOwner(); HashMap tagmap = new CommuneUserTagMap(getIWApplicationContext(), owner); tagmap.putAll(getMessageTagMap(msg, locale)); String letterUrl = getXMLLetterUrl(iwb, locale, "default_letter.xml", true); SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); SAXmyHandler handler = new SAXmyHandler(document, tagmap); handler.setControlOpenClose(false); parser.parse(letterUrl, handler); } createCommuneFooter(writer); } catch (NoUserAddressException nouser) { handleNoAddressUser(); System.err.println(nouser.getMessage()); //nouser.printStackTrace(); return ADDRESS_ERROR; } catch (Exception e) { throw new ContentCreationException(e); } return 0; } public HashMap getMessageTagMap(PrintMessage msg, Locale locale) { HashMap tagmap = new HashMap(); DateFormat df; if (locale != null) { df = DateFormat.getDateInstance(DateFormat.SHORT, locale); } else { df = DateFormat.getDateInstance(DateFormat.SHORT); } XmlPeer peer = new XmlPeer(ElementTags.CHUNK, "msgsubject"); peer.setContent(msg.getSubject()); tagmap.put(peer.getAlias(), peer); peer = new XmlPeer(ElementTags.CHUNK, "msgbody"); peer.setContent(msg.getBody()); tagmap.put(peer.getAlias(), peer); peer = new XmlPeer(ElementTags.CHUNK, "msgcreated"); peer.setContent(df.format(msg.getCreated())); tagmap.put(peer.getAlias(), peer); peer = new XmlPeer(ElementTags.CHUNK, "msgid"); peer.setContent(msg.getPrimaryKey().toString()); tagmap.put(peer.getAlias(), peer); peer = new XmlPeer(ElementTags.CHUNK, "msgstatus"); peer.setContent(msg.getCaseStatus().toString()); tagmap.put(peer.getAlias(), peer); peer = new XmlPeer(ElementTags.CHUNK, "msgcode"); peer.setContent(msg.getCaseCode().toString()); tagmap.put(peer.getAlias(), peer); return tagmap; } public void createCommuneFooter(PdfWriter writer) throws Exception { PdfContentByte cb = writer.getDirectContent(); Font nameFont = getDefaultParagraphFont(); nameFont.setSize(9); Font textFont = getDefaultTextFont(); textFont.setSize(9); PdfPTable table = new PdfPTable(4); table.getDefaultCell().setBorder(Rectangle.NO_BORDER); table.getDefaultCell().setNoWrap(true); IWBundle iwb = getIWApplicationContext().getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER); table.addCell(new Phrase(iwb.getProperty("commune.name_mailaddr", "Mailaddress"), nameFont)); table.addCell(new Phrase(iwb.getProperty("commune.name_visitaddr", "Visitaddress"), nameFont)); table.addCell(new Phrase(iwb.getProperty("commune.name_contact", "Contact"), nameFont)); table.addCell(new Phrase(iwb.getProperty("commune.name_org_nr", "Organizationsnr"), nameFont)); table.addCell(new Phrase(iwb.getProperty("commune.mail_name", "Mail name"), getTextFont())); table.addCell(new Phrase(iwb.getProperty("commune.visit_name", "Visit name"), textFont)); table.addCell(new Phrase(iwb.getProperty("commune.website", "www.some-place.com"), textFont)); table.addCell(new Phrase(iwb.getProperty("commune.org_number", "XXXXXX-XXXX"), textFont)); table.addCell(new Phrase(iwb.getProperty("commune.mail_zip", "Zip code"), textFont)); table.addCell(new Phrase(iwb.getProperty("commune.visit_streetaddr", "Street and number,"), textFont)); table.addCell(new Phrase(iwb.getProperty("commune.support_email", "email@someplace.com"), textFont)); table.addCell(new Phrase(" ", textFont)); table.addCell(new Phrase(" ", textFont)); table.addCell(new Phrase(iwb.getProperty("commune.visit_zip", "Visit zip"), textFont)); table.addCell(new Phrase(iwb.getProperty("commune.office_phone", "office phone"), textFont)); table.addCell(new Phrase(" ", textFont)); int distFromBottomMM = 30; int[] widths = { 20, 20, 30, 20}; table.setWidths(widths); table.setTotalWidth(getPointsFromMM(210 - 25 - 20)); table.writeSelectedRows(0, -1, getPointsFromMM(25), getPointsFromMM(distFromBottomMM), cb); PdfContentByte linebyte = new PdfContentByte(writer); // we add some crosses to visualize the destinations linebyte.moveTo(getPointsFromMM(25), getPointsFromMM(distFromBottomMM + 2)); linebyte.lineTo(getPointsFromMM(210 - 25), getPointsFromMM(distFromBottomMM + 2)); linebyte.stroke(); // we add the template on different positions cb.add(linebyte); } //public void createArchiveMessageContent(Document // document,SystemArchivationMessage msg, User performer,PdfWriter // writer,Locale locale)throws Exception{ public void createArchiveMessageContent(DocumentPrintContext dpc) throws ContentCreationException { try { IWBundle iwb = getIWApplicationContext().getIWMainApplication().getBundle(CommuneBlock.IW_BUNDLE_IDENTIFIER); //IWResourceBundle iwrb = iwb.getResourceBundle(locale); //DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT,locale); PrintMessage msg = dpc.getMessage(); Locale locale = dpc.getLocale(); User owner = msg.getOwner(); HashMap tagmap = new CommuneUserTagMap(getIWApplicationContext(), owner); tagmap.putAll(getMessageTagMap(msg, locale)); String letterUrl = getXMLLetterUrl(iwb, locale, "archive_letter.xml"); SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); SAXmyHandler handler = new SAXmyHandler(dpc.getDocument(), tagmap); handler.setControlOpenClose(false); parser.parse(letterUrl, handler); } catch (Exception e) { throw new ContentCreationException(e); } } // set the refresh property to true if new values entered for dimensions private void checkBundleDimensions(IWBundle iwb) { String refreshValue = iwb.getProperty("printing.dimension_refresh", Boolean.toString(false)); boolean refresh = refreshValue != null && refreshValue.equalsIgnoreCase(Boolean.toString(true)); if (initRefresh || refresh) { try { newlinesBetween = Integer.parseInt(iwb.getProperty("printing.newlines_between_header_and_content", String.valueOf(newlinesBetween))); logoScaleHeight = Integer.parseInt(iwb.getProperty("printing.logo_scale_height_(mm)", String.valueOf(logoScaleHeight))); logoScaleWidth = Integer.parseInt(iwb.getProperty("printing.logo_scale_width_(mm)", String.valueOf(logoScaleWidth))); logoAbsPosX = Integer.parseInt(iwb.getProperty("printing.logo_abs_x_pos_(mm from left)", String.valueOf(logoAbsPosX))); logoAbsPosY = Integer.parseInt(iwb.getProperty("printing.logo_abs_y_pos_(mm from bottom)", String.valueOf(logoAbsPosY))); addressLowerLeftX = Integer.parseInt(iwb.getProperty("printing.address_lowerleft_x_(mm from left)", String.valueOf(addressLowerLeftX))); addressLowerLeftY = Integer.parseInt(iwb.getProperty("printing.address_lowerleft_y_(mm from bottom)", String.valueOf(addressLowerLeftY))); addressUpperRightX = Integer.parseInt(iwb.getProperty("printing.address_upperright_x_(mm from left)", String.valueOf(addressUpperRightX))); addressUpperRightY = Integer.parseInt(iwb.getProperty("printing.address_upperright_y_(mm from bottom)", String.valueOf(addressUpperRightY))); } catch (NumberFormatException e) { e.printStackTrace(); } if (initRefresh) initRefresh = false; try { defaultParagraphFont = decodeFont(iwb.getProperty("printing.font_header", encodeFont(getDefaultParagraphFont())), getDefaultParagraphFont()); defaultTextFont = decodeFont(iwb.getProperty("printing.font_text", encodeFont(getDefaultTextFont())), getDefaultTextFont()); defaultAddressTextFont = decodeFont(iwb.getProperty("printing.font_address", encodeFont(getDefaultAddressTextFont())), getDefaultAddressTextFont()); } catch (RuntimeException e1) { e1.printStackTrace(); } iwb.setProperty("printing.dimension_refresh", Boolean.toString(false)); } } private String encodeFont(Font font) { StringBuffer fontBuffer = new StringBuffer(); fontBuffer.append(font.getFamilyname()).append("-"); fontBuffer.append(font.size()).append("-"); fontBuffer.append(encodeFontStyle(font)).append("-"); if (font.color() != null) fontBuffer.append(IWColor.getHexColorString(font.color())); return fontBuffer.toString(); } private String encodeFontStyle(Font font) { StringBuffer s = new StringBuffer(); if (font.isBold()) { s.append(MarkupTags.CSS_BOLD).append(","); } if (font.isItalic()) { s.append(MarkupTags.CSS_ITALIC).append(","); } if (font.isUnderlined()) { s.append(MarkupTags.CSS_UNDERLINE).append(","); } if (font.isStrikethru()) { s.append(MarkupTags.CSS_LINETHROUGH); } return s.toString(); } private Font decodeFont(String fontstring, Font returnFont) { if (fontstring != null) { int family = -1; StringTokenizer tokener = new StringTokenizer(fontstring, "-"); // family part if (tokener.hasMoreTokens()) { family = Font.getFamilyIndex(tokener.nextToken()); } if (family > -1) { Font font = new Font(family); // size part if (tokener.hasMoreTokens()) { float size = Float.parseFloat(tokener.nextToken()); font.setSize(size); } //style part if (tokener.hasMoreTokens()) { font.setStyle(tokener.nextToken()); } // color part if (tokener.hasMoreTokens()) { font.setColor(IWColor.getAWTColorFromHex(tokener.nextToken())); } return font; } } return returnFont; } public String getXMLLetterUrl(IWBundle iwb, Locale locale, String name) { return "file://" + iwb.getResourcesRealPath(locale) + "/" + name; } public String getXMLLetterUrl(IWBundle iwb, Locale locale, String name, boolean createIfNotExists) { String url = getXMLLetterUrl(iwb, locale, name); if (url != null) { try { String protocol = "file://"; int indexOfProtocol = url.indexOf(protocol); String path = url; if (indexOfProtocol != -1) path = url.substring(protocol.length()); java.io.File file = new java.io.File(path); if (!file.exists()) { file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); XMLElement root = new XMLElement("userletter"); XMLOutput xmlOutput = new XMLOutput(" ", true); xmlOutput.setLineSeparator(System.getProperty("line.separator")); xmlOutput.setTextNormalize(true); xmlOutput.setEncoding("iso-8859-1"); XMLDocument doc = new XMLDocument(root); XMLElement subject = new XMLElement("msgsubject"); subject.setAttribute("font", "Helvetica"); subject.setAttribute("fontstyle", "bold"); subject.setAttribute("size", "12.0"); XMLElement body = new XMLElement("msgbody"); subject.setAttribute("font", "Time"); subject.setAttribute("fontstyle", "bold"); subject.setAttribute("size", "12.0"); root.addContent(subject); root.addContent(new XMLElement("newline")); root.addContent(new XMLElement("newline")); root.addContent(new XMLElement("newline")); root.addContent(body); xmlOutput.output(doc, fos); fos.close(); } } catch (IOException e) { e.printStackTrace(); } } return url; } public String getDefaultXMLTemplateValue() { StringBuffer content = new StringBuffer(); content.append("<userletter>\n"); content.append("<msgcreated/>\n"); content.append("<newline />\n"); content.append("<newline />\n"); content.append("<msgsubject font=\"Helvetica\" size=\"12.0\" fontstyle=\"bold\"/>\n"); content.append("<newline />\n"); content.append("<newline />\n"); content.append("<newline />\n"); content.append("<newline />\n"); content.append("<msgbody font=\"Time\" size=\"12.0\"/>\n"); content.append("<newline />\n"); content.append("</userletter>"); return content.toString(); } private MessagePdfHandler getMessagePdfHandler(PrintMessage message) { Case parentCase = message.getParentCase(); if (parentCase != null) { try { String code = parentCase.getCaseCode().toString(); if (code != null) { MessageHandlerInfo handlerInfo = ((MessageHandlerInfoHome) getIDOHome(MessageHandlerInfo.class)).findByPrimaryKey(code); return handlerInfo.getHandler(); } } catch (RemoteException e) { e.printStackTrace(); } catch (FinderException e) { //e.printStackTrace(); } } logWarning("No handler found for message: " + message); return null; } /* * Commented out since it is never used... private class * NoLetterTemplateException extends Exception{ * NoLetterTemplateException(String type){ super("Letter template for case * type "+type +" not found."); } } */ /* * (non-Javadoc) * * @see se.idega.idegaweb.commune.message.business.MessagePdfHandler#createMessageContent(se.idega.idegaweb.commune.printing.business.DocumentPrintContext) */ public void createMessageContent(DocumentPrintContext dpc) throws ContentCreationException { createContent(dpc); } }