0

我目前正在创建一个程序,其中用户提供文本作为输入,然后使用 Code 128 字体显示相同的文本,以将他的输入视为条形码。

我已经在 /usr/share/fonts/truetype/ 下安装并定位了 Code 128 和 Code 39

两种字体都应该正确安装,因为它们都可以在 Libre Office Writer 中使用。但是,只有 Code 39 在我的 JavaFx 应用程序中正确显示。

那是我的代码:

package sample;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class CreateBarcodeStage extends Stage {

VBox vbox;

TextField textFieldInput;
TextFlow textFlowOutput;

public CreateBarcodeStage() {
    createUI();
    this.setTitle("Create Barcode");
    this.setScene(new Scene(vbox));
}

private void createUI() {
    vbox = new VBox(10);

    textFieldInput = new TextField();
    textFieldInput.textProperty().addListener((ObservableValue<? extends String> observableValue, String s, String t1) -> {
        String inputText = textFieldInput.getText();

        textFlowOutput.getChildren().clear();

        Text textReadable = new Text();
        textReadable.setFont(Font.font("Verdana", 20));
        textReadable.setText(inputText + "\n\n");

        Text textBarcode = new Text();
        textBarcode.setFont(Font.font("Code 128", 40));
        textBarcode.setText(inputText);

        textFlowOutput.getChildren().addAll(textReadable, textBarcode);
    });
    textFlowOutput = new TextFlow();
    textFlowOutput.setPadding(new Insets(15));
    textFlowOutput.setPrefWidth(200);
    textFlowOutput.setPrefHeight(150);


    vbox.getChildren().addAll(textFieldInput, textFlowOutput);

}
}

如果我用“代码 39”替换“代码 128”,一切正常。

这是代码 39 的输出:

代码 39 输出

这是代码 128 的输出:

代码 128 输出

我不知道为什么 Code 128 显示不正确。

编辑:好的,所以现在我尝试在 Code 39 文本之前和之后添加一个星号,在这种情况下一切正常。我用智能手机上的条形码扫描仪应用程序对其进行了测试,结果是正确的。

对于 Code 128,我使用在 github 上找到的校验和生成器增强了我的代码: github Code 128 条形码生成器

现在我的代码如下所示:

package sample;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class CreateBarcodeStage extends Stage {
VBox vbox;

TextField textFieldInput;
TextFlow textFlowOutput;

public CreateBarcodeStage() {
    createUI();
    this.setTitle("Create Barcode");
    this.setScene(new Scene(vbox));
}

private void createUI() {
    vbox = new VBox(10);

    textFieldInput = new TextField();
    textFieldInput.textProperty().addListener((ObservableValue<? extends String> observableValue, String s, String t1) -> {
        String inputText = textFieldInput.getText();

        textFlowOutput.getChildren().clear();

        Text textReadable = new Text();
        textReadable.setFont(Font.font("Verdana", 20));
        textReadable.setText(inputText + "\n\n");

        Text textBarcode = new Text();
        textBarcode.setFont(Font.font("Code 128", 40));
        textBarcode.setText(inputText);

        textFlowOutput.getChildren().addAll(textReadable, textBarcode);
    });
    textFlowOutput = new TextFlow();
    textFlowOutput.setPadding(new Insets(15));
    textFlowOutput.setPrefWidth(200);
    textFlowOutput.setPrefHeight(150);


    vbox.getChildren().addAll(textFieldInput, textFlowOutput);

}

private String createCode128(String text) {
    return (char) 136 + text + checksum(text) + (char) 138;
}

char checksum(String text) {
    int result = 104; // Code 128B start code
    for (int i = 0; i < text.length(); i++) {
        result += ((int) text.charAt(i) - 32) * (i + 1);
    }
    return (char) (result % 103 + 32); // Return the character value of the checksum.
    }
}

但是,它仍然不起作用: 带有开始/停止符号和校验和的代码 128

4

1 回答 1

0

虽然使用 Code 39 字体的输出看起来不错,但事实并非如此。它不会扫描并且无法识别为 Code 39 条形码。这就是代码 39 中“TEXT”这个词的样子:

代码 39 中的文本

这就是代码 128 中“TEXT”的样子:

代码 128 中的文本

看起来,使用 Code 39,您缺少开始和停止字符,因为您在 Code 39 示例中显示的实际上是条的子集,如下所示:

截图中的代码 39 条,突出显示。

我怀疑使用 Code 128,您可能没有提供开始、停止和校验和字符,因此渲染失败。

于 2017-11-10T20:51:25.363 回答