Tạo động các tài liệu PDF từ ứng dụng Java

Hướng dẫn từng bước làm việc với iText, một thư viện nguồn mở để tạo PDF dễ dàng

Nếu ứng dụng của bạn cần tạo động các tài liệu PDF, bạn cần có thư viện iText. Thư viện iText nguồn mở giúp cho việc tạo PDF trở nên dễ dàng. Bài này giới thiệu iText và đưa ra một hướng dẫn từng bước về cách sử dụng nó để tạo ra các tài liệu PDF từ các ứng dụng Java. Chúng tôi tạo ra một ứng dụng ví dụ mẫu để giúp bạn hiểu iText rõ hơn.

30.10.2012 - Các tác giả đã cập nhật bài viết để phản ánh những thay đổi với phiên bản 5.3.0 của iText (bài viết ban đầu đã sử dụng phiên bản 1.3 của iText).

12.12.2012 - Các tác giả đã cung cấp mã ví dụ mẫu đã cập nhật trong tệp JAR có thể tải về. (Xem phần Tải về.)

Amit Tuli, Kiến trúc sư tích hợp cao cấp, IBM

Amit Tuli là một kiến trúc sư CNTT cao cấp có chứng chỉ của IBM trong IBM Global Business Services (Các dịch vụ kinh doanh toàn cầu của IBM). Ông là tác giả bận rộn với các bài báo và các ấn phẩm các sách Đỏ của IBM cũng như nhiều tài sản có thể sử dụng lại. Amit là một diễn giả năng động tại các hội nghị kỹ thuật. Ông đã có tất cả 12 năm kinh nghiệm với IBM hầu hết trải rộng từ các nhóm phát triển sản phẩm, nghiên cứu của IBM và các dịch vụ sản phẩm cho các nhóm hỗ trợ ứng dụng khách. Ông đã cung cấp giải pháp kiến trúc theo hướng tích hợp cho một số khách hàng lớn nhất và nổi tiếng ở Ấn Độ và các nước khác về một số chuyển đổi phức tạp.


Cấp độ đóng góp cho developerWorks của
        tác giả

Surbhi Agarwal, Nhân viên kỹ sư phần mềm, IBM

Surbhi đã có hơn 7 năm kinh nghiệm trong ngành CNTT. Cô có nhiều kinh nghiệm làm việc với nhóm sản phẩm AIX, làm việc với các khách hàng của IBM về kích thích các dự án tích hợp và cung cấp các giải pháp xung quanh các sản phẩm phần mềm trung gian của IBM. Cô có kinh nghiệm tốt từ đầu đến cuối trong các chương trình chuyển đổi phức tạp. Surbhi có chuyên môn sâu về các công nghệ tích hợp nghiệp vụ và cơ sở dữ liệu của IBM bao gồm IBM DB2, Oracle, Solid Db, WebSphere MQ, WebSphere Message Broker, WebSphere Process Server, WebSphere Adapters, WebSphere Business Monitor và WebSphere Business Modeller. Cô cũng là chuyên gia có chứng chỉ AIX của IBM.



16 04 2013

Nhiều ứng dụng yêu cầu tạo động các tài liệu PDF. Các ứng dụng như vậy trải rộng từ việc các ngân hàng tạo các báo cáo khách hàng để gửi qua email đến các độc giả mua các chương của cuốn sách cụ thể và nhận chúng dưới định dạng PDF. Danh sách này là vô tận. Trong bài này, chúng tôi sẽ sử dụng thư viện Java iText để tạo ra các tài liệu PDF. Chúng tôi sẽ đưa bạn qua một ứng dụng ví dụ mẫu để bạn có thể tự mình thực hiện nó và hiểu nó tốt hơn.

Làm quen với phiên bản 5.3.0 của iText

iText là một thư viện Java có sẵn miễn phí từ http://itextpdf.com/ (xem phần Tài nguyên). Thư viện iText mạnh mẽ và hỗ trợ việc tạo các tài liệu HTML, RTF và XML, ngoài việc tạo các tệp PDF. Bạn có thể chọn một loạt các phông chữ để sử dụng trong tài liệu. Ngoài ra, cấu trúc của iText cho phép bạn tạo ra bất kỳ các kiểu tài liệu nào đã nói ở trên bằng mã tương tự.

Thư viện iText chứa các lớp để tạo ra văn bản PDF theo các phông chữ khác nhau, tạo ra các bảng trong tài liệu PDF, thêm các hình mờ vào các trang và v.v. Còn có nhiều tính năng hơn nữa có sẵn trong iText. Không thể trình bày tất cả chúng chỉ trong một bài viết. Chúng tôi sẽ trình bày các vấn đề cơ bản cần thiết để tạo PDF. Để biết thêm thông tin chi tiết, hãy tham khảo tài liệu hướng dẫn về iText từ nhà cung cấp (xem phần Tài nguyên).

Chúng tôi sẽ sử dụng Eclipse để phát triển ứng dụng ví dụ mẫu của mình. Là một IDE nguồn mở, Eclipse hoàn toàn miễn phí và khá mạnh. Bạn có thể tải về Eclipse ngay bây giờ (xem phần Tài nguyên).

IText API: Xem xét kỹ hơn

Lớp com.itextpdf.text.Document là lớp chính để tạo tài liệu PDF. Đây là lớp đầu tiên được khởi chạy. Một khi đã tạo ra tài liệu, bạn cần có một trình viết để viết vào lớp đó. Com.itextpdf.text.pdf.PdfWriter là một trình viết PDF. Một số các lớp thường dùng phổ biến khác được cho dưới đây:

  • com.itextpdf.text.Paragraph—Lớp này đại diện cho một đoạn thụt vào.
  • com.itextpdf.text.Chapter—Lớp này đại diện cho một chương trong tài liệu PDF. Nó được tạo ra bằng cách sử dụng một Paragraph (đoạn) làm tiêu đề và một int làm số chương.
  • com.itextpdf.text.Font—Lớp này chứa tất cả các đặc tả của một phông chữ, chẳng hạn như họ các phông chữ, kích thước, kiểu dáng và màu sắc. Các phông chữ khác nhau được khai báo như các hằng số tĩnh trong lớp này.
  • com.itextpdf.text.List—Lớp này đại diện cho một danh sách, rồi danh sách này lại chứa một số ListItems (các mục danh sách).
  • com.itextpdf.text.pdf.PDFPTable—Đây là một bảng có thể được đặt ở một vị trí tuyệt đối, nhưng cũng có thể được thêm vào tài liệu làm lớp Table (bảng).
  • com.itextpdf.text.Anchor—Neo (Anchor) có thể là một tài liệu tham khảo hoặc một đích đến của một tài liệu tham khảo.

Tải về và cấu hình iText trong Eclipse

Là một thư viện Java thuần túy, iText tồn tại dưới dạng một tệp JAR (xem phần Tài nguyên). Một khi bạn đã tải về thư viện này (chẳng hạn, tại đường dẫn C:\temp), các bước sau đây sẽ cấu hình thư viện iText trong một môi trường Eclipse:

  1. Tạo một dự án Java mới trong Eclipse có tên là iText.
  2. Nhấn chuột phải vào dự án iText trong khung nhìn Package Explorer và chọn Properties.
  3. Nhấn Java Build Path. Trên tab Libraries, nhấn Add External JARs.
  4. Duyệt đến thư mục C:\ temp và chọn tệp iText-5.3.0.jar trong thư mục này.
  5. Nhấn OK.

Bây giờ iText được cấu hình và Eclipse đã sẵn sàng tạo các ứng dụng Java để tạo động các tài liệu PDF.


Ứng dụng ví dụ mẫu

Có điều gì tốt hơn khi chính bạn bắt tay vào xây dựng ứng dụng mẫu phải không? Bây giờ bạn có các công cụ (Eclipse IDE) và các thư viện (thư viện iText) cần thiết, chúng ta đã sẵn sàng thiết kế và phát triển một chương trình chạy ví dụ mẫu.

Hãy tạo ra một tài liệu PDF đơn giản có chứa một số phần tử cơ bản như văn bản thuần, văn bản màu có phông chữ không theo mặc định, bảng, danh sách, chương, phần, v.v. Mục đích của ứng dụng này là để cho bạn quen với cách sử dụng thư viện iText. Có rất nhiều lớp để thực hiện nhiều công việc cho bạn liên quan đến việc tạo tài liệu PDF. Không thể trình bày tất cả các lớp đó ở đây. Javadocs của iText là một nguồn thông tin tốt về cách sử dụng các lớp đó. Hãy bắt đầu viết mã.

Bước đầu tiên là tạo một tài liệu. Một tài liệu là thùng chứa cho tất cả các phần tử của một tài liệu PDF.

Liệt kê 1. Tạo đối tượng tài liệu
Document document = new Document(PageSize.A4, 50, 50, 50, 50);

Đối số đầu tiên là kích thước trang (page size). Đối số tiếp theo tương ứng là các lề trái, phải, đầu trang và cuối trang. Kiểu tài liệu này chưa được định nghĩa. Nó phụ thuộc vào kiểu của trình writer mà bạn tạo. Trong ví dụ mẫu của mình, chúng tôi chọn trình writer là com.itextpdf.text.pdf.PdfWriter. Những trình writer khác là HtmlWriter, RtfWriter, XmlWriter và nhiều trình viết khác nữa. Tên của chúng đã tự giải thích các mục đích của chúng rồi.

Liệt kê 2. Tạo đối tượng PdfWriter
PdfWriter writer = PdfWriter.getInstance(document, \

new FileOutputStream("C:\\ITextTest.pdf"));

document.open();

Đối số đầu tiên là tài liệu tham chiếu đến đối tượng tài liệu và đối số thứ hai chỉ là tên đúng của tệp sẽ viết kết quả đầu ra vào. Tiếp theo, chúng tôi mở tài liệu để viết.

Bây giờ, chúng tôi sẽ thêm một đoạn văn bản vào trang đầu tiên của tài liệu. Bất kỳ văn bản nào đều được thêm vào với sự trợ giúp của lớp com.itextpdf.text.Paragraph. Bạn có thể tạo một đoạn mặc định trong văn bản của mình và các thiết lập mặc định về các phông chữ, màu sắc, kích thước và v.v. Nếu không, bạn có thể cung cấp phông chữ riêng của mình. Trong bài này, chúng tôi cũng sẽ thảo luận về anchor (neo liên kết) đến tài liệu PDF. Trong tài liệu PDF này, chúng tôi đã sử dụng backToTop làm liên kết. Khi bạn nhấn chuột vào liên kết backToTop, nó sẽ đưa bạn đến trang đầu tiên của tài liệu. Bạn cần thiết lập văn bản như là đích neo đến trang đầu tiên. Chúng ta hãy xem cách thiết lập đích neo và thiết lập phông chữ cho đoạn văn bản đã thêm vào.

Liệt kê 3. Tạo đối tượng đoạn văn bản
Anchor anchorTarget = new Anchor("First page of the document.");
      anchorTarget.setName("BackToTop");
      Paragraph paragraph1 = new Paragraph();

      paragraph1.setSpacingBefore(50);

      paragraph1.add(anchorTarget);
      document.add(paragraph1);

document.add(new Paragraph("Some more text on the \

first page with different color and font type.", 

FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD,	new CMYKColor(0, 255, 0, 0))));

Hình 1 cho thấy kết quả đầu ra của mã ví dụ mẫu trong Liệt kê 3. Để đóng tài liệu lại, hãy thêm document.close(); vào cuối đoạn mã trong Liệt kê 3.

Hình 1. Kết quả đầu ra của mã ví dụ mẫu trong Liệt kê 3
Kết quả mã ví dụ mẫu trong Liệt kê 3

Bạn chỉ cần xem cách thêm văn bản thuần vào tài liệu PDF. Tiếp theo, chúng ta cần thêm một số phần tử phức tạp vào tài liệu này. Hãy bắt đầu bằng việc tạo một chương mới. Chương (chapter) là một phần đặc biệt, bắt đầu bằng một trang mới và có một con số được hiển thị theo mặc định.

Liệt kê 4. Tạo đối tượng chapter
Paragraph title1 = new Paragraph("Chapter 1", 

   FontFactory.getFont(FontFactory.HELVETICA, 
   
   18, Font.BOLDITALIC, new CMYKColor(0, 255, 255,17)));
   
Chapter chapter1 = new Chapter(title1, 1);
      
chapter1.setNumberDepth(0);

Trong đoạn mã của Liệt kê 4, chúng ta đã tạo ra một đối tượng chapter mới là chapter1, có tiêu đề "This is Chapter 1" (Đây là Chương 1). Việc thiết lập số độ sâu là 0 sẽ không hiển thị số chương trên trang.

Một section (phần) là một phần tử con của một chương. Trong đoạn mã của Liệt kê 5, chúng ta tạo ra một section có tiêu đề "This is Section 1 in Chapter 1" (Đây là Phần 1 trong Chương 1). Để thêm một số văn bản vào phần này, chúng ta tạo một đối tượng paragraph (đoạn) khác là someSectionText và thêm nó vào đối tượng section.

Liệt kê 5. Tạo đối tượng section
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1", 

       FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 
   
       new CMYKColor(0, 255, 255,17)));
   
Section section1 = chapter1.addSection(title11);

Paragraph someSectionText = new Paragraph("This 

text comes as part of section 1 of chapter 1.");

section1.add(someSectionText);

someSectionText = new Paragraph("Following is a 3 X 2 table.");

section1.add(someSectionText);

Trước khi chúng ta thêm bảng, chúng ta hãy xem xét xem tài liệu sẽ trông như thế nào. Thêm hai dòng sau đây để đóng tài liệu trong Hình 2. Sau đó biên dịch và chạy chương trình để tạo ra tài liệu PDF: document.add(chapter1);document.close();.

Hình 2. Kết quả đầu ra ví dụ mẫu của chương
Kết quả ví dụ mẫu của chương

Tiếp theo, chúng ta tạo một đối tượng table (bảng). Một bảng chứa một ma trận các hàng và các cột. Một ô (cell) trong một hàng có thể mở rộng nhiều hơn một cột. Tương tự như vậy, một ô trong một cột có thể mở rộng nhiều hơn một hàng.

Liệt kê 6. Tạo đối tượng table
PdfPTable t = new PdfPTable(3);

      t.setSpacingBefore(25);
      
      t.setSpacingAfter(25);
      
      PdfPCell c1 = new PdfPCell(new Phrase("Header1"));  
      
      t.addCell(c1);
      
      PdfPCell c2 = new PdfPCell(new Phrase("Header2"));
      
      t.addCell(c2);
      
      PdfPCell c3 = new PdfPCell(new Phrase("Header3"));
      
      t.addCell(c3);
      
      t.addCell("1.1");
      
      t.addCell("1.2");
      
      t.addCell("1.3");
      
      section1.add(t);

Trong đoạn mã của Liệt kê 6, chúng ta tạo ra một đối tượng bảng PDFPTable là t có ba cột và tiếp tục thêm các hàng. Tiếp theo, chúng ta tạo ra ba đối tượng PDFPcell, có văn bản khác nhau. Chúng ta tiếp tục thêm chúng vào bảng. Chúng được thêm vào hàng đầu tiên, bắt đầu từ cột đầu tiên, di chuyển sang cột tiếp theo trong cùng hàng. Sau khi hoàn thành một hàng, các ô tiếp theo được thêm vào cột đầu tiên của hàng kế tiếp. Cũng có thể thêm một ô vào bảng bằng cách chỉ cung cấp văn bản của ô đó, chẳng hạn như t.addCell("1.1");. Cuối cùng, đối tượng table (bảng) được thêm vào đối tượng section (phần).

Sau cùng, chúng ta hãy xem cách thêm một danh sách vào tài liệu PDF. Một danh sách có chứa một số các ListItem. Một danh sách có thể được đánh số hoặc không được đánh số. Việc chuyển đối số đầu tiên thành true (đúng) có nghĩa là bạn muốn tạo danh sách có đánh số.

Liệt kê 7. Tạo đối tượng list (danh sách)
List l = new List(true, false, 10);

l.add(new ListItem("First item of list"));

l.add(new ListItem("Second item of list"));

section1.add(l);

Chúng ta đã thêm mọi thứ vào đối tượng chapter1. Bây giờ chúng ta thêm một hình ảnh vào dự án java này. Chúng ta có thể mở rộng quy mô hình ảnh bằng cách sử dụng một trong những phương thức Image (Hình ảnh) sau:

  • scaleAbsolute()
  • scaleAbsoluteWidth()
  • scaleAbsoluteHeight()
  • scalePercentage()
  • scaleToFit()

Trong Liệt kê 8, chúng ta đã sử dụng phương thức scaleAbsolute. Và sau đó thêm đối tượng image vào section này.

Liệt kê 8. Thêm Image vào tài liệu chính
Image image2 = Image.getInstance("IBMLogo.bmp");

      image2.scaleAbsolute(120f, 120f);
      
      section1.add(image2);

Lớp com.itextpdf.text.Anchor trong iText đại diện cho một liên kết hoặc tới một trang web bên ngoài hoặc bên trong trong tài liệu. Có thể nhấn chuột vào anchor (neo liên kết) giống như một liên kết trong một trang web. Để thêm anchor chúng ta cần tạo ra một anchor mới và thiết lập tài liệu tham chiếu đến Anchor đích đã tạo ra trong Liệt kê 3. Sau đó thêm anchor này vào phần và thêm phần này vào tài liệu.

Liệt kê 9. Thêm Anchor vào tài liệu chính
Paragraph title2 = new Paragraph("Using Anchor", 

        FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, 

        new CMYKColor(0, 255, 0, 0)));

section1.add(title2);

title2.setSpacingBefore(5000);

Anchor anchor2 = new Anchor("Back To Top");

anchor2.setReference("#BackToTop");

section1.add(anchor2);

Không còn các phần tử nào để thêm vào chapter1 nữa, đây là lúc để thêm chapter1 vào document (tài liệu) chính. Chúng ta cũng sẽ đóng đối tượng tài liệu ở đây khi chúng ta đã thực hiện xong ứng dụng ví dụ mẫu.

Liệt kê 10. Thêm một chương vào tài liệu chính
document.add(chapter1);

document.close();

Chạy ứng dụng ví dụ mẫu

  1. Tải ứng dụng ví dụ mẫu, tệp j-itextsample.jar (xem phần Tải về).
  2. Giải nén tệp j-itextsample.jar vào một thư mục. Ví dụ, nếu bạn giải nén nó vào C:\temp, thì bạn sẽ đặt các tệp nguồn và lớp vào C:\temp\com\itext\test.
  3. Mở một dấu nhắc lệnh và thay đổi thư mục này thành C:\temp.
  4. Thiết lập đường dẫn lớp của hệ thống của bạn theo dấu nhắc lệnh này. Hãy đưa C:\temp\itext-5.3.0.jar vào đường dẫn lớp của hệ thống. Trên Windows®, chạy lệnh set classpath=C:\temp\itext-5.3.0.jar;%classpath%.
  5. Chạy ứng dụng bằng lệnh java com.itext.test.ITextTest.

Chương trình sẽ tạo ra tài liệu ITextTest.pdf tại C:\. Hình 3 cho thấy một ảnh chụp màn hình của trang đầu tiên của tài liệu PDF.

Hình 3. Ảnh chụp màn hình của tài liệu PDF
Ảnh chụp màn hình của tài liệu PDF

Hình 4 cho thấy một ảnh chụp màn hình của Chương 1 (Chapter 1) và phần, văn bản, bảng, danh sách và hình ảnh của nó trong tài liệu PDF.

Hình 4. Ảnh chụp màn hình của tài liệu PDF
Ảnh chụp màn hình của tài liệu PDF

Hình 5 cho thấy một ảnh chụp màn hình của liên kết Neo trong tài liệu PDF.

Hình 5. Ảnh chụp màn hình của tài liệu PDF
Ảnh chụp màn hình của tài liệu PDF

Kết luận

Bạn đã thấy được một số phần tử cơ bản về tạo PDF. Vẻ đẹp của iText là ở chỗ bạn có thể sử dụng cú pháp của phần tử giống nhau theo các kiểu các trình writer khác nhau. Ngoài ra, bạn có thể chuyển hướng lại kết quả đầu ra của trình writer tới giao diện điều khiển (trong trường hợp của các trình writer XML và HTML), tới luồng đầu ra của các servlet (trong trường hợp của một đáp ứng với yêu cầu web cho các tài liệu PDF) hay bất kỳ loại khác nào của OutputStream (Luồng đầu ra). iText cũng có ích trong những tình huống nào có đáp ứng giống nhau, nhưng kiểu đáp ứng lại thay đổi giữa PDF, RTF, HTML, XML. iText cho phép bạn tạo ra các hình mờ, mã hóa tài liệu và những điều thú vị về kết quả đầu ra khác.


Tải về

Mô tảTênKích thước
Sample code, updatedos-javapdf-itextsample.jar14KB

Tài nguyên

Học tập

  • Lấy thêm thông tin về iText.
  • Hướng dẫn: iText theo Ví dụ, như tên của nó ngụ ý, có các hướng dẫn, cũng như một danh sách các tính năng iText.
  • Truy cập Eclipse.org để có được thông tin toàn diện về chương trình này và cách sử dụng nó.
  • "Bắt đầu với Nền tảng Eclipse" (David Gallardo, developerWorks, 11.2002) cung cấp một lịch sử và tổng quan về Eclipse, bao gồm các chi tiết về cách cài đặt Eclipse và các trình cắm thêm.
  • Theo sát với các sự kiện kỹ thuật và webcast của developerWorks.
  • Truy cập Vùng mã nguồn mở của developerWorks để tìm rất nhiều thông tin hướng dẫn, các công cụ và các bản cập nhật dự án để giúp bạn phát triển với các công nghệ nguồn mở và sử dụng chúng với các sản phẩm của IBM.
  • Xem các hội nghị sắp tới, các cuộc triển lãm thương mại, webcast và Các sự kiện khác trên thế giới mà các nhà phát triển nguồn mở của IBM quan tâm.
  • Theo dõi developerWorks trên Twitter.

Lấy sản phẩm và công nghệ

  • Là một người quan tâm đến việc phát triển với Eclipse, có thể bạn muốn xem một bản dùng thử của Ấn bản tiêu chuẩn Nhà phát triển ứng dụng Rational của IBM, một công cụ phát triển thương mại được xây dựng trên công nghệ Eclipse.
  • Truy cập phần mềm dùng thử của IBM (có sẵn để tải về hoặc trên đĩa DVD) và đổi mới trong dự án phát triển nguồn mở tiếp theo của bạn bằng cách sử dụng phần mềm chủ yếu dành cho các nhà phát triển.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Công nghệ Java, Nguồn mở
ArticleID=870545
ArticleTitle=Tạo động các tài liệu PDF từ ứng dụng Java
publish-date=04162013