2014-02-24 34 views
1

我有一些奇怪的事情正在使用PdfClown 0.1.2進行文本編寫。字體訪問PdfClown空指針

PrimitiveComposer composer = new PrimitiveComposer(page); 
    BlockComposer blockComposer = new BlockComposer(composer); 
    addHeader(document, composer, blockComposer); 
    addOfferData(document, offer, blockComposer, composer); 
    composer.flush(); 

private void addHeader(Document document, PrimitiveComposer composer, BlockComposer blockComposer) { 
    Rectangle2D frame = new Rectangle2D.Double(36, 0, 842, 36); 
    blockComposer.begin(frame, XAlignmentEnum.Left, YAlignmentEnum.Middle); 
    composer.setFont(getSimpleFont(document), 12); 
    blockComposer.showText(getHeader()); 
    blockComposer.end(); 
} 

private void addOfferData(Document document, Offer offer, BlockComposer blockComposer, PrimitiveComposer composer) { 
    blockComposer.begin(new Rectangle2D.Double(456, 156, 340, 250), XAlignmentEnum.Left, YAlignmentEnum.Top); 
    composer.setFont(getSimpleFont(document), 12); 

     blockComposer.showText("Text"); 
     blockComposer.showBreak(); 

    blockComposer.end(); 
} 

    private StandardType1Font getSimpleFont(Document document) { 
    return new StandardType1Font(document, StandardType1Font.FamilyEnum.Times, false, false); 
} 

在JUnit測試中一切正常,但在生產模式下,它在第二個方法showText上失敗。

java.lang.NullPointerException 
    at org.pdfclown.documents.contents.fonts.Font.encode(Font.java:423) 
    at org.pdfclown.documents.contents.composition.PrimitiveComposer.showText(PrimitiveComposer.java:1058) 
    at org.pdfclown.documents.contents.composition.PrimitiveComposer.showText(PrimitiveComposer.java:960) 
    at org.pdfclown.documents.contents.composition.BlockComposer.showText(BlockComposer.java:553) 
    at org.pdfclown.documents.contents.composition.BlockComposer.showText(BlockComposer.java:463) 
    at com.example.service.PdfGenerationService.addOfferData(PdfGenerationService.java:121) 

是否需要以某種方式處理字體,或者可能會導致此問題?在第一種方法中,文本正在呈現什麼是最奇怪的。

回答

1

NullPointerException發生在Font.encode(Font.java:423)。這種方法是:

public final byte[] encode(
    String text 
    ) 
{ 
    ByteArrayOutputStream encodedStream = new ByteArrayOutputStream(); 
    try 
    { 
     for(int index = 0, length = text.length(); index < length; index++) 
     { 
      int textCode = text.charAt(index); 
      byte[] charCode = codes.getKey(textCode).data; 
      encodedStream.write(charCode); 
      usedCodes.add(textCode); 
     } 
     encodedStream.close(); 
    } 
    catch(IOException e) 
    {throw new RuntimeException(e);} 

    return encodedStream.toByteArray(); 
} 

Font.java修訂85,線413..433)

423行是

  byte[] charCode = codes.getKey(textCode).data; 

因此,或者是codesnullcodes.getKey(textCode)null.

前者(codesnull)對於StandardType1Font來說是相當難以置信的。

後者(codes.getKey(textCode)null)意味着要繪製的文本包含字符不在目前的編碼中。

假設在生產中你不叫

blockComposer.showText("Text"); 

,而是用一些不同的生產文字,你應該檢查特殊字符的文本(可能不存在標準的PDF編碼)。

如果這種假設是錯誤的,而且您確實在生產中只顯示"Text",則需要更多分析生產環境< - >開發環境。

+1

是的,問題是特殊字符。我使用的是外部字體,而不是SimpleFont。 – sandris

+0

您可能想要通知pdfclown作者......在這種情況下出現'NullPointerException'是不合適的,至少在我看來是這樣。 – mkl

+0

@mkl根據您的明智建議,PDF Clown 0.1.2.1的最新提交包含一個可自定義的回退機制,用於正確處理缺失的字符(以下是公告:https://twitter.com/PDFClown/status/587798095615885312)。 –