[英]PdfClown nullpointer on Font access
使用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修訂版85,第413..433行)
423行是
byte[] charCode = codes.getKey(textCode).data;
因此, codes
為null
或codes.getKey(textCode)
為null.
對於StandardType1Font
,前者( codes
為null
)是非常不現實的。
后者( codes.getKey(textCode)
為null
)意味着要繪制的文本包含手頭編碼中不存在的字符。
假設在生產中您不打電話
blockComposer.showText("Text");
但應使用一些不同的生產文本,而應檢查該文本是否包含特殊字符(可能在標准PDF編碼中不存在)。
如果該假設是錯誤的,並且您實際上在生產中僅顯示"Text"
,則需要對差異進行更多分析,生產環境<->開發環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.