Programing/Java & Spring

IT세무민의 코딩일기 : 바코드 제작하기 [바코드를 제작하지 않고 QR코드를 제작한 이유]

세기루민 2021. 1. 5. 12:23
728x90

바코드 제작하게 된 계기를 작성하기 전 

sg-moomin.tistory.com/42

 

IT세무민의 코딩일기 : QR코드 제작하기

인턴이 끝난 후 조금 쉬면서 여유롭게 시간을 보내다가 현자타임이 엄청 와버려서... 그래도 했던 코드들을 나름 리뷰하는 시간을 가져볼 생각이다. 우선 QR코드를 제작하기 위해서! import com.googl

sg-moomin.tistory.com

QR코드를 제작하게 된 이유를 설명하고 싶어서 우선 위에 QR코드 제작한 방법을 확인하고 보는걸 추천! 

인턴할 때 바코드를 찍었을 때 테이블 형태로 나왔으면 좋겠다고 팀장님께서 말씀하셨고 

이는 바코드를 제작하게 되는 배경이 되었다.

하지만 바코드에 관련된 레퍼런스를 찾아보면서 답답함이 몰려오기 시작했다

바코드는 일차원적인 그림으로 테이블을 담기에는 무리였다.

결국에 고민하던 끝에 2D인 QR코드를 제작하게 되었구 

QR코드를 제작했을 때 팀장님과 담당자분들은 QR코드를 스캔했을 때 테이블을 수정했으면 좋겠다고 하셨을 때 

나의 제안은 URL로 넘겨서 수정 페이지를 제작하면 될것이라고 말했고 

이는 보류상태로 끝나게 되었다.

사실상 바코드 -> QR로 넘어왔으나 

바코드를 제작했었더라도 스캔 시 수정이 가능하도록 하는건 쉽지 않았을것이다.

엑셀로는 스캔 시 직접 수정이 가능하지만

QR이나 바코드는 스캔용도로 사용해서 페이지를 넘어간 후 수정하도록 만들려고 했었다.

TMI였으나 무튼 QR코드나 바코드를 제작하게 된 배경을 길게 설명했는데.....

결론적으로 바코드를 제작하는 과정에서 많은 것들을 학습했다.

barbecue.sourceforge.net/apidocs/net/sourceforge/barbecue/BarcodeFactory.html

 

BarcodeFactory (barbecue 1.5-beta1 API)

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

barbecue.sourceforge.net

우선 바코드를 사용하기 위해서 이용했던 레퍼런스 사이트인데 이거는 필수로 확인하는 것을 추천한다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript"
	src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript"
	src="${pageContext.request.contextPath}/resources/js/jquery-barcode.js"></script>
</head>
<body>
		<script type="text/javascript">
		function bar(){
			$("#bcTarget").barcode("sg-moomin.tistory", "code128");
		}
		</script>
		
		<table>
			<tr>
				<td id="bcTarget">
                		<script>bar()</script>
                		</td>
			</tr>
		
		</table>
</body>
</html>

우선 JSP를 이용해서 제작했던 것을 확인해보자

위의 코드는 사용했던 코드인데 코드를 돌리면!

위의 바코드처럼 제작이 된다.

내가 이것을 이용해서 테이블형식은 아니지만 실제로 등록번호를 이용해서 

반복문을 통해 등록번호를 호출해주면 대량의 바코드를 출력 가능하다.

<c:forEach var="wealth" items="${wealthclass}" varStatus="sts">
			<script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
			<script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/jquery-barcode.js"></script>
			<script type="text/javascript">
				function bar() {
					$("#bcTarget${wealth.wealthDno}").barcode("${wealth.wealthDno}","Code128" );
				}
			</script>
			<table class="table table-bordered" id="dataTable" width="100%"	cellspacing="0">
				<tr>
					<th>바코드</th>
					<th id="bcTarget${wealth.wealthDno}">
             				<script>bar()</script></th>
								
					<td><img src="${pageContext.request.contextPath}/img/${wealth.wealthDno}.PNG"
					width=200 height=200></img></td>
				</tr>
			</table>
</c:forEach>

위의 코드는 실제로 바코드를 등록번호로 여러개 출력했을 때 사용했었던 JSP 코드인데 

사실 Ajex를 사용한다면 Script로 function을 생성해주고 

데이터도 Json -> Text로 변환해서 

해당 테이블에 Function만 호출해주면 된다.

회사 내부 데이터가 존재하지 않아서 실행은 하지 않았다.

사실 JSP로 호출하는 것도 좋지만 Controller나 Service에서 직접 바코드를 File 형태로 제작하는 것을 고려했기에

JSP에서는 저 코드를 이용했었는데 출력시에는 Java에서 바코드를 파일 형태로 제작했었다.

바코드를 제작하는 것도 QR코드와 동일하다.

public void makeBCode(int width, int height, String file_path, String file_name, WealthDevelop wealth) {
		try {
			// BarcodeWriter wirter = new ZXing.Mobile.BarcodeWriter;

				String url = wealth.getWealthDno();  
				url = new String(url.getBytes("UTF-8"), "ISO-8859-1");
				
				Barcode barcode = null;
				barcode = (Barcode) BarcodeFactory.createCode128B(url);

				barcode.setLabel(wealth.getWealthDno());
				barcode.setName(wealth.getItemName());
//				barcode.add(wealth.WealthDno, making(wealth));
//				System.out.println("barcode get : " + barcode.getData());
				
				Code128Writer code128Writer = new Code128Writer();
				FileOutputStream fileStream = new FileOutputStream(file_path + File.separator + file_name);
				BarcodeImageHandler.writePNG(barcode, fileStream);
                
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

QR코드와 동일하게 파일 제작하는 경로와 Code128로 제작을 해주는데 

Code128로 제작하는 이유는 바코드의 타입은 QR코드와 달리 정해져있다.

바코드 타입으로 codabar, code11, code39, code93, code128, ean8..... 등등 다양하기 때문에 

저는 회사에서 필요로 하는 코드를 이용했다.

그렇게 code128로 제작해서 File을 생성하면 된다. 

해당 파일들은 인턴했을 때 사용했던 노트북에 있는데.... 포멧.....ㅠㅠ

즉 QR코드처럼 바코드를 생성 -> 파일로 변환!

@RequestMapping(value = "departList.do")
public String departList(Model model, HttpServletRequest request,@RequestParam("PurchaseMangeDepartMent")
String DepartMent, @RequestParam("DepartSearch") String location) throws IOException {
		Barcode barcode = null;
		ArrayList<WealthDevelop> wealth = new ArrayList<WealthDevelop>();
		wealth = Wservice.departAllSelect(DepartMent, location);
		File file = new File(request.getContextPath());
		String file_path = "C:" + File.separator + "Users" + File.separator + "dt2001329" + File.separator + "Desktop"
				+ File.separator + "barcode" + File.separator;
		System.out.println("get file " + file.getCanonicalPath());

		for (int i = 0; i < wealth.size(); i++) {
			String str = wealth.get(i).getWealthDno();
			String file_name = str + ".PNG";
			makeBCode(150, 150, file_path, ("B" + file_name), wealth.get(i));
		}
		model.addAttribute("wealthclass", wealth);
		return "wealthList/depart/departList";
}

위의 컨트롤러는 QR코드 제작 시 보여줬던 컨트롤라와 동일하다.

여기서 보는 것처럼 바코드를 반복문으로 생성해줬다.

반복문으로 생성했던 이유는 QR코드 제작 시 설명했기에 이 부분은 생략

추후에는 데이터 추가 시 생성하는 방향으로 제작하기에 반복문이 아닌 

생성하는 부분에서 바코드를 만들어주면 된다.

오늘 포스팅은 바코드를 생성하는 과정에 대해서 설명했는데 

다음에는 더 발전된 포스팅으로 찾아오겠습니다.

 

728x90