문제의 근원.
얼마 전 JSP를 통해 PDF 보고서를 생성하는 작은 프로젝트를 했는데 정말 놀라운 일이었습니다. 회사 정보 양식 중 일부는 네트워크를 통해 HTML 보고서로 표시됩니다. IE에서는 표시된 내용을 직접 인쇄할 수 있지만 인터페이스 관점에서 볼 때 Html 표시 결과가 직접 인쇄되면 그다지 아름답게 보이지 않습니다. PDF 파일로 변환한 후 인쇄하시면 인쇄 효과가 훨씬 좋아집니다.
iText 소개
iText는 PDF 파일을 쉽게 생성하는 데 사용할 수 있는 오픈 소스 Java 클래스 라이브러리입니다. http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948을 방문하여 최신 버전의 클래스 라이브러리를 다운로드할 수 있습니다. 다운로드가 완료되면 이 패키지를 에 추가하세요. 이를 사용하려면 JDK 클래스 경로를 사용하세요. 생성된 PDF 파일에 중국어, 일본어 및 한국어 문자가 표시되어야 하는 경우 http://itext.sourceforge.net/downloads/iTextAsian.jar을 방문하여 iTextAsian.jar 패키지도 다운로드해야 합니다.
iText 클래스 라이브러리 사용과 관련하여 http://www.lowagie.com/iText/tutorial/index.html 에 더 자세한 튜토리얼이 있습니다. 이 튜토리얼은 처음부터 시작하여 PDF 파일에 텍스트, 그림, 표 등을 배치하는 방법과 기술을 체계적으로 소개합니다. 이 튜토리얼을 읽고 나면 간단한 PDF 파일부터 복잡한 PDF 파일까지 만들 수 있습니다. 그러나 튜토리얼을 통해 PDF 파일을 생성하는 과정에서 발생하는 모든 어려움을 해결하려는 노력은 의심할 여지 없이 사치입니다. 따라서 iText API 문서를 읽는 것이 매우 중요합니다. 독자는 클래스 라이브러리를 다운로드할 때 클래스 라이브러리의 문서도 다운로드할 수 있습니다.
iText를 사용하여 Java 프로그램에서 PDF 보고서를 생성하는 방법
다음은 위 튜토리얼의 가장 간단한 예입니다. 이 예는 iText를 통해 PDF 파일을 생성하기 위한 일반적인 프로그램 프레임워크를 설명합니다. 독자는 document.open();과 document.close(); 사이에 PDF 파일에 넣고 싶은 내용을 추가하기만 하면 됩니다. 이 예에서는 PDF 파일에 "Hello World"라는 텍스트 줄만 추가합니다.
Document document = new Document();
try
{
PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));
document.open
(
);
document.add(new Paragraph("Hello World"));
DocumentException de)
{
System.err.println(de.getMessage());
}
catch(IOException ioe)
{
System.err.println(ioe.getMessage())
}
document.close
();
위의 예를 보면 프로그램의 프레임워크는 매우 명확하고 간단합니다. 하지만 PDF에서 텍스트, 그림, 표의 위치를 지정하는 것은 매우 번거로운 작업입니다. 프로그램 내에서 위치를 끊임없이 수정하고, 프로그램을 실행하고, PDF 파일을 생성하고, PDF 내 요소의 위치가 적절한지 관찰하는 과정 외에는 이보다 더 좋은 방법은 없을 것 같습니다.
JSP를 통해 PDF 보고서를 생성하는 방법은
iText 튜토리얼에서 사용할 수 없으며 인터넷에는 관련 정보가 상대적으로 적습니다. 한 번은 CSDN에 구현 세부 사항을 요청하는 게시글을 본 적이 있으며, 구현 원칙에 대해 답변한 사람이 있습니다. 먼저 서버에서 PDF 파일을 생성한 다음 사용자가 PDF 파일을 가리키는 하이퍼링크를 클릭하여 다운로드하거나 열도록 선택합니다. 이것은 아이디어이거나 아이디어 중 하나입니다. 이 글에서는 이 아이디어를 실현하고 또 다른 아이디어를 제시하고 이를 두 가지 방식으로 구현한다.
1) 서버에서 직접 PDF 파일을 생성합니다.
<%@ 페이지 가져오기 ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
문자열 파일 이름 = "PDF"+(new Random()).nextInt ()+".pdf" ;
문서 문서 = new Document(PageSize.A4);
ServletOutputStream
out1 = response.getOutputStream();
try
{
PdfWriter 작가 = PdfWriter.getInstance(document, new FileOutputStream(filename) );
);
document.add(new Paragraph("Hello World"));
document.close()
}
catch(Exception e){}%>
위 프로그램은 서버에 정적 PDF 파일을 생성합니다. 당연히 각 실행에서 얻은 PDF 파일의 이름은 고유해야 하며 중복되지 않아야 합니다. 이 프로그램은 무작위 기능을 사용하여 생성된 PDF 파일의 이름을 지정합니다. 이 프로그램의 단점은 실행될 때마다 PDF 파일이 서버에 생성된다는 점이며, 시간 내에 삭제되지 않으면 그 수가 점점 더 커진다는 점은 사이트 관리자가 원하지 않는 일입니다. 보다.
2) PDF 파일을 스트림 형태로 클라이언트의 캐시로 전송합니다. 이것의 장점은 서버에 "유물"을 남기지 않는다는 것입니다.
i) JSP 페이지를 통해 직접 생성
<%@
page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.setContentType( "application/pdf" );
Document document = new Document();
ByteArrayOutputStream();
PdfWriter 작가=PdfWriter.getInstance( document, buffer )
;
document.add(new Paragraph("Hello World"));
document.close();
DataOutput 출력 = new DataOutputStream( response.getOutputStream() );
byte[] bytes =
response.setContentLength(bytes.length)
for( int i = 0; i < bytes. 길이; i++ )
{
출력.writeByte( bytes[i]
}
%>
ii) 서블릿을 통해 생성
import java.io.*;
import javax.servlet.http
.*;
import
com.lowagie.text.pdf
.*;
HttpServletResponse 응답)
throws IOException,ServletException
{
Document document = new Document(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream ba = new ByteArrayOutputStream()
try
{
PdfWriter 작가 = PdfWriter.getInstance(
document, ba);
.open();
document.add(new Paragraph("Hello World"));
}
catch(DocumentException de)
{
de.printStackTrace()
("문서 오류:" +de.getMessage() );
}
document.close();
response.setContentLength
(
ba.size
())
;
()
}
되었습니다
. 이 기사의 소스 코드는 내 tomcat4에서 디버깅되었습니다. 모든 사람에게 편리함을 가져다 줄 수 있기를 바랍니다.
누구나 자유롭게 사용하실 수 있으며, 재배포가 필요하신 경우 출처를 밝혀주세요.