ํ์ฌ ํ๋ก์ ํธ์์ ๊ฑฐ๋๋ช ์ธํ๋ฅผ A4 ๊ฐ๋ก ๋ฐฉํฅ(landscape)์ผ๋ก ์ธ์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ์ต๋๋ค.
- ํ๋ฉด์๋ ์ผ์ชฝ ์์ญ๋ง ํ์
- ์ธ์ ์์๋ A4 ํ ์ฅ์ ๊ฝ ์ฑ์ ์ข/์ฐ ๋ชจ๋ ์ถ๋ ฅ (ํ๋๋ ๊ณ ๊ฐ์ฉ / ํ๋๋ ๋ด๋ถ์ฉ)
- ์ธ์ ์ ์ ์ฉ ์คํ์ผ ์ ์ฉ (ํฐํธ ํฌ๊ธฐ, ์ฌ๋ฐฑ ๋ฑ ์กฐ์ )
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด React to Print์ useReactToPrint ํ ์ ์ฌ์ฉํ์ฌ, ํน์ DOM์ ๋ํด ์ธ์ ์์ ์ ์งํํ์ต๋๋ค.
์ด ๊ธ์์๋ React to Print ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํน์ ์ปดํฌ๋ํธ๋ฅผ ์ธ์ํ๊ณ , ์ธ์ ์์๋ง ์ ์ฉ๋๋ ์คํ์ผ์ ์ค์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๊ณต์ ํด ๋ด ๋๋ค!
์ window.print()๊ฐ ์๋ React to Print?
์ผ๋ฐ์ ์ผ๋ก ์น์์ ์ธ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ window.print()๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์์์ต๋๋ค.
1. ํน์ ์ปดํฌ๋ํธ๋ง ์ธ์ํ๊ธฐ ์ด๋ ค์
window.print()๋ ๋ธ๋ผ์ฐ์ ํ๋ฉด ์ ์ฒด๋ฅผ ์ธ์ ๋์์ผ๋ก ์ก์ต๋๋ค. ํน์ ๋ถ๋ถ(์ปดํฌ๋ํธ)๋ง ์ธ์ํ๋ ค๋ฉด ๋ณ๋์ @media print ์ฒ๋ฆฌ, display: none ๋ฑ ๋ณต์กํ ์ค์ ์ด ํ์ํด์ง๋๋ค.
2. ์ธ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ์๋ ๋ซ๊ธฐ ๋ฑ ์ธ๋ถ ์ค์ ๋ถ๊ฐ
React ์ปดํฌ๋ํธ ๋จ์๋ก ์ธ์ ๊ณผ์ ์ ์ ์ดํ๊ธฐ๊ฐ ๊น๋ค๋กญ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ธ์ ๋์์ ์์ฝ๊ฒ ํ์ธํ๊ณ , ์ถ๋ ฅ ์ ๋ชฉ ์ค์ ๋ฑ์ ํ๋ ค๋ฉด ๋ค๋ฅธ ๋ก์ง์ ๋ ๊ตฌํํด์ผ ํ์ฃ .
3. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํธํ์ฑ
์ธ์ ์์ ์ DOM์ ์ง์ ์กฐ์ํ์ง ์๊ณ , ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ๊ตฌ์กฐ์ ๋ง์ถฐ ์ธ์๋ฅผ ๊ตฌํํ๋ ค๋ฉด React to Print ํ
(useReactToPrint)์ด ํจ์ฌ ๊ฐํธํฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก React to Print๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ๋ ๋๋งํ๊ณ , ๊ทธ ์์ญ๋ง ์์ฝ๊ฒ ์ธ์ํ ์ ์์ผ๋ฉฐ, ์ธ์ ์คํ์ผ์ ์ปค์คํฐ๋ง์ด์งํ๊ธฐ๊ฐ ์์ํด์ง๋๋ค.
useRef์ React to Print์ ๋์ ์๋ฆฌ
- useRef๋ React์์ ํน์ DOM ์์๋ ๊ฐ์ ์ฌ๋ ๋๋ง ์์ด ์ฐธ์กฐํ ์ ์๊ฒ ํด ์ฃผ๋ ํ ์ ๋๋ค.
- const printRef = useRef<HTMLDivElement | null>(null); ์ฒ๋ผ ์ ์ธํด ๋๊ณ , <div ref={printRef}>์ ์ฐ๊ฒฐํ๋ฉด, ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง๋์ด๋ printRef.current๋ ๋ณํ์ง ์์ต๋๋ค.
- React to Print์ useReactToPrint ํ ์ content ์ต์ ์ผ๋ก ์ธ์ํ DOM์ ๋ฐํ๋ฐ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ content์ printRef.current๋ฅผ ๋๊ธฐ๋ฉด, ํด๋น DOM๋ง ๋ณ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์ธ์ ๊ธฐ๋ฅ์ ํตํด ๋ฏธ๋ฆฌ๋ณด๊ธฐ·์ธ์ํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ํ pageStyle ์ต์ ์ ํตํด ์ธ์ ์ ์ ์ฉ ์คํ์ผ์ ์ถ๊ฐ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
A4 ๊ฐ๋ก ๋ฐฉํฅ ์ธ์ ๋ ์ด์์ ์ก๊ธฐ
์ธ์ ์์ญ(printRef)์ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ ์์ญ์ ๋ฐฐ์นํฉ๋๋ค.
• ์ผ์ชฝ ์์ญ: ํ๋ฉด์๋ ๋ณด์ด๊ฒ ํจ
• ์ค๋ฅธ์ชฝ ์์ญ: ํ๋ฉด์์๋ ์จ๊ธฐ๊ณ , ์ธ์ ์์๋ ํ์ํ๋๋ก ์ค์
์์ ์ฝ๋
import React, { useRef } from "react";
import { useReactToPrint } from "react-to-print";
function TransactionStatement() {
const printRef = useRef(null);
const handlePrint = useReactToPrint({
content: () => printRef.current, // ์ธ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํ
documentTitle: "๊ฑฐ๋๋ช
์ธํ",
pageStyle: `
@page {
size: A4 landscape; /* A4 ๊ฐ๋ก๋ก ์ค์ */
margin: 0;
}
@media print {
body {
margin: 0;
padding: 0;
}
/* ์ธ์ ์์๋ง ์ ์ฉํ ์คํ์ผ ์ค๋ฒ๋ผ์ด๋ */
.print-area {
width: 297mm; /* A4 ๊ฐ๋ก ๊ธธ์ด */
height: 210mm; /* A4 ์ธ๋ก ๊ธธ์ด */
display: flex;
flex-direction: row;
}
.half-page {
width: 50%;
padding: 10mm;
box-sizing: border-box;
}
.print-border {
border-left: 1px solid #ccc;
}
/* ํ๋ฉด์๋ ์จ๊ฒจ๋จ๋ ์์ญ๋ ์ธ์ ์์๋ ๋ณด์ด๋๋ก */
.print-only {
display: block !important;
}
}
`,
});
return (
{/* ์ธ์ ๋ฒํผ */}
์ธ์
{/* ์ธ์ ์์ญ */}
<div ref={printRef} className="print-area">
{/* (1) ํ๋ฉด์๋ ๋ณด์ด๋ ์์ญ (์ข์ธก) */}
<div className="half-page">
<h2>๊ฑฐ๋๋ช
์ธํ (ํ๋ฉด & ์ธ์)</h2>
<p>์ข์ธก ์์ญ ๋ด์ฉ...</p>
</div>
{/* (2) ํ๋ฉด์๋ ๋ณด์ด์ง ์๊ณ , ์ธ์ ์์๋ง ๋ณด์ด๋ ์์ญ (์ฐ์ธก) */}
<div className="hidden half-page print-border print-only">
<h2>๊ฑฐ๋๋ช
์ธํ (์ธ์ ์ ์ฉ ์ฐ์ธก)</h2>
<p>์ฐ์ธก ์์ญ ๋ด์ฉ...</p>
</div>
</div>
</div>
);
}
export default TransactionStatement;
1. useReactToPrint
• content ์ต์
์ ์ธ์ํ DOM(printRef.current)์ ์ง์ ํฉ๋๋ค.
• pageStyle์ ์ธ์ ์ ์ ์ฉํ CSS๋ฅผ ๋ฌธ์์ด๋ก ๋ฃ์ด์ค๋๋ค.
2. @page { size: A4 landscape; }
• ๊ฐ๋ก ๋ฐฉํฅ(A4 Landscape)์ผ๋ก ์ธ์๋๋๋ก ์ค์ ํฉ๋๋ค.
3. .print-only ํด๋์ค
• ํ๋ฉด์์ display: none ์ฒ๋ฆฌํ ๋ค, @media print์์๋ display: block !important;๋ก ๋ค์ ํ์ํ ์ ์์ต๋๋ค.
• ์ ์์์์๋ Tailwind CSS์ hidden ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ , ์ถ๊ฐ๋ก print-only ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ธ์ ์ ๋ณด์ด๋๋ก ๊ฐ์ ํ์ต๋๋ค.
4. .half-page ๋ ์ด์์
• ์ข์ฐ ๊ฐ๊ฐ 50% ๋๋น๋ฅผ ์ฐจ์งํ๋๋ก ํ์ฌ A4 ๊ฐ๋ก ํ ์ฅ์ ๋ฐ์ผ๋ก ๋๋ ๋ ์ด์์์ ๊ตฌ์ฑํฉ๋๋ค.
• ๊ฐ์ด๋ฐ ๊ฒฝ๊ณ์ ์ ์ํด .print-border ํด๋์ค์ border-left: 1px solid #ccc; ์ค์ ์ ์ถ๊ฐํ์ต๋๋ค.
์ธ์ ์คํ์ผ ์ค๋ฒ๋ผ์ด๋ @media print
ํ๋ก์ ํธ์์ ํ๋ฉด์ ํ์๋๋ UI์ ์ค์ ์ธ์ ์ ํ์๋์ด์ผ ํ ๋ ์ด์์์ด ํฌ๊ฒ ๋ฌ๋ผ์ผ ํ ๋๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ํ๋ฉด์์๋ ํฌ๊ฒ ๋ณด์ด๋ ํฐํธ๋ฅผ ์ธ์ ์ ์๊ฒ ์ถ์ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ ์ฃ .
์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, @media print๋ฅผ ์ฌ์ฉํด ์ธ์ ์์๋ง ์ ์ฉ๋๋ ๋ณ๋์ CSS ๊ท์น์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ์ด์์, ํฐํธ ํฌ๊ธฐ, ์ฌ๋ฐฑ, ํ ์ด๋ธ ๋๋น ๋ฑ์ ํ๋ฉด๊ณผ ์ธ์ ์ฉ๋๋ก ๋๋์ด ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
@media print๋ CSS ํ์ค์ ์ผ๋ถ๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ ์ธ์(ํ๋ฆฐํธ) ๋ชจ๋๋ก ์ ํ๋ ๋ ์๋์ผ๋ก ์ ์ฉ๋๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๋๋ค. ์ฆ, ํน๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ ์ ์ถ๊ฐ๋ก ํ์ง ์์๋, ๋ธ๋ผ์ฐ์ ๋ ์ธ์ ์์ ์ @media print ๊ตฌ๋ฌธ ๋ด๋ถ์ ์คํ์ผ์ ์ฐ์ ์ ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋๋ฌด ๋ง์ ๋ด์ฉ์ด ํ ํ์ด์ง์ ๋ค์ด๊ฐ ๋ ํฐํธ๊ฐ ์ปค์ ์๋ฆฌ๋ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ด ํฐํธ๋ฅผ ์ค์ฌ์ค ์ ์์ต๋๋ค.
@media print {
/* ํ
์ด๋ธ ํฐํธ ์ฌ์ด์ฆ ์ถ์ ์์ */
.custom-table .ant-table-cell,
.custom-table .ant-table-summary > tr {
font-size: 7px !important;
}
/* ํ์ด์ง ์ฌ๋ฐฑ 0์ผ๋ก ์ธํ
*/
body {
margin: 0;
padding: 0;
}
}
์ด๋ฌํ ์ธ์ ์ ์ฉ ์คํ์ผ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ๋ฉด๊ณผ ์ธ์๋ฅผ ๊ตฌ๋ถํ์ฌ ์ค์ ํ ์ ์์ด์ผ, ์๋ํ ๋ ์ด์์๊ณผ ์ ํํ ์ผ์นํ๊ฒ ์ธ์๋ฅผ ์งํํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
1. useReactToPrint + useRef๋ก ํน์ DOM์ ์ธ์ ๋์์ผ๋ก ์ง์ .
2. ์ธ์ ์ ์ฉ ์คํ์ผ์ @media print ๋ด๋ถ์์ ์ ์.
3. ํ๋ฉด์ฉ/์ธ์์ฉ์ ๊ตฌ๋ถํด ํ์์ ๋ฐ๋ผ display๋ฅผ ๋ฌ๋ฆฌ ์ ์ฉ.
4. A4 ์ฌ์ด์ฆ ๊ฐ๋ก ๋ฐฉํฅ์ @page { size: A4 landscape; }๋ก ์ค์ .
๊ฐ์ ์ฌํญ์ด ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์! ๊ฐ์ฌํฉ๋๋ค.