15 Eylül 2009 Salı

Jboss Seam browserda pdf gösterme

Öncelikle bir Pdf i browser da göstermenin bir kaç yolunda bahsedeceğim sizlere.
Bunlardan en kolayı hazır olarak satılan ajax veya javascript tabanlı pdf readerlar kullanmaktır.
Kafat bunlarada açıkçası ne kadar güvenilir bilinmez.

Çok tavsiye edeveğim bir yöntem değil fakat kısaca bir göz atabilirsiniz.

Vuzir

ajaxpdfviewer



Başka bir yöntem Servlet kullanacak , browsera pdfi embed etmek. Eğere seçiminimizi çok servlet te yana yaparsanız iyi bir seçim yapmış saayılmassnız. Çünkü (benim cahilliğimdende olabilir) Seam Contexte bulunan objelerime Servlete (HttpServerRequest) e hiç birinine erişemedim. Parametre gecemeyince pdf üretmek biraz zamhmetli oluyor.

Servlet Örneği;




public class CounterServer extends HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int BUFSIZE = 32 * 1024;

File f = new File("/home/seyfettin/raporlar/test.pdf");
int length = 0;

try {

byte[] bufferSize = new byte[BUFSIZE];
DataInputStream dataInputStream = new DataInputStream(
new FileInputStream(f));

while ((dataInputStream != null)
&& ((length = dataInputStream.read(bufferSize)) != -1)) {
out.write(bufferSize, 0, length);
}
dataInputStream.close();
out.flush();
out.close();

} catch (IOException e) {
e.printStackTrace();
}
}
}


servlet oluşturduktan sonra web.xml sayfasında servlet için mappin yapıyoruz.

web.xml

<servlet>
<servlet-name> <servlet>
<servlet-name>PdfServlet</servlet-name>
<servlet-class>datassist.util.report.PdfServlet</servlet-class>

</servlet>

<servlet-mapping>
<servlet-name>PdfServlet</servlet-name>
<url-pattern>/PdfServlet</url-pattern>
</servlet-mapping></servlet-name></servlet><servlet-mapping><url-pattern></url-pattern>
</servlet-mapping>




Ve browserda göstermek ise;

sayfanıza ekleyin.
<embed src="http://127.0.0.1:8080/proje/PdfServlet" height="500" width="500"/>


Şimdi Sıra geldi en makül çözümde.

Bu yolu göstermeden önce eğere projenizde icefaces var ise, Ice Pdf kullanmanızı tavsi ederim. Fakat ne yazıkki bir RichFaces kullandığımı için Icepdf deneyemedim. Bir projede 2 tana ajax support kullanamıyoruz.

Pdf i browserde göstermek için richFacesin a4j:mediaOutput tagini kullanacağiz.


pdfViwer.xhtml




<!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:s="http://jboss.com/products/seam/taglib"
xmlns:rich="http://richfaces.org/rich"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:a="https://ajax4jsf.dev.java.net/ajax"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:a4j="http://richfaces.org/a4j">
<body>


<a4j:form id="docForm">

<a4j:mediaOutput id="pdfOut" name="pdfOut" uriAttribute="data"
element="object" style="width:100%;height:100%;"
createContent="#{pdfviewer.print}" mimeType="application/pdf"
standBy="loading..." />
</a4j:form>
<script type="text/javascript">
document.getElementById("docForm:pdfOut").type="application/pdf";
</script>


</body>
</html>




PdfViewer.java


@Name("pdfviewer")
@Scope(ScopeType.CONVERSATION)
public class PdfViewer implements Serializable {

/**
*
*/
private static final long serialVersionUID = -7470506167131572514L;



/**
* First set jasperprint
*
* @param outputStream
* @param object
* @throws IOException
*/
public void print(OutputStream outputStream, Object object)
throws IOException {

try {
JasperPrint jPrint = (JasperPrint)Contexts.getSessionContext().get("jasperPrint");

JasperExportManager.exportReportToPdfStream(jPrint,outputStream);
Component.getInstance("jasperPrint");
outputStream.flush();
outputStream.close();

} catch (Exception e) {
e.printStackTrace();
}

}
}




Burdaki örnekte sesionda JasperPrint alıp JasperExporManeger ile pdf görüntülemek için OutputStream e export ettik. Jasper Report kullanmıyorsanız OutputStream doldurmak için yukarda servletteki kodları kullanabilirsiniz.


Umarım yardımcı olmuştur.

2 yorum:

  1. Contexts.getSessionContext() ve
    Component buralarda hata var kütüphane bulamıyor galiba contexts ne değişkenmi değişkense nasıl bir tanımı var yaptığınız örneği link atabilirmisiniz?
    Component de import ettiğim halde hata devam ediyor

    YanıtlaSil
  2. Selamlar

    org.jboss.seam.contexts.Contexts;
    org.jboss.seam.Component;

    bunları mı import ettimn ?

    YanıtlaSil