2016-07-26 2 views
1

대부분의 iText7 예제는 PdfFontFactory.createFont()을 사용하여 텍스트 작업을 위해 PdfFont 인스턴스에 핸들을 가져옵니다. 중재와 함께, 이것은 괜찮아요 ...하지만 PdfFont는 PdfDocument가 닫힐 때까지 사라지지 않는 것 같은 꽤 무거운 짐 객체 (PdfEncoding)입니다. 이 PdfFont 인스턴스는 하나 이상의 PdfDocument에 걸쳐 사용할 수 없습니다 나타나기 때문에PdfFont의 메모리 소비를 제한하기위한 iText7 전략

for (int i = 0; i < someLargeNumber; i++) { 
    list.add(
     new ListItem("never gonna give") 
     .setFont(PdfFontFactory.createFont("Helvetica-Oblique")) 
    ) 
} 

정적을 사용하여 솔루션에서 사소한 시도가 실패 : 그래서 다음과 같은 무고한 블록은 거 메모리를 중얼된다. 그리고 내 실제 경우 위의 예제보다 더 복잡하기 때문에, 꽤 깊은 스택을 통해 PdfFont 참조를 잔뜩 통과하고 싶지 않아요. iText7 API의

  1. 는 PdfDocument 기존 PdfFont 년대를 반복하는 방법 (이?)
  2. 이)가 당신이 원하는만큼 여러 번 사용할 수 있습니다 단순히 PdfFont 사용에 대한 규칙이다 없다 b) 즉, 단일 PdfDocument 인스턴스

(내 단순히 PdfDocument + PdfFontProgram 키로? 캐시 PdfFont 인스턴스)

+0

위에서 제안한 cacheKey는 좋지 않습니다. FontProgram 인스턴스가 정적 Map에 캐시 된 것처럼 보입니다. 즉, weakRef 캐시 키가 항상 사용 중이며 결과적으로 PdfDocument도 메모리에 유지됩니다. 더 나은 접근 방법은지도의지도 인 것 같습니다. - WeakHashMap > –

답변

0

PdfFonts가 PdfDocument 수준 캐시/재사용 가능한 것으로 표시하는 여기 가능한 솔루션이다. WeakHashMap을 캐시로 사용하는 경우 키와 값 모두 약한 참조 여야합니다. 예를 들어

private static WeakHashMap<PdfDocument, Map<String, WeakReference<PdfFont>>> fontCache = new WeakHashMap<>(); 

public static synchronized PdfFont createFont(PdfDocument forDocument, String path) throws IOException { 
    Map<String, WeakReference<PdfFont>> documentFontMap = fontCache.get(forDocument); 
    if (documentFontMap == null) { 
     documentFontMap = new HashMap<>(); 
     fontCache.put(forDocument, documentFontMap); 
    } 
    WeakReference<PdfFont> font = documentFontMap.get(path); 
    if (font == null) { 
     font = new WeakReference<>(PdfFontFactory.createFont(path)); 
     documentFontMap.put(path, font); 
    } 
    return font.get(); 
} 

관리도) (즉, 밖으로의 setFont를 호출 승/페이지 당 새로운 Barcode1D 인스턴스를 생성 (예 : 사람이 읽을 수있는 값을 표시하도록 구성 Barcode1D 유도체 자체를 PdfFontFactory를 호출이 iText API에 대한 것주의해야한다 큰 문서의 경우 메모리가 빨리 소모 됨)

관련 문제