在使用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)字体是否需要以不同的方式处理,或者是什么会导致这个问题?在第一个方法中,文本正在呈现,这里最奇怪的是什么。
发布于 2014-02-26 09:19:11
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();
}(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行是
byte[] charCode = codes.getKey(textCode).data;因此,要么codes是null,要么codes.getKey(textCode)是null.。
前者(codes是null)对于StandardType1Font来说是很难接受的。
后者(codes.getKey(textCode)是null)意味着要绘制的文本包含不在手边编码中的字符。
假设在生产过程中您不调用
blockComposer.showText("Text");但是,使用一些不同的生产文本,您应该检查该文本中是否有特殊字符(可能在标准PDF编码中不存在)。
如果这个假设是错误的,而且您在生产中确实只显示了"Text",则需要对生产环境<->开发环境的差异进行更多的分析。
https://stackoverflow.com/questions/21998183
复制相似问题