gpt4 book ai didi

java - PdfClown 字体访问上的空指针

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:49 25 4
gpt4 key购买 nike

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

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)

字体是否需要以不同的方式处理,或者什么可能导致此问题?在第一个方法中,文本被渲染,这是最奇怪的。

最佳答案

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 revision 85, lines 413..433)

第 423 行是

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

因此,codesnullcodes.getKey(textCode)null。

前者(codesnull)对于 StandardType1Font 来说是相当难以置信的。

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

假设在生产中您不调用

blockComposer.showText("Text");

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

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

关于java - PdfClown 字体访问上的空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com