PDF 문서 생성, 출력, 변환
http://cafe.daum.net/iLogic/915W/20?docid=1KHkj915W2020110321201150
PDF 문서 생성, 출력, 변환PDF 문서는 소형 프로그래밍 언어로 작성된 명령들로 해상도 독립 벡터 그래픽, 텍스트, 이미지를 저장한다. PDF 문서는 이미지와 텍스트를 여러 페이지 포함할 수 있다. PDF 는 크로스 플랫폼, 읽기 전용 문서, 해상도 독립 그래픽 드로잉에 유용하다. 모든 어플에 대해 Quartz 는 그림 13-1 처럼 어플의 드로잉 연산을 보존하는 충실도가 높은 PDF 문서를 생성한다. 결과 PDF 는 시스템의 다른 일부나 외우 업체 제품으로 특정 프린터나 웹을 위해 특정한 목적으로 최적화될 수도 있다. Quartz 에서 생성된 PDF 문서는 미리보기나 Acrobat 에서 볼 수 있다. 그림 13-1 Quartz 는 고해상도 PDF 문서를 생성한다. Quartz 는 "디지털 종이" 로 PDF 를 사용할 뿐만 아니라 PDF 를 표시하고 생성하고, PDF 관련 작업들을 사용할 수 있는 수많은 API 함수중 일부를 포함하고 있다. 다음 내용을 다룬다. PDF 언어와 문법을 포함한 PDF 에 대한 자세한 정보는 PDF 레퍼런스 네 번째 판인 버전 1.5 를 참고해라. PDF 열기와 화면 출력Quartz 는 PDF 문서를 표현하기 위해
그림 13-2 PDFViewer 샘플 어플에 의해 표시된 PDF 문서 코드 13-1 은 CGPDFDocument 객체를 생성하고 문서내의 페이지수를 얻는 방법을 보여준다. 코드 13-1 PDF 파일로부터 CGPDFDocument 객체를 생성하는 함수 CGPDFDocumentRef MyGetPDFDocumentRef (const char *filename) { CFStringRef path; CFURLRef url; CGPDFDocumentRef document; path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8); url = CFURLCreateWithFileSystemPath (NULL, path, // 1 kCFURLPOSIXPathStyle, 0); CFRelease (path); document = CGPDFDocumentCreateWithURL (url);// 2 CFRelease(url); count = CGPDFDocumentGetNumberOfPages (document);// 3 if (count == 0) { printf("`%s' needs at least one page!", filename); return NULL; } return document; } 코드 설명:
코드 13-2는 PDF 페이지를 그래픽 콘텍스트에 드로잉하는 방법을 보여준다. 코드 13-2 PDF 페이지를 드로잉하는 함수 void MyDisplayPDFPage (CGContextRef myContext, size_t pageNumber, const char *filename) { CGPDFDocumentRef document; CGPDFPageRef page; CGRect box; document = MyGetPDFDocumentRef (filename);// 1 page = CGPDFDocumentGetPage (document, pageNumber);// 2 CGContextDrawPDFPage (myContext, page);// 3 CGPDFDocumentRelease (document);// 4 } 코드 설명:
PDF 페이지용 변환을 생성Quartz 는 PDF 페이지의 한 상자를 대입한 사각형으로 매핑하는 affine 변환을 생성하는 CGAffineTransform CGPDFPageGetDrawingTransform ( CGPPageRef page, CGPDFBox box, CGRect rect, int rotate, bool preserveAspectRatio ); 함수는 다음 알고리즘을 사용하여 affine 변환을 리턴한다.
예를 들어 그림 13-3 에서 보이는 PDF 파일을 보여주는 어플을 작성할 때 이 함수를 사용할 수 있다. 왼쪽과 오른쪽으로 회전하는 기능을 제공하고자 한다면, 현재 윈도우 크기와 회전하는 설정에 대한 적절한 변환을 계산하기 위해 그림 13-3 오른쪽으로 90 도 회전된 PDF 페이지 코드 13-3 은 함수에 전달된 파라미터를 사용하여 PDF 페이지용 affine 변환을 생성하는 함수가 변환을 적용하고 PDF 페이지를 드로잉하는 방법을 보여준다. 코드 13-3 PDF 페이지용 affine 변환 생성 void MyDrawPDFPageInRect (CGContextRef context, CGPDFPageRef page, CGPDFBox box, CGRect rect, int rotation, bool preserveAspectRatio) { CGAffineTransform m; m = CGPDFPageGetDrawingTransform (page, box, rect, rotation,// 1 preserveAspectRato); CGContextSaveGState (context);// 2 CGContextConcatCTM (context, m);// 3 CGContextClipToRect (context,CGPDFPageGetBoxRect (page, box));// 4 CGContextDrawPDFPage (context, page);// 5 CGContextRestoreGState (context);// 6 } 코드 설명:
PDF 파일 생성 PDF 파일을 그래픽 콘텍스트에 드로잉하는 것과 같이 Quartz 2D 를 사용하여 PDF 파일을 생성하는 것은 쉽다. PDF 파일의 위치를 명시하고, PDF 그래픽 콘텍스트를 설정하고, 다른 그래픽 콘텍스트에서 사용했던 동일한 드로잉 루틴을 사용하게 된다. 코드 13-4 의 코드는 사전용 키 상수의 목록과 이들에 대한 정보는 CGPDFContext 레퍼런스 를 참고해라. 코드 13-4 PDF 를 생성하는 함수 void MyCreatePDFFile (CGRect pageRect, const char *filename)// 1 { CGContextRef pdfContext; CFStringRef path; CFURLRef url; CFMutableDictionaryRef myDictionary = NULL; path = CFStringCreateWithCString (NULL, filename, // 2 kCFStringEncodingUTF8); url = CFURLCreateWithFileSystemPath (NULL, path, // 3 kCFURLPOSIXPathStyle, 0); CFRelease (path); myDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // 4 CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File")); CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name")); pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); // 5intent CFRelease(myDictionary); CFRelease(url); CGContextBeginPage (pdfContext, &pageRect); // 6 myDrawContent (pdfContext);// 7 CGContextEndPage (pdfContext);// 8 CGContextRelease (pdfContext);// 9 } 코드 설명:
링크 추가생성한 PDF 콘텍스트에 링크와 지점을 추가할 수 있다. iPhone OS 와 Mac OS X v10.4 부터, Quartz 는 링크에 관한 정보와 파라미터로 PDF 그래픽 콘텍스트를 갖는 다음의 3 가지 함수를 제공한다.
PDF 콘텐츠 보호iPhone OS 와 Mac OS X v10.4 부터 가능한 PDF 콘텐츠를 보호하려면,
다음 강좌의 코드 14-4 는 PDF 문서가 공개인지 비공개인지를 검사하고, 패스워드를 사용하여 문서를 오픈하는 코드를 보여줄 것이다. |