[英]Barcode4J pdf417 module is giving error
我正在嘗試使用條形碼4J的pdf417bean類將二進制數據轉換為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從Base 64進行轉換
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
它適用於克羅地亞變音符號,也適用於任何UTF-8字符。 Srdačno。
您需要使用新的String(binaryData,“ Cp437”)代替ISO-8859-1。 PDF417上的頁面說使用該編碼。 目前尚無法使用其他編碼。 不幸的是,“Í”不在Cp437中,因此無法使用。 如果從CVS HEAD下載Barcode4J並自己進行編譯,則可以使用RFC 2397數據URL來使用二進制數據: 開發版本的PDF417描述 。
我嘗試更改Barcode4J PDF417HighLevelEncoder類,並將編碼更改為ISO-8859-1代替Cp437。 我生成了一些條形碼,並且它們已被正確掃描。 看起來可以更改為支持ISO 8859-1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.