2012-03-16 355 views
0

我想使用pdf417bean class barcode4J将二进制数据转换为pdf417条形码。但它给我下面的错误Barcode4J pdf417模块给出了错误

 
java.lang.IllegalArgumentException: Non-encodable character detected: Í (Unicode: 205) 
    org.krysalis.barcode4j.impl.pdf417.PDF417HighLevelEncoder.determineConsecutiveBinaryCount(PDF417HighLevelEncoder.java:468) 
    org.krysalis.barcode4j.impl.pdf417.PDF417HighLevelEncoder.encodeHighLevel(PDF417HighLevelEncoder.java:108) 
    org.krysalis.barcode4j.impl.pdf417.PDF417LogicImpl.generateBarcodeLogic(PDF417LogicImpl.java:193) 
    org.krysalis.barcode4j.impl.pdf417.PDF417Bean.generateBarcode(PDF417Bean.java:79) 
    com.pb.iop.labelgen.impl.BarcodeService.generateBarcodecodePDF417(BarcodeService.java:244) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:165) 
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67) 
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:276) 
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133) 
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83) 
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133) 
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1171) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1103) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1053) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1043) 
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:406) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:477) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:662) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 

这里的代码库的一部分,我使用

 PDF417Bean bean = new PDF417Bean(); 

     bean.doQuietZone(true); 
     bean.setModuleWidth(UnitConv.in2mm(moduleWidthInches)); 
     bean.setQuietZone(UnitConv.in2mm(quietZoneInches)); 
     bean.setBarHeight(height); 

     boolean antiAlias = false; 
     int orientation = 0; 

     BitmapCanvasProvider canvas = new BitmapCanvasProvider(
       dpi, BufferedImage.TYPE_BYTE_BINARY, antiAlias, orientation); 

     indiciaData = indiciaData.replaceAll("\\s+", ""); 
     byte[] binaryData = Base64.decodeBase64(indiciaData.getBytes()); 
     String base64DecodedMsg = StringUtils.newStringIso8859_1(binaryData); 

     bean.generateBarcode(canvas, base64DecodedMsg); 
     canvas.finish(); 


     String mime = MimeTypes.MIME_BMP; 
     out = new ByteArrayOutputStream(); 

     final BitmapEncoder encoder = BitmapEncoderRegistry.getInstance(mime); 
     encoder.encode(canvas.getBufferedImage(), out, mime, dpi); 

我使用转换阿帕奇百科全书从底部64

+0

inputData indiciaData是base64编码的二进制数据。这里有一个类似于Barcode4J bug base的漏洞http://sourceforge.net/tracker/index.php?func=detail&aid=1903872&group_id=96670&atid=615504。不知道这是否是一种类似的情况。 – 2012-03-16 13:20:13

回答

0

我试着改变Barcode4J PDF417HighLevelEncoder类和更改编码为ISO-8859-1代替Cp437。我生成了一些条形码,他们正在正确扫描。看起来它可以改为支持ISO 8859-1。

0

您需要使用新的String( binaryData,“Cp437”)而不是ISO-8859-1。 page on PDF417表示使用该编码。其他编码目前不可能。不幸的是,“Í”不在Cp437中,因此无法使用。如果从CVS HEAD下载Barcode4J并自己编译它,则可以使用RFC 2397数据URL来使用二进制数据:PDF417 description for development version

+0

我尝试过使用数据网址,但不幸的是,即使那样,我也得到了同样的错误。是否有任何其他稳定的开源库可用于pdf417生成? – 2012-03-20 10:53:18

0

耶利米指出了解决方案,只是简单使用:

new String("your string goes here written in UTF-8".getBytes("UTF-8"), "Cp437") 

例如:

new String("ČĆŽŠĐ čćžšđ or Í".getBytes("UTF-8"), "Cp437") 

你可以检查出条码解码在线:http://online-barcode-reader.inliteresearch.com/default.aspx

它工作正常的克罗地亚变调字符,并且它为任何UTF-8字符而工作。 Srdačno。