HWPXTemplater๋ HWPX ํ ํ๋ฆฟ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ํ์ฌ HWPX ํ์ผ์ ์์ฑํ๋ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
ย
- ํ ํ๋ฆฟ ๊ธฐ๋ฐ ๋ฌธ์ ์์ฑ: HWPX ํ ํ๋ฆฟ ํ์ผ์ ๋์ ๋ฐ์ดํฐ ์ฝ์
- ๋ค์ํ ํ๊ทธ ์ง์: ๊ธฐ๋ณธ ํ๊ทธ, ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ์ด๋ฏธ์ง, ํ ์ด๋ธ ํ๊ทธ
- ์ ์ฐํ ์ค์ : ํ ํ๋ฆฟ ๋ฌธ๋ฒ ์ปค์คํฐ๋ง์ด์ง ๋ฐ ์๋ ํธ๋ฆผ ์ต์
- ์ธํฐ์ ํฐ ์์คํ : ๋ฐ์ดํฐ ๋ ๋๋ง ์ ๊ฐ๋ก์ฑ๊ธฐ ๋ฐ ๊ฐ๊ณต
- ํ๋ถํ ๋ฐ์ดํฐ ๋ชจ๋ธ: Text, Image, Table ๋ฑ ํน์ ๋ฐ์ดํฐ ๋ชจ๋ธ ์ ๊ณต
ย
- HWPXTemplater๋ฅผ ์ฌ์ฉํ์๋ ค๋ฉด ๋ฐ๋์ Java8, ํน์ ๋์ ๋ฒ์ ์ ์๋ฐ๋ฅผ ์ฌ์ฉํ์ ์ผ ๋ฉ๋๋ค.
ย
๋น๋ ๋๊ตฌ๋ก maven์ ์ฌ์ฉํ์๋ ๊ฒฝ์ฐ์๋ ์๋์ dependency๋ฅผ pom.xml ํ์ผ์ ์ถ๊ฐํด์ฃผ์ธ์.
<dependency>
<groupId>io.github.mumberrymountain</groupId>
<artifactId>hwpxtemplater</artifactId>
</dependency>gradle์ ์ฌ์ฉํ์๋ ๊ฒฝ์ฐ์๋ ์๋์ implementation์ build.gradle ํ์ผ์ ์ถ๊ฐํด์ฃผ์ธ์.
implementation 'io.github.mumberrymountain:hwpxtemplater'ย
ย
{{field_name}}
์ฉ๋: ๊ธฐ๋ณธ์ ์ธ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ HWPX ํ์ผ์ ๋ ๋๋งํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ๊ทธ์ ๋๋ค.
์ฌ์ฉ๋ฒ:
- ํ
ํ๋ฆฟ ํ์ผ์
{{name}}ํํ๋ก ์์ฑํฉ๋๋ค. - Java ์ฝ๋์์ ํด๋น ํค์ ๋ฌธ์์ด ๊ฐ์ ๋งคํํฉ๋๋ค.
- ๋ ๋๋ง ์ ํ๊ทธ๊ฐ ์ค์ ๋ฐ์ดํฐ๋ก ์นํ๋ฉ๋๋ค.
์์:
// ํ
ํ๋ฆฟ: {{name}}๋ ์๋
ํ์ธ์!
import javax.servlet.http.HttpServletResponse;
import io.github.mumberrymountain.HWPXTemplater;
import java.util.*;
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.parse("./hwpxtemplater.hwpx")
.render(new HashMap<String, Object>() {{
put("name", "ํ๊ธธ๋");
}})
.write(response.getOutputStream());
// ๊ฒฐ๊ณผ: ํ๊ธธ๋๋ ์๋
ํ์ธ์!ย
{{?condition}}
์กฐ๊ฑด์ด ์ฐธ์ผ ๋ ๋ ๋๋ง๋ ๋ด์ฉ
{{/condition}}
์ฉ๋: ์กฐ๊ฑด์ ๋ฐ๋ผ ํ๊ทธ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ํ๊ทธ์ ๋๋ค.
๋์ ์๋ฆฌ:
- ์กฐ๊ฑด๊ฐ์ด
true์ด๋ฉด ํ๊ทธ ๋ด๋ถ ๋ด์ฉ์ด ๋ ๋๋ง๋ฉ๋๋ค - ์กฐ๊ฑด๊ฐ์ด
false์ด๋ฉด ํ๊ทธ ๋ด๋ถ ๋ด์ฉ์ด ์์ ํ ์ ์ธ๋ฉ๋๋ค - ํ๊ทธ ๋ด๋ถ์ ๋ค๋ฅธ ๊ธฐ๋ณธ ํ๊ทธ๋ค๋ ํฌํจํ ์ ์์ต๋๋ค
์์:
// ํ
ํ๋ฆฟ:
// ์ํ: {{status}}
// {{?hasTrackingNumber}}
// ์ด์ก์ฅ ๋ฒํธ: {{trackingNumber}}
// {{/hasTrackingNumber}}
import javax.servlet.http.HttpServletResponse;
import io.github.mumberrymountain.HWPXTemplater;
import java.util.*;
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.parse("./hwpxtemplater.hwpx")
.render(new HashMap<String, Object>() {{
put("status", "๋ฐฐ์ก์ค");
put("hasTrackingNumber", true);
put("trackingNumber", "1234-5678-9012");
}})
.write(response.getOutputStream());
// ๊ฒฐ๊ณผ:
// ์ํ: ๋ฐฐ์ก์ค
// ์ด์ก์ฅ ๋ฒํธ: 1234-5678-9012ย
{{#loop}}
{{item_field}}
{{/loop}}
์ฉ๋: ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํ์ฌ ๋์ผํ ํจํด์ผ๋ก ๋ ๋๋งํ๋ ํ๊ทธ์ ๋๋ค.
๋์ ์๋ฆฌ:
- List๋ Array ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ต๋๋ค
- ๊ฐ ์์๋ง๋ค ํ๊ทธ ๋ด๋ถ ๋ด์ฉ์ ๋ฐ๋ณต ๋ ๋๋งํฉ๋๋ค
- ๋ด๋ถ์ ๊ธฐ๋ณธ ํ๊ทธ๋ค์ ๊ฐ ๋ฐฐ์ด ์์์ ํ๋๊ฐ์ผ๋ก ์นํ๋ฉ๋๋ค
์์:
import javax.servlet.http.HttpServletResponse;
import io.github.mumberrymountain.HWPXTemplater;
import java.util.*;
// ํ
ํ๋ฆฟ:
// {{#products}}
// - {{name}}: {{price}}์
// {{/products}}
ArrayList<HashMap<String, Object>> products = new ArrayList<>();
products.add(new HashMap<String, Object>() {{
put("name", "์ฌ๊ณผ");
put("price", 1500);
}});
products.add(new HashMap<String, Object>() {{
put("name", "๋ฐ๋๋");
put("price", 700);
}});
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.parse("./hwpxtemplater.hwpx")
.render(new HashMap<String, Object>() {{
put("products", products);
}})
.write(response.getOutputStream());
// ๊ฒฐ๊ณผ:
// - ์ฌ๊ณผ: 1500์
// - ๋ฐ๋๋: 700์ย
{{$image_field}}
์ฉ๋: HWPX ํ ํ๋ฆฟ ํ์ผ์ ์ด๋ฏธ์ง๋ฅผ ์ฝ์ ํ๊ธฐ ์ํ ์ ์ฉ ํ๊ทธ์ ๋๋ค.
๋์ ์๋ฆฌ:
- ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ์ต๋๋ค
- ํด๋น ๊ฒฝ๋ก์ ์ด๋ฏธ์ง๋ฅผ HWPX ํ์ผ์ ์ฝ์ ํฉ๋๋ค
- Image ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด ํฌ๊ธฐ ์กฐ์ ๋ ๊ฐ๋ฅํฉ๋๋ค
์ง์ ํ์: PNG, JPG, GIF ๋ฑ ์ผ๋ฐ์ ์ธ ์ด๋ฏธ์ง ํ์
์์:
import javax.servlet.http.HttpServletResponse;
import io.github.mumberrymountain.HWPXTemplater;
import java.util.*;
// ํ
ํ๋ฆฟ: {{$flag}}
// ๋ฐฉ๋ฒ 1: ๊ฒฝ๋ก ๋ฌธ์์ด ์ฌ์ฉ
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.parse("./hwpxtemplater.hwpx")
.render(new HashMap<String, Object>() {{
put("flag", "images/korea.png");
}})
.write(response.getOutputStream());
// ๋ฐฉ๋ฒ 2: Image ๋ชจ๋ธ ์ฌ์ฉ (ํฌ๊ธฐ ์ง์ ๊ฐ๋ฅ)
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.parse("./hwpxtemplater.hwpx")
.render(new HashMap<String, Object>() {{
put("flag", new Image("images/korea.png").width(50).height(50));
}})
.write(response.getOutputStream());ย
{{@table_field}}
์ฉ๋: HWPX ํ์ผ์ ํ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ธฐ ์ํ ์ ์ฉ ํ๊ทธ์ ๋๋ค.
๋์ ์๋ฆฌ:
- ์ค์ง
Table๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ๋ฐ์ดํฐ๋ก ๋ฐ์ต๋๋ค - ์ด(Column) ์ ์์ ํ(Row) ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฅผ ์์ฑํฉ๋๋ค
- ๊ฐ ์ด์ ๋๋น, ๋ฐ์ดํฐ ํ์ ๋ฑ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค
์์:
import javax.servlet.http.HttpServletResponse;
import io.github.mumberrymountain.HWPXTemplater;
import io.github.mumberrymountain.model.table.Col;
import io.github.mumberrymountain.model.table.Table;
// ํ
ํ๋ฆฟ: {{@scoreTable}}
Table table = Table.builder()
.cols(Arrays.asList(
new Col("์ด๋ฆ").width(100),
new Col("์ ์").width(80),
new Col("๋ฑ๊ธ").width(60)
))
.row(new HashMap<String, Object>() {{
put("์ด๋ฆ", "ํ๊ธธ๋");
put("์ ์", 95);
put("๋ฑ๊ธ", "A");
}})
.row(new HashMap<String, Object>() {{
put("์ด๋ฆ", "๊น์ฒ ์");
put("์ ์", 87);
put("๋ฑ๊ธ", "B");
}})
.create();
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.parse("./hwpxtemplater.hwpx")
.render(new HashMap<String, Object>() {{
put("scoreTable", table);
}})
.write(response.getOutputStream());ย
ย
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.config(ConfigOption.DELIM_PREFIX, "[[")
.parse("./template.hwpx")
// ...๊ธฐ๋ณธ ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ผ๋ก ์ฌ์ฉ๋๋ {{ ๋ฐ์ดํฐ }} ํํ์์ {{๋ฅผ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋์ฒดํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์ต์ ์ ๋๋ค.
์ ์ฝ์ฌํญ: ConfigOption.DELIM_PREFIX๋ ๋ ๋ฌธ์๋ณด๋ค ๊ธธ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
ย
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.config(ConfigOption.DELIM_PREFIX, "[[")
.parse("./template.hwpx")
// ...๊ธฐ๋ณธ ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ผ๋ก ์ฌ์ฉ๋๋ {{ ๋ฐ์ดํฐ }} ํํ์์ }}๋ฅผ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋์ฒดํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์ต์ ์ ๋๋ค.
์ ์ฝ์ฌํญ: ConfigOption.DELIM_SUFFIX๋ ๋ ๋ฌธ์๋ณด๋ค ๊ธธ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
ย
CharRole charRole = new CharRole();
charRole.set(PlaceHolderType.CONDITION, '+');
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.config(ConfigOption.CHAR_ROLE_SETTER, charRole)
.parse("./template.hwpx")
// ...์กฐ๊ฑด๋ฌธ ํ๊ทธ๋ฅผ ํ๋ณํ ๋ ์ฌ์ฉ๋๋ ?, ๋ฐ๋ณต๋ฌธ ํ๊ทธ๋ฅผ ํ๋ณํ ๋ ์ฌ์ฉ๋๋ # ๋ฑ ํน์ ํ๊ทธ๊ฐ ์ด๋ค ํ๊ทธ์ธ์ง ํ๋ณํ ๋ ์ฌ์ฉ๋๋ ์ญํ ์๋ณ ๋ฌธ์๋ฅผ ๋ํดํธ ๋ฌธ์๊ฐ ์๋ ๋ค๋ฅธ ๋ฌธ์๋ก ์ค์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์ต์ ์ ๋๋ค.
CharRole ๋ชจ๋ธ์ ์ด์ฉํด Key ๊ฐ์ผ๋ก PlaceHolderType๋ฅผ, Value ๊ฐ์ผ๋ก ๋ฌธ์๋ฅผ ๋ฃ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ค ํ๋ผ๋ฏธํฐ๋ก ๊ธฐ์ ํด ํด๋น ์ต์ ์ ์ค์ ํ ์ ์์ต๋๋ค.
์ธํ ํ ์ ์๋ PlaceHolderType์ผ๋ก๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค.
| PlaceHolderType | ํ๊ทธ | ๋ํดํธ ์๋ณ์ |
|---|---|---|
| PlaceHolderType.CONDITION | ์กฐ๊ฑด๋ฌธ ํ๊ทธ ์๋ณ์ | ? |
| PlaceHolderType.LOOP | ๋ฐ๋ณต๋ฌธ ํ๊ทธ ์๋ณ์ | # |
| PlaceHolderType.CLOSURE | ๋ฐ๋ณต๋ฌธ ํ๊ทธ ์๋ณ์ | / |
| PlaceHolderType.IMAGE_REPLACEMENT | ์ด๋ฏธ์ง ํ๊ทธ ์๋ณ์ | $ |
| PlaceHolderType.TABLE_REPLACEMENT | ํ ์ด๋ธ ํ๊ทธ ์๋ณ์ | @ |
ย
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.config(ConfigOption.AUTO_TRIM, true) // ๋ฐ์ดํฐ๋ฅผ ์์ชฝ์ ๊ณต๋ฐฑ์ ์๋์ผ๋ก trim์ฒ๋ฆฌ
.parse("./hwpxtemplater.hwpx")
.render(new HashMap<String, Object>() {{
put("data", " ๋ฐ์ดํฐ "); // ์์ชฝ์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ์ฌ ๋ ๋๋งํจ
}}
);ํ ํ๋ฆฟ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ ๋ ๋ฐ์ดํฐ ์์์ ๊ณต๋ฐฑ์ ์๋์ผ๋ก ์ ๊ฑฐํ์ฌ ๋ ๋๋งํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์ต์ ์ ๋๋ค.
ย
ย
๋ฐ์ดํฐ ๋ ๋๋ง ์ ๊ฐ์ ๊ฐ๋ก์ฑ์ด ๊ฐ๊ณตํ ์ ์์ต๋๋ค.
import io.github.mumberrymountain.HWPXTemplater;
import io.github.mumberrymountain.interceptor.Interceptor;
import io.github.mumberrymountain.interceptor.ValueInterceptor;
import java.text.NumberFormat;
import java.util.*;
Interceptor valueInterceptor = new ValueInterceptor() {
@Override
public String intercept(String value, String field) {
if (field.equals("Salary")) {
return NumberFormat.getNumberInstance(Locale.KOREA).format(Integer.parseInt(value)) + "๋ง์";
}
return value;
}
};
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.interceptor(valueInterceptor)
.parse("./template.hwpx")
// ...์ฝ๋ฐฑ์ ํ๋ผ๋ฏธํฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
| ์ด๋ฆ | ํ์ | ์ค๋ช |
|---|---|---|
| value | String | ํ์ฌ ๋ ๋๋ง์ด ์ด๋ค์ง๋ ํ๋์ ๋ค์ด์จ ๋ฐ์ดํฐ ๊ฐ |
| field | String | ํ์ฌ ๋ ๋๋ง์ด ์ด๋ค์ง๊ณ ์๋ ํ ํ๋ฆฟ ๋ด ํ๋ |
ย
null ๊ฐ์ ๋ํด์๋ง ํน๋ณํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
import io.github.mumberrymountain.HWPXTemplater;
import io.github.mumberrymountain.interceptor.Interceptor;
import io.github.mumberrymountain.interceptor.NullValueInterceptor;
import java.text.NumberFormat;
import java.util.*;
Interceptor nullValueInterceptor = new NullValueInterceptor() {
@Override
public String intercept(String value, String field) {
if (field.equals("note")) return "์์";
return value;
}
};
HWPXTemplater hwpxTemplater = HWPXTemplater.builder()
.interceptor(nullValueInterceptor)
.parse("./hwpxtemplater.hwpx")
...์ฝ๋ฐฑ์ ํ๋ผ๋ฏธํฐ๋ ์๋์ ๊ฐ์ต๋๋ค.
| ํ๋ผ๋ฏธํฐ | ํ์ | ์ค๋ช |
|---|---|---|
| value | String | ํ์ฌ ๋ ๋๋ง์ด ์ด๋ค์ง๋ ํ๋์ ๋ค์ด์จ ๋ฐ์ดํฐ ๊ฐ |
| field | String | ํ์ฌ ๋ ๋๋ง์ด ์ด๋ค์ง๊ณ ์๋ ํ ํ๋ฆฟ ๋ด ํ๋ |
ย
ย
ํ ์คํธ์ ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค.
new Text("๋ฐ์ดํฐ")
.fontColor("#9C3B00")
.backgroundColor("#FFEF99")
.fontFamily("Noto Sans KR")
.fontSize(20)ย
์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
new Image("./korea.png")
.width(50)
.height(50)ย
ํ ์ด๋ธ์ ์์ฑํ ์ ์์ต๋๋ค.
Table table = Table.builder()
.cols(Arrays.asList(
new Col("๋ฒํธ").width(60),
new Col("์ด๋ฆ").width(150),
new Col("์ ์").width(150)
))
.row(new HashMap<String, Object>() {{
put("๋ฒํธ", 1);
put("์ด๋ฆ", "ํ๊ธธ๋");
put("์ ์", 85);
}})
.create();ย
์์ธํ ์ฌ์ฉ๋ฒ๊ณผ API ๋ฌธ์๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
ย
๋ฒ๊ทธ ๋ฆฌํฌํธ๋ ๊ธฐ๋ฅ ์ ์์ ์ด์ ํธ๋์ปค๋ฅผ ํตํด ์ ์ถํด์ฃผ์ธ์.