2013-11-20 6 views
2

PDFBox는 다양한 글꼴 유형을 포함 할 수있는 메커니즘을 제공합니다. 예를 들어, TrueType (* .ttf) 파일을 사용할 수있는 PDTrueTypeFont.loadTTF(...)을 제공합니다.PDFBox를 사용하여 * .ttc 글꼴 포함

트루 타입 형식 (* .ttc)은 트루 타입 형식의 확장명으로 파일 당 여러 글꼴을 지원합니다.

* .ttc 파일을 PDTrueTypeFont.loadTTF()으로로드하려고 시도하면 IOException이 발생합니다.

PDFBox에 * .ttc 파일의 글꼴 하나 또는 전체를 PDF 문서에 삽입하는 방법은 무엇입니까?

답변

2

PDF 사양에서는 트루 타입 컬렉션을 포함 글꼴로 사용할 수 없습니다. * .ttc에서 하나의 TTF 형식 스트림을 꺼내서 포함시켜야합니다.

그대로 (및 AFAIK) PDFBox는이 기능을 자체적으로 지원하지 않습니다. 내가 구글의 'sfntly'package.

신속하고 더러운 솔루션을 사용 :

FontFactory factory = FontFactory.getInstance(); 
Font[] fonts = factory.loadFonts(...); // pulls every TTF out of TTC 
ArrayList<PDTrueTypeFont> pdf_fonts = new ArrayList<PDTrueTypeFont>(); 
for(Font f : fonts){ 
    // sfntly writes each font to a TTF stream 
    ByteArrayOutputStream out = ByteArrayOutputStream(); 
    factory.serializeFont(f, out); 

    // PDFBox reads the stream and embeds the font 
    ByteArrayInputStream ttf_font_stream = ByteArrayInputStream(out.toByteArray()); 
    pdf_fonts.add(PDTrueTypeFont.loadTTF(document, ttf_font_stream)); 
} 

FontFontFactory가에서 com.google.typography.sfntly

자바 코드 100 % 정확 보장; 최근 Clojure에서 많이 일 해왔다 ....

+0

고마워! 좋아 보인다. sfntly를 사용하여 * .ttc 파일에서 글꼴 이름을 가져올 수 있습니까? 그리고 sfntly 글꼴의 이름을 가져 오는 것이 글꼴의 나머지 부분을 구문 분석해야하는 경우 알 수 있습니까? –

+0

sfntly로 이름을 알 수 있습니다. 그것은 정확히 "간단하지"않습니다. 'NameTable'의 인스턴스를 얻기 위해서는'getTable (Tag.name)'이 필요합니다. 거기에서'.getNameEntry'로 이름을 접근 할 수 있지만 적절한 상수를 전달해야합니다. 그러면 글꼴에 대한 수많은 "이름"에 액세스 할 수 있습니다. 당신은 아마'NameTable'을 반복하고 'FontFamilyName' 또는'PreferredFamily'를 첫 번째 엔트리를 그것의'nameId'로 가져 오는 것이 가장 안전 할 것입니다. – jgriego

+0

... 불행히도 예. sfntly'Font's를 빌드하면 sfnt 래퍼 전체를 파싱합니다. 그러나 'FontFactory.loadFontsForBuilding' (Font.Builder 객체의 목록을 제공합니다. 'name' 테이블을 파싱하기 위해 이들을 제거 할 수 있습니다. 그런 다음 빌더 객체에서'.build()'를 호출하면 주변에서 찌를 수있는'Font' 객체를 생성 할 수 있습니다. – jgriego