首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字体访问上的PdfClown空指针

字体访问上的PdfClown空指针
EN

Stack Overflow用户
提问于 2014-02-24 20:22:07
回答 1查看 878关注 0票数 1

在使用PdfClown 0.1.2编写文本时,我遇到了一些奇怪的事情。

代码语言:javascript
复制
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上失败了。

代码语言:javascript
复制
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)

字体是否需要以不同的方式处理,或者是什么会导致这个问题?在第一个方法中,文本正在呈现,这里最奇怪的是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-26 09:19:11

NullPointerException发生在Font.encode(Font.java:423)。这种方法是:

代码语言:javascript
复制
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();
}

(http://svn.code.sf.net/p/clown/code/tags/0.1.2-Beta/java/pdfclown.lib/src/org/pdfclown/documents/contents/fonts/Font.java修订版85,第413.433行)

第423行是

代码语言:javascript
复制
            byte[] charCode = codes.getKey(textCode).data;

因此,要么codesnull,要么codes.getKey(textCode)null.

前者(codesnull)对于StandardType1Font来说是很难接受的。

后者(codes.getKey(textCode)null)意味着要绘制的文本包含不在手边编码中的字符。

假设在生产过程中您不调用

代码语言:javascript
复制
blockComposer.showText("Text");

但是,使用一些不同的生产文本,您应该检查该文本中是否有特殊字符(可能在标准PDF编码中不存在)。

如果这个假设是错误的,而且您在生产中确实只显示了"Text",则需要对生产环境<->开发环境的差异进行更多的分析。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21998183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档