【问题标题】:Barcode4J pdf417 module is giving errorBarcode4J pdf417 模块给出错误
【发布时间】:2012-04-01 23:06:23
【问题描述】:

我正在尝试使用barcode4J 的pdf417bean 类将二进制数据转换为pdf417 条形码。但它给了我以下错误

java.lang.IllegalArgumentException:检测到不可编码的字符:Í(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(本机方法) 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.Abs​​tractResourceMethodDispatchProvider$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 进行转换

【问题讨论】:

  • inputData indiciaData 是 base64 编码的二进制数据。这是来自 Barcode4J 错误库sourceforge.net/tracker/… 的类似错误。不确定这是不是类似的情况。

标签: java barcode barcode4j


【解决方案1】:

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

【讨论】:

  • 我也尝试过使用数据 url,不幸的是我得到了同样的错误。有没有其他稳定的开源库可以用来生成pdf417?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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 字符。斯尔达奇诺。

    【讨论】:

      猜你喜欢
      • 2018-10-07
      • 2014-03-29
      • 2022-11-08
      • 2014-01-29
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多