iTEXT: PDF Pada Aplikasi Berbasis Web


iTEXT juga dapat digunakan pada aplikasi Java berbasis Web, misalnya pada servlet yang menghasilkan file PDF. Sebagai contoh, berikut ini adalah servlet yang menggunakan iTEXT untuk membuat file PDF on-the-fly:

package aplikasi;

public class LatihanPDF extends 
  HttpServlet {

 @Override
 protected void doGet(
    HttpServletRequest req, 
    HttpServletResponse resp)
 throws ServletException, IOException {
	
  Document document = new Document();
  resp.setContentType("application/pdf");
  try {
    PdfWriter.getInstance(document, 
       resp.getOutputStream());
    document.open();
    document.add(new 
Paragraph("Hi, apa kabar? 
Ini seharusnya muncul di browser."));
  } catch (DocumentException e) {
    e.printStackTrace();
  }
  document.close();
 }
}

Aku juga tidak lupa menambahkan definisi berikut ke web.xml:

<servlet>
  <servlet-name>LatihanPDF</servlet-name>
  <servlet-class>aplikasi.LatihanPDF</servlet-class>		
</servlet>
<servlet-mapping>
  <servlet-name>LatihanPDF</servlet-name>

  <url-pattern>/aplikasi/latihanPDF</url-pattern>
</servlet-mapping>

Saat aku mencoba URL http://localhost:8080/sample/aplikasi/latihanPDF (URL tergantung pada konfigurasi application server) di Internet Explorer 7 dan FireFox 3, kedua browser tersebut secara otomatis menampilkan isi PDF di dalam browser melalui plug-in yang tersedia saat instalasi Adobe Reader.

Jika aku ingin PDF tersebut tidak langsung muncul di dalam browser, tetapi yang muncul adalah pilihan bagi user untuk mendownload PDF tersebut ke komputer-nya, aku dapat menambahkan baris berikut di program di atas:

resp.setHeader("Content-Disposition", 
  " attachment; filename=\"latihan.pdf\"");

Bagi yang ingin menggunakan JSP untuk menghasilkan PDF, perlu mengingat bahwa JSP ditujukan untuk menghasilkan teks HTML, sementara PDF adalah data binary. Lagipula, JSP nantinya juga akan diterjemahkan menjadi servlet. Salah satu masalah kalau menggunakan JSP adalah kita harus berhati-hati dalam menulis whitespace (karakter tidak terlihat) seperti Enter (ganti baris), spasi, dan tab. Jika ingin membuat PDF, karena berupa binary, maka tidak boleh ada karakter-karakter whitespace yang tidak diinginkan tersebut diluar <% .. %>. Berikut ini adalah contoh JSP sederhana yang menghasilkan PDF:

<%@
page import=
 "java.io.*,com.lowagie.text.*,com.lowagie.text.pdf.*"
%><%
  response.setContentType("application/pdf");
  Document document = new Document();
  ByteArrayOutputStream buffer = new 
     ByteArrayOutputStream();
  PdfWriter.getInstance(document,buffer);
  document.open();
  document.add(new 
      Paragraph("TEST.. INI JSP MENGHASILKAN PDF"));
  document.close();
  DataOutput output =
     new DataOutputStream(
        response.getOutputStream());
  byte[] bytes = buffer.toByteArray();
  response.setContentLength(bytes.length);
  for (int i=0; i<bytes.length; i++) {
    output.writeByte(bytes[i]);
  }
%>

Perhatikan bahwa aku tidak memberikan sedikitpun spasi atau ganti baris di luar <% … %>, termasuk di baris terakhir, tidak ada ganti baris atau spasi setelah karakter &gt. Bagaimana jika seandainya lupa? Misalnya, kode di atas aku rubah menjadi:

<%@
page import="java.io.*,com.lowagie.text.*,com.lowagie.text.pdf.*"
%> <== [ini ganti baris]
<%
  response.setContentType("application/pdf");
  Document document = new Document();
  ...
%>

Aku akan mendapatkan pesan kesalahan getOutputStream() has already been called for this response. Coba perhatikan hasil terjemahan JSP di atas ke dalam servlet yang kira-kira sebagai berikut:

response.setContentType("text/html");
ageContext = _jspxFactory.getPageContext(this, 
   request, response,
   null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;

out.write('\r');
out.write('\n');

response.setContentType("application/pdf");
Document document = new Document();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

...

DataOutput output =
 new DataOutputStream(response.getOutputStream());

...

Perhatikan bahwa gara-gara ada sebuah ganti baris, atau karakter “\r\n”, contentType telah terlebih dahulu diatur menjadi text/html dan outputStream telah dipakai untuk menuliskan HTML berisi ganti baris ini. Tentu saja Java protes saat aku ingin mengubah content ke binary PDF.

Perihal Solid Snake
I'm nothing...

3 Responses to iTEXT: PDF Pada Aplikasi Berbasis Web

  1. Fairy mengatakan:

    Yup,that’s right… I’ve tried tried it… For the 1st,it’s rather hard,coz i tried the instruction and having a problem when showing in bbrowser…But,at last it works! Ye ye ye…. The problem is of the browser and the server… U also should restart the browser and the server… Thank you man🙂

  2. Tadonny vani mengatakan:

    yang kelas Document itu dapat dari mana yach …???
    yang seperti di tulis seperti ini …
    Document document = new Document();

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: