やること
フォームに入力した値で一次元バーコードをつくりたい
ZXing(ゼブラクロッシング)というライブラリを使うとバーコードとかQRコードが作れる
https://github.com/zxing/zxing
今回は詳細画面に一次元のバーコード(CODE_39)を出力する想定
ZXingライブラリの追加
pom.xmlにZXingライブラリを追加する
Java SEでの開発の場合はjavaseを指定
Androidでの開発の場合はandroidを指定
Zxingライブラリとは別に、Base64エンコードを行うためにcommons-codecを利用します
pom.xml
<dependencies>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.0</version>
</dependency>
<devendency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.0</version>
</devendency>
<devendency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</devendency>
</dependencies>
下準備
EntityとRepositoryを用意しておきます
UsersEntity.java
@Entity
@Table(name="Users")
public class UsersEntity{
@Id
private Integer id;
private String name;
public Integer getId(){
return id;
}
public String getName(){
return name;
}
}
UsersRepository.java
import com.example.entities.UsersEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UsersRepository extends JpaRepository<UsersEntity, Integer>{
}
Controllerを記載
一覧画面と詳細画面が存在していて、詳細画面にバーコードを出力する想定です
UsersController.java
Controller
public class UsersController {
@Autowired
private UsersRepository usersRepository;
@RequestMapping("/user/index")
public String index(Model model) {
List<UsersEntity> users = usersRepository.findAll();
model.addAttribute("userlist",users);
return "view/user/index";
}
@GetMapping("/user/{id}")
public String show(@PathVariable Integer id, Model model) {
UsersEntity user = usersRepository.findById(id).get();
model.addAttribute("user",user);
barcode(String.valueOf(id), model);
return "/view/user/show";
}
@GetMapping
public String barcode(@PathVariable(value="id") String id, Model model) {
try {
byte[] res = toByteArray(id);
String encodedStr64 = Base64.encodeBase64String(res);
model.addAttribute("dataUrl", encodedStr64);
} catch (Exception e) {
e.printStackTrace();
}
return "Image/data";
}
private byte[] toByteArray(String contents) throws IOException, WriterException{
BarcodeFormat format = BarcodeFormat.CODE_39;
int width = 180;
int height = 40;
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
try (ByteArrayOutputStream output = new ByteArrayOutputStream()){
Code39Writer writer = new Code39Writer();
BitMatrix bitMatrix = writer.encode(contents, format, width, height, hints);
MatrixToImageWriter.writeToStream(bitMatrix, "png", output);
return output.toByteArray();
}
}
ビューの記載
index.html
<tr th:each="users : ${userlist}">
<td th:text="${users.id}"></td>
<td th:text="${users.name}"></td>
<td><a th:href="@{/user/{id}(id=${users.id})}">詳細</a></td>
</tr>
show.html
<tr th:object="${user}">
<td th:text="*{id}"></td>
<td th:text="*{name}"></td>
<td><img th:src="|data:image/png;base64, ${dataUrl}|" class="barcode"></td>
</tr>
参考にさせていただいた内容
https://qiita.com/rubytomato@github/items/187e277b964b14f77179
https://weblabo.oscasierra.net/java-zxing-2/