2012-03-16 3 views
0

Я пытаюсь преобразовать двоичные данные в pdf417 штрих-код, используя pdf417bean класс barcode4J. Но это дает мне следующее сообщение об ошибкеМодуль 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); 

Я использую Apache Commons для преобразования из базы 64

+0

Входные данные indiciaData являются двоичными данными, закодированными в base64. Вот аналогичная ошибка из базы ошибок Barcode4J http://sourceforge.net/tracker/index.php?func=detail&aid=1903872&group_id=96670&atid=615504. Не уверен, что это аналогичный сценарий. –

ответ

0

Я попытался изменить класс Barcode4J PDF417HighLevelEncoder и изменил кодировку на ISO-8859-1 вместо Cp437. Я создал несколько штрих-кодов, и они отсканированы правильно. Похоже, он может быть изменен для поддержки стандарта ISO 8859-1.

0

Вы должны использовать новую строку (binaryData, «Cp437») вместо ISO-8859-1. page on PDF417 говорит, что использовать эту кодировку. Другие кодировки в настоящее время невозможны. К сожалению, «Í» не находится в Cp437, поэтому его нельзя использовать. Если вы загрузите Barcode4J из CVS HEAD и скомпилируете его самостоятельно, вы можете использовать URL-адреса данных RFC 2397 для использования двоичных данных: PDF417 description for development version.

+0

Я пробовал с URL-адресом данных, к сожалению, у меня тоже такая же ошибка. Есть ли какая-либо другая стабильная библиотека с открытым исходным кодом, которую я могу использовать для создания pdf417? –

0

Jeremias отметил решение, только для использования простоты:

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

Он отлично работает для Хорватские диакритические персонажи, и он sohoud работает для любого символа UTF-8. Srdačno.

Смежные вопросы