2017-11-10 11 views
0

私は現在、ユーザーがテキストを入力として与え、Code 128フォントで同じテキストを表示して入力をバーコードとして表示するプログラムを作成しています。JavaFX TextFlowでコード128が正しく表示されないのはなぜですか?

私はすでにインストールされ、コード128及びコード39を/ usr/share/fonts/TrueTypeの下/

どちらのフォントが正しくインストールする必要がありますがありますので、リブレオフィスライターの両方の仕事。ただし、JavaFxアプリケーションでコード39のみが正しく表示されます。

私のコードです:私は正常に動作しeverthing "コード39" と "コード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); 

} 
} 

これはコード39で出力されます。

Code 39 output

そしてここでは、コード128で出力されます。

Code 128 output

コード128がない理由を私は知りません正しく表示されます。

EDIT: これでコード39の前後にアスタリスクを追加しようとしましたが、この場合はすべて動作します。私はスマートフォンのバーコードスキャナアプリでそれをテストしたところ、結果は正しかった。コード128の場合

私はgithubの上で見つかったチェックサムメーカーとの私のコードを強化: github Code 128 barcode generator

今、私のコードは次のようになります。

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. 
    } 
} 

しかし、それはまだ動作しません。 Code 128 with start/stop symbol and checksum

+0

そして、同じコード128フォントをLibre Officeで使用していますか? –

+0

私が考えることができる唯一のことは、フォントが100%バーコードシンボルではないということです。何らかの理由でCode 128フォントは、ASCIIコードを人間が読める文字にマッピングしています。バー記号はハイASCIIに埋め込んでいます。個人的には、ユニコードや高ASCII($ 80- $ FF)が動作するようにするバーコードフォントを作成するのは設計上の意思決定ではないと思いますが、実際には人間が読める文字のシンボルがあります。すべての文字を見ることができるように、フォントをマッピングソフトウェアに持ってきましたか? –

答えて

0

コード39フォントを使用すると出力が正常に表示されることがありますが、それは正しくありません。スキャンされず、コード39バーコードとして認識されません。

TEXT in Code 39

そして、これは "TEXT" はコード128でどのように見えるかです::

TEXT in Code 128

それは、と、のように見えるこれは、単語 "TEXT" はコード39で次のようになりますコード39、あなたはスタートが欠落していると何がコード39の例で表示されているが実際のバーのサブセットであるため、そのような文字を停止します。

The code 39 bars from the screeshot, highlighted.

コード128では、開始文字、停止文字、チェックサム文字が指定されていない可能性があります。そのため、レンダリングに失敗している可能性があります。

+0

また、コード128にASCII($ 00- $ 7F)の低い文字を渡していることを確認してください。フォントがUTF-8またはUTF-16で機能しない可能性があります。フォントのドキュメントを確認してください。 –

関連する問題