์๋ฏธ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด๊ณ ๊น๋ํ HTML์ด ๋ง๋ค์ด์ ธ์ผ ํ๋ค.
- PDF์ ์๋ ๋ ์ด์์์ด 2๋จ์ด์์ด๋ HTML์ 1๋จ ๋ ์ด์์์ผ๋ก ๋ณํ๋์ด์ผ ํ๋ค(PDF reflow).
- ์๋ฏธ์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ HTML์ด ๋ง๋ค์ด์ง ๊ฒ. ๋ ผ๋ฌธ์ ์ ๋ชฉ์ h1, ์ค๊ฐ ์ ๋ชฉ์ ์๊ณ์ ๋ฐ๋ผ h2-h6, ๋ชฉ๋ก์ ul/li, ๋จ๋ฝ์ p, ์ฝ๋ ๋ธ๋ญ์ pre/code, ํ๋ table ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ณธ๋ฌธ์ ๊ตต์ ๊ธ์จ์ฒด๋ strong, ๊ธฐ์ธ์ ๊ธ์จ์ฒด๋ em, ์ทจ์์ ์ s, ๋ฐ์ค์ u๋ฅผ ์ด๋ค.
- ๋ด๋ถ ๋งํฌ๋ ์ฐธ์กฐ๋ a ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
- ๊ฐ ํ์ด์ง์ ๊ฐ์ฃผ๋ ๋ฌธ์ ์ ์ผ ๋ง์ง๋ง์ผ๋ก ์ฎ๊ธด๋ค.
์ธ๊ณ ์ต๊ณ ์์ค์ pdf2html ๋ณํ๊ธฐ๋ฅผ ๋ง๋๋ ๊ฒ ๋ชฉํ์ ๋๋ค. ์ ๋นํ ํ์ง ๋ง์ธ์.
- PDF ํ์ผ์ ํ์์ ๊น๊ฒ ์ดํดํ๊ณ ํ์ฉํ ์ ์๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ํ์ฉํ์ธ์.
- PDF ํ์ผ์ ํ ์คํธ bbox ์ขํ, ๊ธ๊ผด, ๊ธ์ ํฌ๊ธฐ ๋ฑ PDF ํ์ผ์ ๋ด๊ธด ๋ชจ๋ ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์์ ์ ์ฒด์ ์ธ ๋ ์ด์์, ํ ์คํธ์ ์์น ๋ฑ์ ํ์ ํ๊ณ ๊ฒ์ํํธ ์๋ฆฌ, ํธ์ง ๋์์ธ ๋ฑ ๋ชจ๋ ์ง์์ ํ์ฉํ์ฌ ์ฌ๋ฐ๋ฅธ ๋ณํ์ ํ์ฉํ์ธ์.
- Machine Vision, ๋์์ธ, ํต๊ณํ, ์ ์ฐํ, ์ํ ๋ฑ ๋ค์ํ ๋ถ์ผ์ ์์ด๋์ด๋ฅผ ์ฐธ์ ํ๊ฒ ์กฐํฉํ์ฌ ์๋ํ์ธ์. ์ธ๊ณ ์ต๊ณ ์์ค์ ๋ณํ๊ธฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๊ธฐ์กด์ ๋ปํ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํด๋ฆฌ์คํฑ๋ง์ผ๋ก๋ ํ๊ณ๊ฐ ์์ต๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ๊ณผ ํด๋ฆฌ์คํฑ๊ณผ AI๋ฅผ ์์ฃผ ์๋ฆฌํ๊ฒ ์กฐํฉํ์ฌ ์ฑ๋ฅ์ด ๋น ๋ฅด๋ฉด์๋ ํ์ง์ด ์ต๊ณ ๋ก ์ข์ ๋ณํ๊ธฐ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
- ๊ธฐ์กด ์ฝ๋์ ๋ฐฉํฅ์ฑ์ ํ๊ณ๊ฐ ์๋ค๊ณ ํ๋จํ๋ฉด ๊ณผ๊ฐํ๊ฒ ์์ ํ์ธ์.
- ๊ฐ์ ์ค๋ฐ๊ฟ์ผ๋ก ๋์ด์ง paragraph ์ด์ด์ฃผ๊ธฐ
- ์๋ชป ์ด์ด์ง paragraph ๋๋ ์ฃผ๊ธฐ
- ํ ์คํธ bbox ์ ๋ณด์ ๊ธฐ๋ฐํ 1๋จ, 2๋จ ๋ ์ด์์ ๊ฒ์ถ
- ํ ์คํธ bbox ์ ๋ณด์ ๊ธฐ๋ฐํ paragraph ๊ฒ์ถ
- ์ด๋ฏธ์ง ์ถ์ถ
- ๋ด๋ถ ๋งํฌ ์ฒ๋ฆฌ
- ๋ฌธ์ ๋ด์ ๊ตฌ์ฒด์ ์ธ ๋ฌธ์์ด์ ํ์งํ๋ ์์ ์ ๊ทผ์ ํผํ์ธ์. ์ ๋ง ์ด์ฉ ์ ์๋ ์ํฉ์ธ ๊ฒฝ์ฐ์ ํํ์ฌ, ๋งค์ฐ ์ผ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ๋์ ํ ์คํธ ํจํด์ ํ์งํ๋ ๊ฑด ๊ด์ฐฎ์ต๋๋ค.
- ํ ์คํธ์ ๋ค๋ฅธ ํ ์คํธ๊ฐ ๋์ธ ์๋์ ์์น, ์ ์ฒด์ ์ธ ๋ ์ด์์ ์์์์ ์์น์ ํฌ๊ธฐ, ํฐํธ์ ํฌ๊ธฐ ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํ์ฌ ํ ์คํธ์ ์ญํ ๊ณผ ์๋ฏธ๋ฅผ ํ์ ํ์ธ์. ๋ง์น ์ฌ๋์ด ๋์ผ๋ก ํ๋ ๊ฒ์ฒ๋ผ.
- ๊ธฐ์กด ์ฝ๋์ ๋ฐฉํฅ์ฑ์ ์์งํ์ง ๋ง๊ณ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฐพ์ผ์ธ์.
๋ณํ ํ์ง์ ๊ฐ์ ํ๋ ค๋ฉด ๋ฐ๋์ ๋ค์ ์ ์ฐจ๋ฅผ ๋ฐ๋ผ ์งํํ๋ฉฐ, ํ ๋ฒ์ ํ ์ข ๋ฅ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๋ ์ผ์ ์ง์คํ๋ค. ์๋ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅด๋ฉด ํ ๋ฌธ์์ ํ ์ข ๋ฅ์ ๋ฌธ์ ์๋ง ์ง์คํ์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๋ฌ ๋ฌธ์๊ฐ ๋์์ ์ข์์ง ์ ์๋ค.
- ๊ฐ ๋ฌธ์์ ํ์ด์ง PNG ์ด๋ฏธ์ง๋
data/work/png/{๋ฌธ์๋ช }/์ ์๋ค. (์:data/work/png/attention/) ์๋ณธ PDF์ ๋์กฐํ ๋ ์ฐธ๊ณ ํ ๊ฒ. data์ ๊ฐ ๋ฌธ์๋ฅผhtml๋ก ํ์ผ๋ก ๋ณํํ๋ค.- ๋ช
๋ น:
node src/cli.ts pdf2html <pdfPath> <baselineHtmlPath> - ์ถ๋ ฅ ์์น:
data/work/before/{๋ฌธ์๋ช }.html(์:data/work/before/attention.html)
- ๋ช
๋ น:
- ๋ณํ๋ HTML ํ์ผ ์ค ํ๋์ ๋ฌธ์๋ฅผ ์ง์คํ์ฌ ์ดํด๋ณด๋ฉฐ ์๋ชป ๋ณํ๋ ๊ฒ์ผ๋ก ์ถ์ ๋๋ ๋ฌธ์ ์ ์ ํ์ ์ฐพ๋๋ค. ์ ๋ชฉ์ด ์๋๋ฐ h1-h6 ํ๊ทธ๊ฐ ์ฐ์๊ฑฐ๋, ๋ชฉ๋ก์ธ๋ฐ li๊ฐ ์ฐ์ด์ง ์์๊ฑฐ๋, ํ๋์ ๋จ๋ฝ์ธ๋ฐ ์ฌ๋ฌ p ํ๊ทธ๊ฐ ์ฐ์๊ฑฐ๋, ์ฌ๋ฌ ๋จ๋์ธ๋ฐ ํ๋์ p ํ๊ทธ๊ฐ ์ฐ์๊ฑฐ๋, ํ ์คํธ ์ถ์ถ์ด ์๋ชป๋ ๋ฏ ํ ์คํธ์ ๋ด์ฉ์ด ์ด์ํ๊ฒ ์ ํ ์๊ฑฐ๋(์๋ฅผ ๋ค์ด 2๋จ ๋ ์ด์์์ ์ธ์ํ์ง ๋ชปํด์ ํ ์คํธ๊ฐ ์์ด๋ ๊ฒฝ์ฐ), ๋ด๋ถ ๋งํฌ๊ฐ ๊ฑธ๋ ค์ผ ํ๋๋ฐ ๊ฑธ๋ฆฌ์ง ์์๊ฑฐ๋ ํ๋ ๋ฑ์ ๋ฌธ์ ๋ฅผ ์ฐพ๋๋ค.
- ํด๋น ๋ฌธ์ ๋ก ์ธํด์ ๊นจ์ง๋ ๋จ์ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ํ
์คํธ๋ฅผ ์คํํ์ฌ ์ค์ ๋ก ํ
์คํธ๊ฐ ๊นจ์ง๋์ง ํ์ธํ๋ค. ํ
์คํธ ํ์ผ์ ์์ค์ฝ๋์ co-locateํ๋ค. (์:
src/foo.ts์ ํ ์คํธ๋src/foo.test.ts) - ์ฝ๋๋ฅผ ์์ ํ์ฌ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ์ด ๋, ํน์ ๋ฌธ์์ ํน์ ํ์๋ง์ ํด๊ฒฐํ๋ ๊ผผ์๋ฅผ ์ฐ์ง ์๊ณ ์ผ๋ฐํ๋ ์๊ณ ๋ฆฌ์ฆ ๋๋ ํด๋ฆฌ์คํฑ์ ๋ง๋ ๋ค. ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ธํด ๊ธฐ์กด ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ฑฐํ๊ฑฐ๋ ๊ฐ์ํํ ์ ์์ผ๋ฉด ๊ฐ์ฅ ์ข๋ค. ์๊ณ ๋ฆฌ์ฆ์ด๋ ํด๋ฆฌ์คํฑ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ์ ํํ์ฌ OpenAI API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
.env์OPENAI_API_KEY๊ฐ ์์ผ๋ ์ด๊ฑธ ํ์ฉํ์ฌ API๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ฅผ ๋ง๋ค ๊ฒ.gpt-5-mini-2025-08-07๋ชจ๋ธ์ ์ฌ์ฉํ ๊ฒ. - ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ์ฌ ์ ์ฒด ํ ์คํธ๊ฐ ํต๊ณผํ๋ ๊ฑธ ํ์ธํ๋ค. ์ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๊ธฐ์กด์ ๋ค๋ฅธ ํ ์คํธ๋ค์ด ๊นจ์ง๋ฉด ๊ฐ๊ฐ์ ๋ด์ฉ์ ๋ฉด๋ฐํ๊ฒ ์ดํด๋ณด๊ณ regression์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์์ ํ๋ค. ๋ฐ๋ฉด, HTML์ด ๋ ๋ฐ๋์งํ ๋ฐฉํฅ์ผ๋ก ๋ณํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ๊ฐ ๊นจ์ง ๊ฒ์ด๋ฉด ์ฝ๋๊ฐ ์๋๋ผ ํ ์คํธ๋ฅผ ์์ ํ๋ค. ๊ธฐ์กด ํ ์คํธ๊ฐ ๋ง์ด ๊นจ์ง๋ค๊ณ ํด์ ๋ฐ๋์ regression์ด๋ผ๊ณ ๋จ์ ํ์ง ๋ง๊ณ ๋ด์ฉ์ ์ ์ดํด๋ณผ ๊ฒ.
data์ ๊ฐ ๋ฌธ์๋ฅผhtml๋ก ๋ณํํ๋ค.- ๋ช
๋ น:
node src/cli.ts pdf2html <pdfPath> <afterHtmlPath> - ์ถ๋ ฅ ์์น:
data/work/after/{๋ฌธ์๋ช }.html(์:data/work/after/attention.html)
- ๋ช
๋ น:
- 2๋จ๊ณ์์ ๋ณํํ html๊ณผ 7๋จ๊ณ์์ ๋ณํํ diff๋ฅผ ํ์ฌ ํ ์คํธ์ ์กํ์ง ์์ regression์ด ์๋์ง ํ์ธํ๋ค. regression์ด ์๋ค๋ฉด 5๋จ๊ณ๋ก ๋์๊ฐ๋ค.
- 7๋จ๊ณ์์ ๋ง๋ค์ด์ง ๋ชจ๋ HTML์
data/{๋ฌธ์๋ช }.htmlํ์ผ๋ก ์ ์ฅํ๋ค. (์:data/attention.html) - ์ปค๋ฐํ๋ค.
ํน์ ๋ฌธ์์ ํน์ ๋ฌธ์ ๋ง ๊ฐ์ ์ ํ๋ ค๊ณ ํ๋๋ผ๋ ์ ์ ์ฐจ๋ฅผ ๋ฐ๋ผ์ ๋๋จธ์ง ๋ฌธ์๋ค์๋ regression์ด ์๋์ง ๋ฐ๋์ ํ์ธํด์ผ ํ๋ค. ๋ชจ๋ ๋ณํ๊ฐ regression์ ์๋๋ค. ์ถฉ๋ถํ ์ผ๋ฐํ๋ ์๊ณ ๋ฆฌ์ฆ ๋๋ ํด๋ฆฌ์คํฑ์ ์ผ๋ค๋ฉด ๋ค๋ฅธ ๋ฌธ์๋ค๋ ๋ฉ๋ฌ์ ๊ฐ์ ๋ ๊ฒ์ด๋ค. diff ๊ฒฐ๊ณผ๋ฅผ ๋ฉด๋ฐํ๊ฒ ์ดํผ๋ฉฐ regression์ธ์ง ์๋์ง ์ ํ๋จํ ๊ฒ.
- ํ
์คํธ ์ผ์ด์ค๋
data๋๋ ํ ๋ฆฌ์ ์๋ ์ค์ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์ธ์. - ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ๋ณํ์
beforeAll()์์ ํ ๋ฒ์ ํ์ธ์.
์ด ์ ์ฅ์์์ ๋ณํ์ ์ฌ์ฉํ๋ CLI ์๋ธ ๋ช ๋ น์ ์๋ 2๊ฐ๋ค.
node src/cli.ts pdf2png <pdfPath> <outputDir>node src/cli.ts pdf2html <pdfPath> <outputHtmlPath>
์์:
node src/cli.ts pdf2png data/sample.pdf data/work/png/samplenode src/cli.ts pdf2html data/sample.pdf data/work/before/sample.htmlnode src/cli.ts pdf2html data/sample.pdf data/work/after/sample.html