[jboss-user] [JBoss Seam] - PDF - is there a way?

Kragoth do-not-reply at jboss.com
Mon Nov 19 02:54:29 EST 2007


Hi all,

I'm experiencing a little difficulty in getting SEAM's PDF functionality to work.

I can get what I want if I put all my variables into a SESSION scope. But as soon as I want to try use a CONVERSATION scope the PDF has no data in it.

Now I'm assuming that this is because of the way that PDF's are handled. So, I guess my question is, What is the work around? 

I have a page where users search for records based on some criteria. My aim is to have a button on the page which will generate a PDF document with these results in them and display them in an iframe or equivalent below, allowing them to get a print friendly version of the records.

Currently I'm experiencing considerable difficulty in passing data to the xhtml page where my pdf is defined.

here is some of the more necessary code

Don't worry too much about the reference to GekkoReport it is just a bunch of getters and setters at the moment.


  | package gekko.web.actionbean.enquiry;
  | 
  | import static org.jboss.seam.ScopeType.CONVERSATION;
  | import static org.jboss.seam.ScopeType.PAGE;
  | import static org.jboss.seam.ScopeType.SESSION;
  | import gekko.domain.calculator.ltlr.UvAveraging;
  | import gekko.domain.reference.ltl.SubcategoryCode;
  | import gekko.web.actionbean.search.CatSubcatDateSearch;
  | import gekko.web.services.GekkoReport;
  | 
  | import java.util.HashMap;
  | import java.util.List;
  | 
  | import org.jboss.seam.annotations.Begin;
  | import org.jboss.seam.annotations.In;
  | import org.jboss.seam.annotations.Name;
  | import org.jboss.seam.annotations.Out;
  | import org.jboss.seam.annotations.Scope;
  | import org.jboss.seam.annotations.datamodel.DataModel;
  | import org.jboss.seam.annotations.datamodel.DataModelSelection;
  | 
  | 
  | @Name("averagingEnquiry")
  | @Scope(PAGE)
  | public class AveragingEnquiry {
  | 	
  | 	@Out(required=false, scope=SESSION, value="gekkoPDFReport")
  | 	@In(create=true, value="gekkoReport")
  | 	private GekkoReport gekkoPDFReport;
  | 	
  | 	@Out(required=false, scope=SESSION, value="searchResults")
  | 	private List<UvAveraging> searchResults;
  | 	
  | 	@In(value="#{catSubcatDateSearch}", create=true, scope=CONVERSATION)
  | 	private CatSubcatDateSearch searchBean; //NOPMD
  | 	
  | 	@DataModel(value="averagingEnquiry_uvAveragings")
  | 	private List<UvAveraging> uvAveragingList;
  | 	
  | 	@DataModelSelection(value="averagingEnquiry_uvAveragings")
  | 	@Out(required=false, scope=CONVERSATION, value="averagingEnquiry_uvAveraging")
  | 	private UvAveraging uvAveraging;
  | 	
  | 	@Out(required=false, scope=CONVERSATION, value="selectedSubcategory")
  | 	private SubcategoryCode selectedSubcategory;
  | 	
  | 	private boolean showReport = false;
  | 	
  | 	....getters and setters...
  | 
  | 	@Begin(join=true)
  | 	public String editUvAveraging() {
  | 		selectedSubcategory = uvAveraging.getSubcategory();
  | 		return "createEditAveraging";
  | 	}
  | 	
  | 	@Begin(join=true)
  | 	public String createUvAveraging() {
  | 		uvAveraging = new UvAveraging();
  | 		selectedSubcategory = new SubcategoryCode();
  | 		return "createEditAveraging";
  | 	}
  | 
  | 	public boolean getShowReport() {
  | 		return showReport;
  | 	}
  | 	
  | 	@Begin(join=true)
  | 	public void displayReport() {
  | 		HashMap<String, String> criteria = new HashMap<String, String>();
  | 		criteria.put("Category", searchBean.getCatSubcatEnquiry().getCategoryCode().getName());
  | 		
  | 		//TODO: do criteria a better way
  | 		
  | 		gekkoPDFReport.setCriteria(criteria);
  | 		searchResults = uvAveragingList;
  | 				
  | 		showReport = true;
  | 	}
  | 	
  | 	public void hideReport() {
  | 		showReport = false;
  | 	}
  | 	
  | }
  | 

The search page

  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  | <html xmlns="http://www.w3.org/1999/xhtml"
  |       xmlns:ui="http://java.sun.com/jsf/facelets"
  |       xmlns:h="http://java.sun.com/jsf/html"
  |       xmlns:f="http://java.sun.com/jsf/core"
  |       xmlns:rich="http://richfaces.org/rich"
  |       xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
  |       xmlns:s="http://jboss.com/products/seam/taglib"
  |       xmlns:gekko="http://gekkoTagLibs.com"
  |       xmlns:c="http://java.sun.com/jstl/core">
  | 	
  | 	<ui:composition template="/web/templates/gekkoTemplate.xhtml">
  | 		<ui:define name="title">Average Years Enquiry</ui:define>
  | 		<ui:define name="titlebar">Average Years Enquiry</ui:define>
  | 		<ui:define name="content">
  | 			<ui:decorate template="/web/compositions/search/catSubcatDateSearch.xhtml">
  | 				<ui:define name="cScSearchCommand">
  | 					<h:commandButton id="averagingCScSearchCommand"
  | 							value="Search"
  | 							action="#{averagingEnquiry.getUvAveragings}">
  | 						<gekko:defaultAction/>
  | 					</h:commandButton>
  | 				</ui:define>
  | 			</ui:decorate>	
  | 			
  | 			<h:form id="results" styleClass="resultsForm">
  | 				<rich:panel header="Averagings">
  | 					<rich:dataTable id="averagingTable"
  | 							value="#{averagingEnquiry_uvAveragings}"
  | 							var="uvAveraging"
  | 							style="width:100%;"
  | 							rows="20">
  | 						<f:facet name="header">
  | 							<rich:columnGroup>
  | 								<rich:column>
  | 									<rich:spacer width="2px;"/>
  | 								</rich:column>
  | 								<rich:column>
  | 									<h:outputText value="Num Years"/>
  | 								</rich:column>
  | 								<rich:column>
  | 									<h:outputText value="Effective Date"/>
  | 								</rich:column>
  | 								<rich:column>
  | 									<h:outputText value="Expiry Date"/>
  | 								</rich:column>
  | 								<rich:column>
  | 									<h:outputText value="Comment"/>
  | 								</rich:column>
  | 							</rich:columnGroup>
  | 						</f:facet>
  | 	
  | 						<rich:column>
  | 							<h:commandLink value="Edit" action="#{averagingEnquiry.editUvAveraging}"/>
  | 						</rich:column>
  | 						<rich:column>
  | 							<h:outputText value="#{uvAveraging.years}"/>
  | 						</rich:column>
  | 						<rich:column>
  | 							<h:outputText value="#{uvAveraging.effective}"/>
  | 						</rich:column>
  | 						<rich:column>
  | 							<h:outputText value="#{uvAveraging.expiry}"/>
  | 						</rich:column>
  | 						<rich:column>
  | 							<h:outputText value="#{uvAveraging.comment}"/>
  | 							<rich:spacer rendered="#{empty uvAveraging.comment}"/>
  | 						</rich:column>
  | 						
  | 						<f:facet name="footer">
  | 							<rich:columnGroup>
  | 								<rich:column colspan="5">
  | 									<rich:datascroller align="left" for="averagingTable" renderIfSinglePage="false"/>
  | 								</rich:column>
  | 							</rich:columnGroup>
  | 						</f:facet>
  | 						
  | 					</rich:dataTable>
  | 					
  | 					<a4j:commandButton id="reportButton" value="Report" reRender="pdfReportForm" action="#{averagingEnquiry.displayReport}"/>
  | 					<h:commandButton id="newButton" action="#{averagingEnquiry.createUvAveraging}" value="New"/>
  | 				</rich:panel>
  | 			</h:form>
  | 			<a4j:log/>
  | 		</ui:define>
  | 
  | 		
  | 		<ui:define name="pdfReport">
  | 			<h:form id="pdfReportForm">
  | 				<rich:panel header="Report" rendered="#{averagingEnquiry.showReport}">
  | 					<f:facet name="header">
  | 						<h:outputText value="Report"/>
  | 						<a4j:commandLink action="#{averagingEnquiry.hideReport}"
  | 								value="Hide Report"
  | 								reRender="pdfReportForm"/>
  | 					</f:facet>
  | 					<iframe frameborder="0" width="98%" height="600" src="/gekko-tje/web/reports/averageYearsReport.jsf" />
  | 			</rich:panel>
  | 			</h:form>
  | 		</ui:define>
  | 	</ui:composition>
  | </html>
  | 

And finally the pdf xhtml file

  | <p:document xmlns:ui="http://java.sun.com/jsf/facelets"
  |             xmlns:p="http://jboss.com/products/seam/pdf"
  |             xmlns:s="http://jboss.com/products/seam/taglib"
  |             xmlns:f="http://java.sun.com/jsf/core"
  |             pageSize="A4">
  | 
  | 	<f:facet name="header">
  | 		<p:font size="12">
  | 			<p:footer borderWidthTop="1" borderColorTop="Gray" borderWidthBottom="0" alignment="center">
  | 				<p:pageNumber/>
  | 			</p:footer>
  | 		</p:font>
  | 	</f:facet>
  | 	
  | 	<p:font size="18">
  | 		<p:paragraph>Average Years</p:paragraph>
  | 	</p:font>
  | 	
  | 	<p:table columns="2" headerRows="1">
  | 		<p:cell colspan="2">
  | 			<p:font size="14">
  | 				<p:paragraph>Search Criteria</p:paragraph>
  | 			</p:font>
  | 		</p:cell>
  | 		
  | 		<ui:repeat value="#{gekkoReport.criteria.keySet}" var="key">
  | 			<p:cell>#{key}</p:cell>
  | 			<p:cell>#{gekkoReport.criteria.get(key)}</p:cell>
  | 		</ui:repeat>
  | 	</p:table>
  | 	
  | 	<p:table columns="4" headerRows="1">
  | 	
  | 		<ui:repeat value="#{gekkoReport.columns}" var="column">
  | 			<p:font size="14">
  | 				<p:cell>#{column}</p:cell>
  | 			</p:font>
  | 		</ui:repeat>
  | 		
  | 		<ui:repeat value="#{searchResults}" var="uvAveraging">
  | 			<p:cell>#{uvAveraging.years}</p:cell>
  | 			<p:cell>#{uvAveraging.effective}</p:cell>
  | 			<p:cell>#{uvAveraging.expiry}</p:cell>
  | 			<p:cell>#{empty uvAveraging.comment}</p:cell>
  | 		</ui:repeat>
  | 	</p:table>
  | 
  | </p:document>
  | 



That code is the best implementation I've had so far in that I at least get results on my page but...... I don't want to be putting all this data into my SESSION scope.

I'll keep looking for some decent examples and reading doco but... any ideas would be great. :)

Thanks




View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4105908#4105908

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4105908



More information about the jboss-user mailing list