Модуль Barcode4J pdf417 выдает ошибку

Я пытаюсь преобразовать двоичные данные в штрих-код pdf417, используя класс штрих-кода pdf417bean. Но это дает мне следующую ошибку

java.lang.IllegalArgumentException: Обнаружен некодируемый символ: Í (Юникод: 205)
    org.krysalis.barcode4j.impl.pdf417.PDF417HighLevelEncoder.determineConsecutiveBinaryCount(PDF417HighLevelEncoders.j.FL4F4.jp.jp.jp.jp.jp.encodeHighLevel(PDF417HighLevelEncoder.java:108)
    org.krysalis.barcode4j.impl.pdf417.PDF417LogicImpl.generateBarcodeLogic(PDF417LogicImpl.java:193)
    org.krysalis.jpg.j4. PDF4j4p4 pb.iop.labelgen. (DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeRut patchProvider.java:165)
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
    com.sun.jersey.server.impl.uri.ruholes.Hceptup HttpMethodRule.java:276)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceC) 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.sun3).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.fileF 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

3 ответа

Решение

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

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

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.

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

Другие вопросы по тегам