λΈλΌμ°μ μμ 100% λ‘μ»¬λ‘ μλνλ κ°λ ₯ν PDF λꡬ
PDF Wizardλ μ¬μ©μμ λΈλΌμ°μ μμ μμ ν μλνλ νλΌμ΄λ²μ μ€μ¬μ PDF μ²λ¦¬ λꡬμ λλ€. μλ²λ‘ νμΌμ μ λ‘λνμ§ μκ³ λͺ¨λ μμ μ΄ λ‘컬μμ μ²λ¦¬λμ΄ μλ²½ν 보μκ³Ό νλΌμ΄λ²μλ₯Ό μ 곡ν©λλ€.
λλ©μΈ: https://pdfwizard.dev
- PDF λ³ν©: μ¬λ¬ PDF νμΌμ νλλ‘ κ²°ν©
- PDF λΆν : PDFμ κ°λ³ νμ΄μ§λ₯Ό λΆλ¦¬νμ¬ μ¬κ΅¬μ±
- μ΄λ―Έμ§ λ³ν: JPG, PNG, HEIC λ± λ€μν μ΄λ―Έμ§ νμμ PDFλ‘ λ³ν
- νμ΄μ§ μ¬μ λ ¬: λλκ·Έ μ€ λλ‘μΌλ‘ νμ΄μ§ μμ λ³κ²½
- νμ΄μ§ κ·Έλ£Ήν: κ°μ PDFμμ λΆλ¦¬λ νμ΄μ§λ€μ κ·Έλ£ΉμΌλ‘ κ΄λ¦¬
- μΈλ€μΌ 미리보기: κ° νμ΄μ§μ κ³ νμ§ μΈλ€μΌ μμ± λ° νμ
- λ€κ΅μ΄ μ§μ: νκ΅μ΄/μμ΄ μλ κ°μ§ λ° μ§μ
- PWA μ§μ: μ€νλΌμΈ λͺ¨λ λ° μ± μ€μΉ κ°λ₯
- λ€ν¬ λͺ¨λ: μμ€ν ν λ§μ λ°λ₯Έ μλ μ ν
- 100% ν΄λΌμ΄μΈνΈ μ¬μ΄λ μ²λ¦¬: μλ² μ λ‘λ μμ΄ λΈλΌμ°μ μμ λͺ¨λ μμ μν
- λ°μν λμμΈ: λͺ¨λ°μΌ, νλΈλ¦Ώ, λ°μ€ν¬ν± λͺ¨λ νκ²½ μ§μ
- ν°μΉ μ μ€μ² μ§μ: λͺ¨λ°μΌ νκ²½μμ λλκ·Έ μ€ λλ‘ μ΅μ ν
- Service Worker: μ€νλΌμΈ μλ λ° μΊμ± μ λ΅ κ΅¬ν
- SEO μ΅μ ν: λ©νλ°μ΄ν°, ꡬ쑰νλ λ°μ΄ν°, μ¬μ΄νΈλ§΅ μ 곡
- Next.js 15.5.2: React νλ μμν¬ (Turbopack μ§μ)
- React 19.1.0: UI λΌμ΄λΈλ¬λ¦¬
- TypeScript 5: νμ μμ μ±
- Tailwind CSS 4: μ νΈλ¦¬ν° κΈ°λ° μ€νμΌλ§
- pdf-lib 1.17.1: PDF μμ± λ° μ‘°μ
- pdfjs-dist 5.4.149: PDF λ λλ§ λ° νμ±
- @dnd-kit: λλκ·Έ μ€ λλ‘ κΈ°λ₯ ꡬν
- @dnd-kit/core 6.3.1
- @dnd-kit/sortable 10.0.0
- @dnd-kit/utilities 3.2.2
- heic2any 0.0.4: HEIC μ΄λ―Έμ§ λ³ν
- next-pwa 5.6.0: PWA κΈ°λ₯ ꡬν
- @vercel/analytics 1.5.0: μ¬μ© λΆμ
PDF-Wizard/
βββ app/ # Next.js μ± λλ ν 리
β βββ page.tsx # λ©μΈ νμ΄μ§
β βββ layout.tsx # λ£¨νΈ λ μ΄μμ
β βββ sitemap.xml/ # λμ μ¬μ΄νΈλ§΅ μμ±
βββ components/ # React μ»΄ν¬λνΈ
β βββ PDFMerger.tsx # λ©μΈ PDF μ²λ¦¬ μ»΄ν¬λνΈ
β βββ FileUploader.tsx # νμΌ μ
λ‘λ UI
β βββ FileItem.tsx # νμΌ μμ΄ν
μ»΄ν¬λνΈ
β βββ PDFSettingsModal.tsx # PDF μ€μ λͺ¨λ¬
β βββ ZoomableThumbnail.tsx # νλ κ°λ₯ν μΈλ€μΌ
β βββ PWAInstall.tsx # PWA μ€μΉ ν둬ννΈ
β βββ OfflineIndicator.tsx # μ€νλΌμΈ μν νμ
β βββ ServiceWorkerManager.tsx # SW κ΄λ¦¬
βββ utils/ # μ νΈλ¦¬ν° ν¨μ
β βββ pdfUtils.ts # PDF μ²λ¦¬ λ‘μ§
β βββ i18n.ts # λ€κ΅μ΄ μ§μ
β βββ generateIcons.js # μμ΄μ½ μμ± μ€ν¬λ¦½νΈ
βββ public/ # μ μ νμΌ
βββ manifest.json # PWA λ§€λνμ€νΈ
βββ service-worker.js # μλΉμ€ μ컀
- Node.js 18.0.0 μ΄μ
- npm λλ yarn
# μμ‘΄μ± μ€μΉ
npm install
# κ°λ° μλ² μ€ν (Turbopack μ¬μ©)
npm run dev
# νλ‘λμ
λΉλ
npm run build
# νλ‘λμ
μλ² μ€ν
npm start
# λ¦°νΈ μ€ν
npm run lintνΉλ³ν νκ²½ λ³μ μ€μ μ΄ νμνμ§ μμ΅λλ€. λͺ¨λ κΈ°λ₯μ΄ ν΄λΌμ΄μΈνΈ μ¬μ΄λμμ μλν©λλ€.
- β κΈ°λ³Έ PDF λ³ν© κΈ°λ₯
- β νμΌ μ λ‘λ μΈν°νμ΄μ€
- β λλκ·Έ μ€ λλ‘ κ΅¬ν
- β PDF νμ΄μ§ λΆν
- β μ΄λ―Έμ§λ₯Ό PDFλ‘ λ³ν
- β νμ΄μ§ μ¬μ λ ¬
- β μΈλ€μΌ 미리보기
- β Service Worker ꡬν
- β μ€νλΌμΈ λͺ¨λ μ§μ
- β PWA μ€μΉ κ°λ₯
- β μΊμ± μ λ΅ κ΅¬ν
- β λͺ¨λ°μΌ λλκ·Έ μ€ λλ‘ μ΅μ ν
- β λ°μν λμμΈ κ°μ
- β λ€ν¬ λͺ¨λ μ§μ
- β λ€κ΅μ΄ μ§μ (νκ΅μ΄/μμ΄)
- β λ©νλ°μ΄ν° μ΅μ ν
- β ꡬ쑰νλ λ°μ΄ν° μΆκ°
- β μ¬μ΄νΈλ§΅ μμ±
- β Vercel Analytics ν΅ν©
- PDF νμ΄μ§ νμ κΈ°λ₯
- PDF μμΆ κΈ°λ₯
- μν°λ§ν¬ μΆκ° κΈ°λ₯
- λ°°μΉ μ²λ¦¬ κΈ°λ₯
- λ λ§μ μΈμ΄ μ§μ (μΌλ³Έμ΄, μ€κ΅μ΄ λ±)
- PDF μνΈν/볡νΈν
- PDF μμ μ±μ°κΈ°
- OCR ν μ€νΈ μΈμ
- PDF to Word/Excel λ³ν
- ν΄λΌμ°λ μ μ₯μ μ°λ (μ νμ )
- νμ κΈ°λ₯ (λ§ν¬ 곡μ )
- ν νλ¦Ώ μμ€ν
- API μ 곡
- λΈλΌμ°μ νμ₯ νλ‘κ·Έλ¨
- λ°μ€ν¬ν± μ± (Electron)
- λ‘컬 μ²λ¦¬: λͺ¨λ νμΌ μ²λ¦¬κ° μ¬μ©μμ λΈλΌμ°μ μμλ§ μνλ©λλ€
- μλ² μ λ‘λ μμ: νμΌμ΄ μλ²λ‘ μ μ‘λμ§ μμ΅λλ€
- λ°μ΄ν° μμ§ μμ: μ¬μ©μ νμΌμ΄λ λ΄μ©μ μμ§νμ§ μμ΅λλ€
- λΆμ λꡬ: Vercel Analyticsλ₯Ό ν΅ν μ΅λͺ μ¬μ© ν΅κ³λ§ μμ§
νλ‘μ νΈμ κΈ°μ¬λ₯Ό νμν©λλ€! λ€μ μ μ°¨λ₯Ό λ°λΌμ£ΌμΈμ:
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€.
- techniflows - https://www.techniflows.com
μ΄ νλ‘μ νΈλ λ€μ μ€νμμ€ νλ‘μ νΈλ€μ λμμΌλ‘ λ§λ€μ΄μ‘μ΅λλ€:
- Next.js νμ νλ₯ν νλ μμν¬
- pdf-libμ pdfjs-dist κ°λ°μλ€
- @dnd-kit νμ λλκ·Έ μ€ λλ‘ λΌμ΄λΈλ¬λ¦¬
- λͺ¨λ μ€νμμ€ κΈ°μ¬μλ€
μ΅μ’ μ λ°μ΄νΈ: 2025λ 9μ 12μΌ