2007년 11월 29일 목요일

Windows 환경에서 Apache 2.2.x + PHP 5.2.x 설치 및 설정하기

How to install Apache 2.2.x + PHP 5.2.x ???

래년 3월에 있게될 PHP프로젝트 땜에 Windows환경에 Apache 와 PHP 설치를 시도하게 되였습니다.

예전엔 Linux 환경에서 Apache 와 PHP 설치를 많이 해보았었는데, 윈도우 환경에서 해보니까 여러모로 새롭습니다.

설치 순서는 다음과 같습니다.
  1. Apache 서버 설치
  2. PHP 설치
  3. Apache  및 PHP 연동

아파치 서버는 소스가 아닌 바이너리 설치 파일로 다운로드 받습니다.
바이너리 설치 파일을 아파치 홈페이지에서 찾았는데 소스밖에 나와있지 않네요.
아래 미러링 사이트에 가시면 바이너리 파일을 다운로드 받으실 수 있습니다.
http://ftp.kaist.ac.kr/pub/Apache/httpd/binaries/win32/
파일명이 apache_2.2.6-win32-x86-no_ssl.msi 이렇게 표기된 파일을 다운로드 받습니다.

다운로드를 받으신후 직접 실행하셔서 설치를 시도합니다.

사용자 삽입 이미지


도메인 네임은 아래 스샷에서와 같이 설정하시면 됩니다. 메일주소는 당연 본인의 메일주소로 하셔야 겠죠?

사용자 삽입 이미지

다음을클릭하면 무난히 아파치 서버를 설치하실수 있습니다.
다음 주소로 접근하여 서버가 정상적으로 설치가 되였는지를 확인합니다.
http://localhost/

다음은 PHP를 설치하겠습니다.
http://www.php.net  에 접근하여 최신 PHP ZIP파일을 다운로드 받습니다.
저는 5.2.5 버젼을 다운로드 받았습니다.

다운로드 받으신  PHP ZIP파일을 적당한 위치에 압축을 풀어줍니다.
저는 D:\Dev Server\APM 이 경로에 압축을 풀고 폴더명을 PHP 5.2.5 으로 바꿨습니다.

PHP압축을 푸는것만으로 PHP 설치는 끝나고 남은 작업이라면 Apache 와 PHP를 연동 작업뿐입니다.

PHP 5.2.5 폴더로 가시면 php.ini-dist 라는 파일이 보일겁니다. 이 파일을 한부 복사하여 명칭을 php.ini로 바꾸어 줍니다.
만약 Windows폴더 밑으로 php.ini파일 복사를 하기를 원하지 않으시면
conf/httpd.conf파일 속에 아래 라인을 추가하시면 됩니다.

PHPIniDir "D:/Dev Server/APM/PHP 5.2.5/"

다음 php.ini파일은 C:\Windows 폴더 및에 복사하시고 php5ts.dll 및libmysql.dll 두 파일을 C:\Windows/System32 에 복사하여 넣습니다.

다음 Apache 설치된 폴더속으로 들어가 보시면 conf라는 폴더가 보일건데 그 속의 httpd.conf 파일을 메모장으로 여시고

#LoadModule ssl_module modules/mod_ssl.so

이 라인 아래에

LoadModule php5_module D:/Dev Server/APM/PHP 5.2.5/php5apache2_2.dll

이 한줄을 추가합니다.
실제 PHP가 설치된 경로에 마추어 작성해셔야 합니다.

또한

AddType application/x-gzip .gz .tgz

이 라인 아래에

AddType application/x-httpd-php .php

이 라인도 추가합니다.

이상 Apache, php 설치 및 설정이 끝납니다.

2007년 11월 22일 목요일

JavaScript의 객체지향

JavaScript는 단순한 스크립트이지만 객체지향을 지원하고 있습니다.

가령 ClassA와 ClassB가 존재하고 ClassB가 ClassA를 상속하고 있다면 실제 JS로 어떻게 구현할가요?
아래에 그럼 간단한 샘플 코드를 첨부하도록 하겠습니다.

<script>
function ClassA()
{
    this.a='a';
}
function ClassB()
{
    this.b='b';
}
ClassB.prototype=new ClassA();
var objB=new ClassB();
for(var p in objB)document.write(p+"<br>");
</script>

하지만 JS의 원형 상속구조는 Clone(복사) 상속구조가 아닌 Refer(참조)상속입니다.
이런 이유땜에 만약 ClassA인스턴스 맴버변수를 변경하면 ClassB 인스턴스도 변화를 가져오게 됩니다.

<script>
function ClassA()
{
    this.a='a';
}
function ClassB()
{
    this.b='b';
}
ClassB.prototype=new ClassA();
var objB=new ClassB();
alert(objB.a);
ClassB.prototype.a='changed!!';
alert(objB.a);
</script>

하지만 파생된 클래스에서 맴버변수에 대한 수정은 부모 클래스에는 영향을 주지 않으므로 실제 상속된것과 같은 형태로 표현이 되여집니다. 즉 쓰기 작업은 파생된 클래스에 한해서 진행이 되고 읽기는 부모 클래스( 자식 클래스에서 오버라이딩하지 않았을시)에 한해서 진행이 되여집니다.

또한 파생된 클래스 인스턴스가 하나가 아닌 두개가 존재한다면 두 인스턴스가 동일한 부모 클래스 맴버변수를 참조하게 되므로 실제 비교를 해보면 똑같은 결과가 나옴을 알수 있습니다.

<script>
function ClassA()
{
    this.a=function(){alert();};
}
function ClassB()
{
    this.b=function(){alert();};
}
ClassB.prototype=new ClassA();
var objB1=new ClassB();
var objB2=new ClassB();
alert(objB1.a==objB2.a);
alert(objB1.b==objB2.b);
</script>

아래에 첨부한 코드를 살펴보면 가장 치명적인 문제를 발견할 수 있는데, 보시다 싶이 ClassB의 인스턴스 objB1속의 맴버변수의 값만 변경하였을 뿐인데 objB2의 값까지도 변경이 되여져 있습니다.

<script>
function ClassA()
{
    this.a=[];
}
function ClassB()
{
    this.b=function(){alert();};
}
ClassB.prototype=new ClassA();
var objB1=new ClassB();
var objB2=new ClassB();
objB1.a.push(1,2,3);
alert(objB2.a);
// 모든 ClassB 인스턴스속의 a값이 모두 변화가 일어났다!!!
</script>

이러한 원인 때문에 위에서 설명드린 방식으로 상속을 구현하는것 보다는 prototype을 이용하여 상속을 구현하면 실제 저희가 원하는 결과를 얻을수 있습니다.

prototype상속은 파생된 클래스의 원형(原型)객체를 부모클래스의 한 인스턴스로 설정하여 상속을 구현하고 있습니다.

사용상 편이를 위하여 Function 객체의 한 메소드로 정의하여 사용합니다.

Function.prototype.Extends = function (parentClass)
{
  var Bs = new Function();
  Bs.prototype = parentClass.prototype;
  this.prototype = new Bs();
  this.prototype.Super = parentClass;
  this.prototype.constructor = this;
}

2007/11/17 - [분류 전체보기] - Prototype 1.5.0 API
2007/11/14 - [자바 어플리케이션/기타 프레임웍들] - JSValidate - Form Validation Library
2007/09/14 - [자바 어플리케이션/기타 프레임웍들] - Prototype 은 어떻게 DOM에 대한 확장을 하였는가?
2007/09/13 - [자바 어플리케이션/기타 프레임웍들] - prototype 1.5.1.1 Javascript 프레임웍 사용기 - 제1부
2007/02/26 - [자바 어플리케이션/기타 프레임웍들] - Prototype을 위한 퀵 가이드

2007년 11월 14일 수요일

JSValidate - Form Validation Library

JSValidate는 Prototype과 Script.aculo.us을 기반으로 한 심플한 라이버리이며 사용자들로 하여금 폼 유효성체크를 쉽게 할수 있도록 도와줍니다.

라이브러리는 http://www.jsvalidate.com/ 에서 다운로드 받으실수 있습니다.

실제 사용자는 특정된 CSS 클래스를 만들고 이에 관련되여 Form속의 필드에 Annotate를 추가하는것으로만 놀라운 Validation 효과를 만들수가 있습니다.

폼에 사용되여질수 있는 Annotate들은 다음과 같습니다.

  • jsrequired - 필드가 일렬의 값을 필요로 할때(필수입력사항).
  • jsvalidate_number - 모든 인티져 (정수 + 부수)
  • jsvalidate_digits - 오로지 숫자만 허용
  • jsvalidate_alpha - 오로지 알파벳만 허용
  • jsvalidate_alphanum - 알파벳, 숫자만 허용
  • jsvalidate_email - 유효한 메일 주소
  • jsvalidate_uscanzip - 미국과 캐나다의 우편번호만 허용
  • jsvalidate_usstate - 미국 주 이니셜
  • jsvalidate_usphone - 미국 전화번호
  • jsvalidate_creditcard - Validates VISA, MasterCard, American Express 을 허용
  • jsvalidate_ssn - 샘플 포맷으로 열거한 포맷만 허용 - XXXXXXXXX, XXX XX XXXX, or XXX-XX-XXXXX
  • select-notfirst - 콤보박스에서 첫 항목에 대한 선택을 허용않함
2007/11/13 - [분류 전체보기] - Javascript Utility Version 2
2007/02/26 - [자바 어플리케이션/기타 프레임웍들] - Prototype을 위한 퀵 가이드

2007년 11월 13일 화요일

구글, 안드로이드 현상금 1천만 딸러...

구글은 12일날 안드로이드 OS를 공개하였고, 어마어마한 금액으로써 공모전을 개최한다고 발표하였습니다.

한화 93억이 걸린 이번 공모전은 2008년 1월 2일부터 2008년 3월 3일 까지 진행됩니다.
공모전에 참가하는 방법은

1. 구글 안드로드이드 개발자 홈페이지에서 안드로이드 개발 전용툴을 다운로드 받습니다.
2. 개인 혹은 팀에서 여러가지 Idea를 내가지고 창의적인 애플리케이션들을 만듭니다.
3. 공모전 신청서를 제출합니다.

구글, 안드로이드 UI 공개

구글 안드로이드 SDK UI공개!

SDK에 포함된 안드로이드 OS 예뮬레이터 덕분에 구글의 차세대 모바일 폰 플랫폼을 둘러볼수가 있게 되였습니다.^^ 실제 공개된 UI를 보시면서 안드로이드 OS를 느껴보시죠.


나의 iText 사용기...

iText 사용기...

1.  iText를 시작하면서...
프로젝트를 진행하면서 출력 결과물을 PDF로 작성해야할 필요성으로 하여 PDF 레포트를 생성시켜주는 자바 라이브러리인 - iText를 사용하였습니다. 실제 iText를 이용하면 서버사이드에서 Jsp나 JavaBean을 이용하여 여러가지 형식의 PDF 레포트를 만드실수가 있습니다.

2. iText에 대한 간단한 소개
iText 유명한 오픈소스 배포사이트인 sourceforge에서 진행하고 있는 프로젝트중의 하나로써, PDF 문서를 만들어주는 Java 라이브러리입니다. iText를 이용하여 PDF 문서는 물론 RTF 문서도 만드실수가 있습니다. 또한 XML, HTML 문서도 PDF문서로 컨버팅 하실수도 있습니다.

3. iText를 이용하여 생성된 나의 첫 PDF 문서
iText를 이용하여 PDF 문서를 생성하는데는 모두 5가지 절차가 필요합니다.

com.lowagie.text.Document 클래스 인스턴스를 생성합니다.

Document document = new Document();

② Writer와 Document 사이의 연관을 맺어줍니다. Writer를 이용하여 문서를 하드디스크 상에 써넣을 수 가 있습니다.
PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF"));

③ 문서를 오픈합니다.
document.open();

④ 문서에 내용을 첨부합니다.
document.add(new Paragraph("Hello World"));

⑤ 문서를 닫습니다.
document.close();

위 다섯가지 절차를 거치면 Helloworld.PDF 문서를 생성하실 수가 있습니다.

그럼 Document 클래스에 대하여 좀 더 자세히 알아볼가요?

com.lowagie.text.Document 인스턴스를 생성하는 방법은 모두 3가지가 있는데 그것들로는

public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom);

생성자 메소드 파라미터 pageSize는 생성한 문서의 페이지 크기이고, 실제 사이즈는 A4용지에 최적화 되여있습니다.
세번째 생성자 메소드 파라미터 marginLeft、marginRight、marginTop、marginBottom 는 좌, 우, 상, 하의 페이지 여백입니다.

그러면 Writer 객체는 멀가요?

일단 document인스턴스가 만들어지면 이 문서를 실제 하드디스크 상에 쓸 라이터가 필요합니다. 실제 이런 라이터를 거쳐 만들어진 문서를 우리가 원하는 포맷으로 하드디스크 상에 써 넣을수가 있습니다. 예하면 com.lowagie.text.PDF.PDFWriter 는 문서를 PDF포맷으로 저장시킬수가 있고 com.lowagie.text.html.HtmlWriter 는 문서를 HTML 포맷으로 저장시킬수가 있습니다.

그렇다면 문서의 속성을 어떻게 지정할수 있을가요?

실제 문서를 오픈 하기전에 문서의 속성을 지정하실수가 있습니다. 문서의 속성들을 여러가지 펙터들이 있는데 그것들로는 타이틀, 주제, 저자, 키워드, 배포방식, 생성자, 프로듀서, 생성일자 등입니다.

실제 이런 속성들을 세팅해주기 위하여 아래와 같은 메소드가 필요합니다.

public boolean addTitle(String title)
public boolean addSubject(String subject)
public boolean addKeywords(String keywords)
public boolean addAuthor(String author)
public boolean addCreator(String creator)
public boolean addProducer()
public boolean addCreationDate()
public boolean addHeader(String name, String content)

그중 addHeader 은 PDF문서에서는 무효하고 HTML 문서에 한해서만 그 유효합니다.

또한 새페이지를 만들기전 페이지의 크기, 북마크, 헤더와 푸터 등도 설정할수가 있습니다. 위 속성들을 세팅하기 위하여 호출이 되여질 메소드들은

public boolean setPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void setHeader(HeaderFooter header)
public void resetHeader()
public void setFooter(HeaderFooter footer)
public void resetFooter()
public void resetPageCount()
public void setPageCount(int pageN)

위 메소드들은 실제 위 속성이 세팅될 페이지를 만들기 전에 호출이 되여져야 합니다.

4. 텍스트 처리

iText에서는 Chunk, Phrase, Paragraph 등 을 이용하여 텍스트 처리를 하고 있습니다.
Chunk는 텍스트 처리상 가장 작은 단위로써 글자체, 색상, 크기 등 속성을 포함한 문자열로 구성이 되여져 있습니다. 아래 코드를 실행하면 글자체가 HELVETICA이고 크기가 10 이며 밑줄이 달린 텍스트를 그려줍니다.

Chunk chunk = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));

Phrase는 하나 또는 그 이상의 Chunk로 이루어 지며 Phrase에서도 실제 문자열의 폰트스타일이나 크기를 설정하실수가 있습니다. 단 이렇게 되면 Chunk속에 설정되여있던 폰트는 무시되게 됩니다. 실제 아래와 같은 식으로 Phrase에 Chunk를 넣을수가 있습니다.

phrase.add(chunk);

Paragraph는 하나 또는 그 이상의 Chunk나 Phrase로 이루어 지며 이 역시 단락중의 폰트스타일이나 크기를 세팅할수가 있습니다. 이걸 제외하고도 단락의 인덴테이션, 정열방식등도 설정 하실수가 있습니다.

5. 테이블 처리

iText에서 제공하는 테이블 클래스는 여러가지가 있습니다. 그중 늘 사용하는것들로는 com.lowagie.text.Table, com.lowagie.text.PDF.PDFPTable 이 두가지입니다. 그중에서도 com.lowagie.text.Table 이 클래스는 좀 단순한 형태의 테이블을 그릴때 사용이 되여지구요, 좀 더 복잡한 형태의 테이블을 구성할려면 com.lowagie.text.PDF.PDFPTable 이 클래스를 사용하여야 합니다.

그렇다면 먼저 간단한 com.lowagie.text.Table 부터 살펴 보도록 하지요.

클래스 com.lowagie.text.Table에는 모두 세가지 생성자가 있는데 그것들로는

①Table (int columns)
②Table(int columns, int rows)
③Table(Properties attributes)

파라미터 속성들에 대하여 알아보면 columns는 테이블 컬럼 갯수이고, rows는 테이블의 행 갯수이며 attributes는 테이블의 속성입니다.

테이블 클래스 속성을 아주 많으므로 일일이 소개를 못 드리겠습니다. 하지만 실제 사용이 되여지는 예제를 하나 선정하여 구체적으로 각 단계마다 멀 하고 있는지를 설명드리도록 하겠습니다.

1:Table table = new Table(3);
2:table.setBorderWidth(1);
3:table.setBorderColor(new Color(0, 0, 255));
4:table.setPadding(5);
5:table.setSpacing(5);
6:Cell cell = new Cell("header");
7:cell.setHeader(true);
8:cell.setColspan(3);
9:table.addCell(cell);
10:table.endHeaders();
11:cell = new Cell("example cell with colspan 1 and rowspan 2");
12:cell.setRowspan(2);
13:cell.setBorderColor(new Color(255, 0, 0));
14:table.addCell(cell);
15:table.addCell("1.1");
16:table.addCell("2.1");
17:table.addCell("1.2");
18:table.addCell("2.2");
19:table.addCell("cell test1");
20:cell = new Cell("big cell");
21:cell.setRowspan(2);
22:cell.setColspan(2);
23:table.addCell(cell);
24:table.addCell("cell test2");

1 - 5 까지는 새로운 테이블을 만드는 부분입니다.
두번째 라인에서 알수있다싶이 이 테이블의 테두리 두께는 1이고
세번째 라인에서는 테이블 테두리 색상을 파란색으로 설정해 두었네요.
네번째 다섯번째 라인에서는 각각 테이블 세페이싱과 패딩을 주었네요.

코드 6 - 10 까지에서는 테이블의 헤더를 정의하고 있겠습니다.
라인 7에서 cell.setHeader(true); 이렇게 세팅이되여져 있는데 이것은 새로 만든 셀을 테이블의 헤더로 설정하는 작용을 합니다.
라인 8에서는 셀이 몇개의 Row를 병합할건지를 설정하고 있으며 라인 10에서는 헤더가 끝나는 위치를 정해주고 있습니다. 이렇게 되면 여러페이지가 있을 경우 첫페이지가 아닌 두번째, 세번째 페이지에서도 똑같은 셀로 구성된 헤더를 그릴수가 있게 됩니다.

6. 이미지 처리
iText에서 이미지를 처리해주는 클래스는 com.lowagie.text.Image 입니다.
현재 iText에서 지원해주는 이미지 포맷들로는 GIF, Jpeg, PNG, WMF 등이 있습니다. 부동한 이미지들에 대하여 iText는 동일한 생성자 메소드를 사용하여 자동으로 인식을 해주고 있습니다. 아래 코드를 이용하여 GIF, JPG, PNG 인스턴스를 만드실수가 있습니다.

Image gif = Image.getInstance("vonnegut.gif");
Image jpeg = Image.getInstance("myKids.jpg");
Image png = Image.getInstance("hitchcock.png"); 

이미지 정열방식은 public void setAlignment(int alignment) 메소드를 이용하여 세팅할수가 있습니다.
파라미터로 들어오는 값들은 실제 Emu타입닌데 Image.RIGHT, Image.MIDDLE, Image.LEFT 등이 있습니다.
만약 텍스트를 이미지 옆으로 배치하고 싶으시다면 Image.TEXTWRAP, Image.UNDERLYING
속성을 세팅하면 됩니다. 위 정열방식중 여러가지를 결합하여 사용할려면 | 기호로 구분시켜서 세팅하면 됩니다. 예, setAlignment(Image.RIGHT|Image.TEXTWRAP)

7. 한글 처리
iText.jar 만 이용하여 한글이나 중문 처리를 할수 없습니다. 영문이 아닌 다른 언어를 지원할려면 iTextAsian.jar 를 별도록 프로젝트에 포함시켜야 합니다.

실제 PDF 보고서 출력폼에서 많이 사용이 되여지고 있는 폰트 "명조체" 인스턴스를 만드는것을 예로 들어서 설명하드록 하겠습니다.

String fontFace = "HYGoThic-Medium";
String fontName = "UniKS-UCS2-H";
BaseFont bf = BaseFont.createFont( fontFace, fontName, BaseFont.NOT_EMBEDDED );
Font font = new Font( bf, 12 );
Paragraph pragraph=new Paragraph("안녕하세요.", font );

끝으로 iText.jar, iTextAsian.jar를 첨부하도록 하겠습니다.




2007/11/07 - [분류 전체보기] - iText를 이용하여 원 문자를 PDF에 출력하기
2007/11/07 - [자바 어플리케이션/기타 프레임웍들] - iText로 Table을 만들기

구글 안드로이드 mobile OS SDK 릴리즈!!!

구글에서 phone OS의 SDK - android 릴리즈 되였습니다.

사용자 삽입 이미지

현재 다음과 같은 것들을 지원 합니다.

  • Application framework 재사용, 교환 가능한 컴포넌트
  • Dalvik virtual machine 모바일 기기에 최적화되였습니다.
  • Integrated browser WebKit engine을 쓰는 내장 브라우저 탑제하였습니다.
  • Optimized graphics 자체 2D 그래픽 라이브러리와, OpenGL ES 1.0 스펙을 따르는 3D 그래픽 라이브러리(하드웨어 가속은 옵션적입니다.)
  • SQLite 내장 데이터베이스 (DMBS 지원한다는거죠...)
    Media support 대중적인 동영상, 이미지 포맷 지원 (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
  • GSM Telephony (하드웨어에 따라서..)
  • Bluetooth, EDGE, 3G, and WiFi (하드웨어에 따라서...)
  • Camera, GPS, compass, and accelerometer (하드웨어에 따라서...)
  • Rich development environment 자체 에뮬레이터에서 디버깅툴을 제공하고, 메모리와 성능 설정 가능하며 Eclipse IDE의 플러그인을 제공합니다.

현재 http://code.google.com/android/ 에서 안드로이드의 자료를 얻을 수 있으며,
Android Developer Challenge 라는 무려 천만 달러가 걸린 어플리케이션 컨퍼런스가 열렸습니다. 컨퍼런스 자료는 여기서 얻으실수 있습니다. http://code.google.com/android/adc.html

Javascript Utility Version 2

Javascript Utility Version 2

웹 서핑중 우연히 발견한 사이트인데요, 자바스크립트 코딩시 아주 유용할거 같네요.
웹 사이트 주소는 http://jsutility.pjoneil.net/ 입니다.

자바스크립트 유틸리티가 제공하는 기능들로는 다음과 같습니다.

  1. Tester : 짧은 코드들을 테스트해보기에 편리합니다. 특히, 정규표현식 같은 경우에 유용합니다.
  2. Validator : Douglas Crockford JSLint program (www.JSLint.com)을 기반으로 작성되어져 있으며, Javascript 전체에 포함되어져 있을 수 있는 많은 버그들을 제거하는데 도움을 줍니다.
  3. Formatter : 이쁘게 포멧팅을 해줍니다.^^
  4. Obfuscator :  소스코드를 일부러 읽기 힘들게 만들어 줍니다.
  5. Compactor : 공백이나 필요없는 주석들을 제거해서 소스코드 자체의 크기를 줄여줍니다. 실제 작성한 프로그램을 릴리즈 할때 사용하면 좋겠네요.
  6. Compression Program : 프로그램 사이즈를 줄여주는데 저 같은 경우는 한글이 들어가는수가 있으니 이 기능을 사용을 않하고 있습니다.

2007년 11월 7일 수요일

iText를 이용하여 원 문자를 PDF에 출력하기

원 문자를 PDF에 출력하기

원형 문자를 PDF에 출력하는데는 여러가지 방법이 있을 수 있습니다.
가장 무식하면서도 간단한 방법은 숫자를 쓰고 숫자 밖에 원을 그리는 것입니다.
하지만 이런 방식으로 하면 미관상 문제가 있고 처리상에서도 약간한 번거로움이 있습니다.

그래서 소개합니다. 이 모든것을 아주 쉽게 처리해주는 폰트 - CombiNumerals Pro 4.0...
하지만 Pro버젼은 라이센스가 있고 별도로 구입해야 하므로 CombiNumerals 폰트를 예제에서 사용하도록 하겠습니다.

CombiNumerals 는 http://www.fontsite.com/Pages/FFDownloads.html 에서 얻을수가있습니다. 사이트 접속이 않될때를 대비하여 첨부파일로 폰트를 올립니다.

CombiNumerals 폰트를 이용하여 원문자를 출력하는것은 아주 쉽습니다.
만약 단일 원숫자를 표시하고싶을때면 폰트를 CombiNumerals 로 바꾸고 숫자만 출력하면 됩니다.
두자리 원숫자를 표시하려면 별도로 작업을 해주셔야 하는데 두가지 키의 조합이라고 보시면 됩니다. 일단 첫 자리 수 즉 십이자리수는 기입한 수의 첫번째 숫자를 사용하고 일이자리수는 기입한 숫자의 두번째 자리 숫자를 Shirt 키를 누른채 기입하면 됩니다.
예를 들면 88을 기입하고 싶으면 실제 8*를 기입하면 됩니다.
이를 쉽게 사용하기 위하여 아래와 같은 맵을 만듭니다.

String [] charMap1 = { ")","!","@","#","$","%","^","&","*","(" };

세자리 이상되는 숫자는 별도로 처리를 해주어야 하는데 CombiNumerals pro에서만 지원하기 때문에 여기서 실제 결과를 보여줄수는 없네요. 하지만 그 처리 방법을 간단히 살펴 본다면 첫번째 자리 및 마지막 자리는 위에서 설명을 드린 두자리 수 처리 방식과 동일하면 가운데 숫자 즉 첫자리수, 마지막자리수를 제외한 기타 자리수는 zxcvbnm,./ 문자로 매핑하여 사용하시면 됩니다.
이를 쉽게 사용하기 위하여 아래와 같은 맵을 만듭니다.

String [] charMap2 = { "/","z","x","c","v","b","n","m",",","." };

실제 숫자만 입력받아서 원문자를 Chunk에 담아 리턴시켜주는 함수를 구현하였는데 아래에 첨부를 합니다. 소스가 쉬우니깐 별도로 분석을 해드리지는 않겠습니다.

소스열기

아래는 실제 위에 첨부한 메소드를 이용하여 원모양 숫자를 출력한 결과입니다.

사용자 삽입 이미지





2007/11/07 - [자바 어플리케이션/기타 프레임웍들] - iText로 Table을 만들기

iText로 Table을 만들기

Create new Table by using iText Library

HtmlWriter나 RtfWriter2 를 이용하지 않고 테이블을 만들고 렌더링할려면 iText의 PdfPTable을 사용하는 것이 가장 무난하다.

아래에 그럼 가장 간단한 예로부터 차츰차츰 PdfPTable에 대하여 알아보도록 하자.

가령 아래 그림에서와 같은 Table을 만들려면 어떻게 코드가 구성되여야 할가?

사용자 삽입 이미지

실제 윗 그림에서와 같은 테이블을 만들기 위하여 드는 노력은 그다지 많지 않다..
아래에 그럼 실제 소스를 첨부하도록 하겠다.

소스열기

PdfPTable을 만들기 위하여 사용자는 필히 테이블에 들어가는 최대 컬럼의 갯수를 파라미터로 넘겨주어야 한다. 만약 컬럼 갯수가 0이면 RuntimeException이 발생한다.

테이블 넓이 및 정열방식 세팅하기
윗 소스 기초하에 아래는 테이블의 넓이와 정열방식을 변경해보도록 하자.
보다싶이 Table속의 Cell들의 정열방식중에서 왼쪽 정열방식이 기본정열 방식이다.
만약 정열을 Center로 바꾸고 싶으면 Element.ALIGN_CENTER를 이용하여 설정할 수가 있다.

table.setHorizontalAlignment(Element.ALIGN_CENTER);

테이블 넓이를 세팅함에 있어서 념두해 두어야 할 점은 테이블 넓이는 상대 넓이와 절대 넓이가 있다는 것이다.
테이블 절대 넓이를 세팅할려면 아래 두 메소드를 사용하면 된다.

PdfPTable table = new PdfPTable(3);
table.setTotalWidth(216f);
table.setLockedWidth(true);

실제 setTotalWidth에서 받는 값은 Float값이므로 뒤에 f를 써주어야 한다. 또한 절대 넓이이므로 꼭 LockedWidth를 true로 세팅해주어야 한다.

만약 테이블을 만들때 셀들의 넓이를 미리 알고 지정해주려면 어떻게 할것인가?
모두 두가지 방법이 있는데 하나는 셀을 만들고 나서 다시 넓이를 세팅하는 방식이고 다른 하나는 Table을 만들시 직접 셀의 갯수 및 매 셀의 넓이를 지정시켜서 만드는 방식이다.
첫 번째 방식은 쉬우므로 여기서 예제는 스킵하련다.
두 번째 방식에 대한 소스는 아래에 첨부하였다.

float[] widths1 = { 1f, 1f, 2f };
PdfPTable table = new PdfPTable(widths1);

여기서 1f, 1f, 2f 는 바로 셀 3개의 넓이를 미리 지정해 준것으로써 그 값은 퍼센테이지로 환산할 수 있다.즉 전체 테이블  넓이가 100%라면 첫 cell은 1/4 이므로 25%가 될것이고 두번째 셀 역시 25% 마지막 셀은 50%가 되겠다.

사용자 삽입 이미지

만약 테이블 처리 도중 셀의 넓이를 바꾸고 싶으면 setWidths 메소드를 사용하면 된다.

float[] widths2 = { 2f, 1f, 1f };
table.setWidths(widths2);

위 메소드를 실행하여 테이블을 만든 결과는 다음과 같다.

사용자 삽입 이미지

테이블 Border 및 다양한 스타일을 주기
실제 PdfPTable을 사용하다보면 좀 갑갑한 점 있다. 기존에 iText에서 지원하는 테이블류 클래스는 모두 3가지가 있다. 그것들로는 PdfPTable, Table, SimpleTable 인데 그중에서 PdfPTable이 실제 PDF에 가장 최적화 되여 만들어진 클래스이다. 하지만 PdfPTable 클래스를 살펴보면 이 클래스가 Element 인터페이스를 구현한것을 볼수 있다. 사실 여러가지 스타일을 테이블에 무난히 적용시키 위해서는 Table 클래스를 사용해야 한다. 하지만 Table 클래스는 PDF 문서에 최적화된 스타일의 테이블을 만들어주지 못하며 아직도 여러가지 버그가 존재한다. 때문에 아래는 Table 클래스가 아닌 PdfPTable 클래스를 이용하여 여러가지 스타일시트를 적용해보겠다.

PdfPTable 클래스를 살펴보면 Border를 세팅해주는 메소드자체가 없다. 그렇다면 어떻게 PdfPTable 클래스을 이용하여 Border가 2인 테이블을 만들것인가?
이를 가능하게 하기 위하여 우리는 별도의 Template이 필요하다. 또한 이런 Template을 우리는 PdfPTableEvent 인터페이스를 구현한 클래스에 넣어주어야 한다.
PdfPtableEvent 인터페이스를 보면

public void tableLayout(PdfPTable table, float widths[][], float heights[], int headerRows, int rowStart, PdfContentByte[] canvases);

tableLayour 메소드 하나만 달랑 있다. 사실상 이메소드는 테이블 렌더링이 끝나고 나서 호출이 되여진다. 실제 이 메소드를 통하여 추가한 텍스트와 그래프들은 테이블 렌더링이 끝난후 canvases 를 포함하고 있는 PdfContentByte속에 저장이 되여진다.
그럼 실제 PdfPTableEvent 인터페이스를 구현하여 테이블에 여러가지 모양을 내보자.

테이블 외곽에 두께가 1.5인 테두리를 넣어주는 것을 예로 들겠다.

먼저 PdfPTableEvents 라는 클래스를 하나 만들어보자.

소스열기

여기서 살펴 볼 곳은 딱 세곳이다.
첫째는 PdfPTableEvent 인터페이스를 구현했다는것이고, 둘째는 두께를 1.5로 설정한것이며 마지막 Border색상을 검정색으로 정한것이다.

다음 만든 PdfPTableEvents 클래스를 인스턴스화하여 실제 PdfPTable에 세팅한다.

PdfTableEvents event = new PdfTableEvents();
table.setTableEvent(event);


이러고 나면 실제 두께가 1.5인 테두리가 그려진 테이블을 볼수가 있다.

사용자 삽입 이미지

위 코드를 좀 더 개진하여 실제 굵기를 설정하려는 ROW의 인덱스 번호만 넣으면 굵기를 세팅해주는 기능을 추가할 수가 있다.

소스열기

그리고 위 클래스 인스턴스에서 필요한 인덱스 값만 배열로 넣으면 우리가 원하는 라인의 굵기를 재 설정할 수 가 있다.

실제 처리된 결과는 다음과 같다.

사용자 삽입 이미지

2007년 11월 6일 화요일

Spring 과 iText를 연동하여 PDF 생성하기

Spring MVC와 iText 를 이용하여 PDF 문서를 생성해보도록 하겠습니다.


실제 Spring MVC를 이용하지 않고 iText만 이용하여 고품질의 PDF문서를 생성할 수 있다.
하지만 이미 프로젝트내에 Spring MVC를 도입하여 사용을 하고 있는 상황이라면 별도로 MVC를 구성하는것 보다는 아예 Spring MVC를 이용하는것이 편하다.

Spring MVC와 iText를 연동하는데 아래와 같이 4가지 단계가 필요하다.

  1. web.xml에서 서블릿 선언 및 서블릿 맷핑을 한다.
  2. pdf-servlet.xml 에서 viewController와 실제 PDF 를 엑세스할 URL을 매퍼를 선언한다.
  3. viewController 클래스를 만든다.
  4. pdfView 클래스를 만든다.

web.xml에서 아래와 같이 pdf용 서블릿을 선언하고 서블릿 맵핑을 한다.

[code xml] <!-- PDF Servlet Definition --> <servlet> <servlet-name>config/pdf</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> <!-- Servlet Mapping For PDF DispatcherServlet --> <servlet-mapping> <servlet-name>config/pdf</servlet-name> <url-pattern>*.pdf</url-pattern> </servlet-mapping>[/code] 서블릿 명을 config/pdf로 설정하였으므로 우리가 만들어야 할 pdf 서블릿 설정 파일명은 pdf-servlet.xml이 되겠다.


pdf-servlet.xml에서는 실제 pdf 페이지를 요청하였을때 호출할 컨트롤러를 매핑해주는 urlMapping 빈 및 호출될 컨트롤러를 선언해준다. [code xml] <beans> <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" /> <bean id="viewController" class="org.prototype.common.controller.MultiDocumentController" /> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/viewPDF.pdf">viewController</prop> </props> </property> </bean> </beans> [/code] viewController 클래스는 실제 MultiActionController를 상속 받고 있는데 이렇게 함으로써 하나의 Controller로써 다양한 문서의 출력이 가능하다.
[code java] public class MultiDocumentController extends MultiActionController { public ModelAndView viewPDF( HttpServletRequest request, HttpServletResponse response ) throws Exception { List<String> list = new ArrayList<String>(); Map<String, List<String>> model = new HashMap<String, List<String>>(); model.put( "list",list ); BasePdfView pdfView = new BasePdfView(); return new ModelAndView( pdfView, model ); } }[/code] 마지막으로 BasePdfView 클래스에서 실제 출력할 PDF 에 대한 코딩을 해주고 있음을 알수 있다.
[code java] public class BasePdfView extends AbstractPdfView { @SuppressWarnings("unchecked") protected void buildPdfDocument(Map model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception {} }[/code]