Windows MFC 기반 다기능 파일 변환 데스크톱 앱 — 이미지 ↔ PDF · PDF 도구 · Markdown · Word · PPT 변환
ImgToPdf는 외부 라이브러리 없이 Windows 10 기본 API만으로 동작하는 파일 변환 도구입니다.
5개의 탭으로 이미지·PDF·Markdown·Word·PPT 변환을 하나의 창에서 처리하며, 한국어/영어 런타임 전환을 지원합니다.
탭2에서 로컬 AI(Ollama)로 PDF 내용을 자동 요약할 수 있습니다 — 인터넷 연결·API 키 불필요.
┌────────────────────────────────────────────────────────────────────────────────────┐
│ ImgToPdf v2.3 [─][□][✕] │
├────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ [◀] [▶] │
│ │이미지변환│ │ PDF 도구 │ │ MD 변환 │ │Word 변환 │ │ PPT 변환 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────────────────────────────────────────────────────────────────────────┐ │
│ │ 활성 탭 자식 다이얼로그 영역 │ │
│ └──────────────────────────────────────────────────────────────────────────────┘ │
│ 경로: [___________________________________] [찾기] [변환/실행] │
│ [██████████░░░░░] (3 / 1 / 10) [▲] [▼] [삭제] │
└────────────────────────────────────────────────────────────────────────────────────┘
| 기능 | 설명 |
|---|---|
| 이미지 → PDF | JPG · PNG · BMP · TIFF · GIF → 개별 PDF 또는 다중 페이지 합치기 |
| PDF → JPG | PDF 페이지별 JPG 추출 (품질 90, WinRT Windows.Data.Pdf 사용) |
| 드래그 앤 드롭 | 파일 · 폴더 드롭 지원, 중복 자동 제거 |
| 병렬 변환 | hardware_concurrency() 기반 워커 스레드 풀 |
| 이미지 미리보기 | 목록 클릭 시 GDI+ 비율 유지 Fit 렌더링 |
| 순서 변경 | ▲▼ 버튼으로 변환 순서 조정 |
| 진행 상태 | 프로그레스바 + 3색 카운터 (완료 / 실패 / 총계) 실시간 표시 |
| 삭제 이중 모드 | 변환 전: 선택 항목 제거 / 완료 후: 전체 초기화 |
| 기능 | 설명 |
|---|---|
| 나누기 | PDF를 페이지별 개별 PDF로 분할, 또는 범위 지정 분할 (예: 1-3,5,7-9) |
| 합치기 | 여러 PDF를 하나로 병합 (▲▼으로 순서 조정) |
| 페이지 추출 | 지정 페이지만 추출 → 단일 PDF 또는 페이지별 개별 PDF |
| AI 요약 | 선택한 PDF를 WinRT OCR로 텍스트 인식 → 로컬 Ollama(llama3.2:3b)로 구조화 요약 생성 |
| 메모장으로 열기 | 요약 결과를 메모장에서 열어 저장·편집 가능 |
| 요약 언어 선택 | 한국어 / English 라디오 버튼으로 요약 출력 언어 선택 |
| 기능 | 설명 |
|---|---|
| HTML 변환 | Markdown → UTF-8 BOM HTML |
| PDF 변환 | Markdown → PDF (RTF 렌더링 → A4 페이지 분할) |
| HTML+PDF | HTML과 PDF 동시 생성 |
| 미리보기 | 목록 클릭 시 RichEdit에서 변환 미리보기 표시 |
| 기능 | 설명 |
|---|---|
| Word → PDF | .doc / .docx → PDF 변환 |
| 변환 엔진 자동 감지 | Microsoft Word → LibreOffice 순으로 레지스트리 탐색, 설치된 엔진 자동 선택 |
| Microsoft Word | COM IDispatch로 Presentations.Open → SaveAs(PDF) → Close |
| LibreOffice | soffice.exe --headless --convert-to pdf 프로세스 실행 |
| 드래그 앤 드롭 | 파일 드롭 지원 |
| 미리보기 | 목록 클릭 시 쉘 썸네일 또는 파일 아이콘 표시 |
| 기능 | 설명 |
|---|---|
| PPT → PDF | .ppt / .pptx → PDF 변환 |
| 변환 엔진 자동 감지 | Microsoft PowerPoint → LibreOffice 순으로 레지스트리 탐색 |
| Microsoft PowerPoint | COM IDispatch로 SaveAs(ppSaveAsPDF=32) 사용, 원본 슬라이드 크기 유지 |
| LibreOffice | soffice.exe --headless --convert-to pdf 프로세스 실행 |
| 드래그 앤 드롭 | 파일 드롭 지원 |
| 미리보기 | 목록 클릭 시 쉘 썸네일 또는 파일 아이콘 표시 |
| 기능 | 설명 |
|---|---|
| 탭 순서 변경 | ◀▶ 버튼으로 탭 위치 이동, 앱 재시작 후에도 순서 유지 |
| 런타임 언어 전환 | 시스템 메뉴 → Switch to English / 한국어로 전환 (재시작 불필요) |
| 인앱 도움말 | F1 키 또는 시스템 메뉴 → 사용 방법 표시 |
| 한글 경로 지원 | 입출력 경로 한글 완전 지원 |
| 우클릭 메뉴 | 항목 제거 · 파일 위치 열기 · 파일 열기 · 전체 삭제 |
| 항목 | 최소 사양 |
|---|---|
| OS | Windows 10 버전 1803 이상 |
| 빌드 도구 | Visual Studio 2022 (v143 툴셋) |
| Windows SDK | 10.0 이상 |
| 런타임 | Visual C++ 재배포 패키지 (MFC Dynamic) |
| AI 요약 (선택) | Ollama + llama3.2:3b 모델 (로컬 실행, 인터넷 불필요) |
- Releases 페이지에서
ImgToPdf_Setup_v2.3.exe다운로드 - 실행 후 설치 마법사 진행
- 앱 언어 선택 단계에서
한국어 (Korean)또는English선택 - 설치 완료 후 Ollama 자동 설치 여부 확인 → 동의 시 자동 다운로드·설치
- 이전 버전이 있으면 자동으로 제거 후 설치
관리자 권한 없이 설치 가능합니다.
# Release x64 빌드
msbuild ImgToPdf.vcxproj /p:Configuration=Release /p:Platform=x64또는 ImgToPdf.sln을 Visual Studio 2022에서 열고 Release | x64로 빌드합니다.
- Inno Setup 6.x 설치
Release x64빌드 완료 확인installer\ImgToPdf_setup.iss→ Inno Setup Compiler에서 F9installer\ImgToPdf_Setup_v2.3.exe생성
x64\Release폴더에mfc142u.dll,msvcp140.dll,vcruntime140.dll,vcruntime140_1.dll이 있으면 설치 파일에 자동 포함됩니다.
- 이미지 파일을 드래그 앤 드롭하거나 [찾기] 로 추가
- (선택) 합치기 체크 → 모든 이미지를 하나의 다중 페이지 PDF로 합침
- (선택) ▲▼ 으로 순서 조정
- [변환] 클릭 → 원본 파일과 같은 폴더에 저장
- PDF 파일을 목록에 추가 → 페이지 수 자동 스캔
- [변환] 클릭 →
원본명_p001.jpg,원본명_p002.jpg, … 저장
- 나누기: PDF 추가 → 페이지별 또는 범위 입력 (예:
1-3,5,7) → [실행] - 합치기: PDF 여러 개 추가 → ▲▼ 으로 순서 조정 → 출력 파일명 입력 → [실행]
- 페이지 추출: PDF 추가 → 추출할 페이지 입력 (예:
1,3,5-7) → [실행]
Ollama가 로컬에서 실행 중이어야 합니다 (
http://localhost:11434).
- 목록에서 PDF 파일 선택
- 요약 언어 선택:
● 한국어또는○ English - [요약] 클릭 → OCR 인식 후 Ollama로 구조화 요약 생성
- 결과 확인 후 [메모장] 클릭 → 메모장에서 열기·저장 가능
요약 출력 형식:
[개요]
(4~6문장 핵심 요약)
[주요 내용]
• 포인트 1
• 포인트 2 …
[결론 및 시사점]
(3~4문장)
# 1. https://ollama.com 에서 Ollama 설치 (또는 앱 설치 시 자동 설치)
# 2. 모델 다운로드
ollama pull llama3.2:3b.md/.markdown파일을 추가- 출력 형식 선택:
HTML/PDF/HTML+PDF - (선택) 출력 폴더 지정 (비우면 원본 폴더에 저장)
- [변환] 클릭
Microsoft Word 또는 LibreOffice 중 하나가 설치되어 있어야 합니다.
.doc/.docx파일을 드래그 앤 드롭하거나 [찾기] 로 추가- (선택) 출력 폴더 지정 (비우면 원본 폴더에 저장)
- [변환] 클릭 → PDF 저장
Microsoft PowerPoint 또는 LibreOffice 중 하나가 설치되어 있어야 합니다.
.ppt/.pptx파일을 드래그 앤 드롭하거나 [찾기] 로 추가- (선택) 출력 폴더 지정 (비우면 원본 폴더에 저장)
- [변환] 클릭 → PDF 저장
창 좌상단 ─ (시스템 메뉴) → Switch to English 클릭 → 즉시 전환 (재시작 불필요)
| 항목 | 값 |
|---|---|
| C++ 표준 | C++17 |
| 문자셋 | Unicode |
| MFC | Dynamic (UseOfMfc=Dynamic) |
| 추가 컴파일 플래그 | /utf-8 |
| 링크 라이브러리 | gdiplus.lib shell32.lib runtimeobject.lib shcore.lib |
| ComCtl32 | v6 (linker manifest pragma 활성화) |
| 역할 | 기술 |
|---|---|
| UI 프레임워크 | MFC CDialogEx / CTabCtrl / 자식 다이얼로그 |
| 이미지 로딩 | stb_image.h (헤더 온리, 서드파티) |
| 이미지 렌더링 | GDI+ (Gdiplus::Bitmap) |
| PDF 생성 | PDF 1.4 스트림 직접 구현 (외부 라이브러리 없음) |
| PDF 읽기·렌더링 | Windows.Data.Pdf WinRT API (Windows 10 내장) |
| WinRT 래핑 | WRL + SyncWait 패턴 (비동기 → 동기 변환) |
| MD 변환 | 내장 MdConverter — Markdown → RTF → EM_FORMATRANGE A4 렌더링 |
| 병렬 처리 | std::thread + std::atomic<int> lock-free 인덱스 분배 |
| 언어 전환 | C++ wchar_t* 배열 (s_ko[]/s_en[]) + LS() 헬퍼 |
| AI 요약 (OCR) | Windows.Media.Ocr WinRT API (Windows 10 내장) |
| AI 요약 (LLM) | WinHTTP → Ollama REST API (llama3.2:3b, 로컬) |
| 설치 파일 | Inno Setup 6.x (Ollama 자동 설치 지원) |
ImgToPdf/
├── ImgToPdf.sln
├── ImgToPdf.vcxproj
├── ImgToPdf.vcxproj.filters ← Solution Explorer 폴더 구조 정의
│
├── [App Entry]
│ ├── ImgToPdf.h / .cpp ← 앱 진입점, GDI+ 초기화
│ ├── pch.h / .cpp ← 프리컴파일드 헤더
│ └── targetver.h
│
├── [Main Dialog]
│ ├── ImgToPdfDlg.h / .cpp ← 메인 다이얼로그 (탭 컨테이너)
│ └── TabDlgBase.h ← 탭 공통 인터페이스
│
├── [Tab Dialogs]
│ ├── ImgConvertDlg.h / .cpp ← 탭1: 이미지 ↔ PDF 변환
│ ├── PdfToolsDlg.h / .cpp ← 탭2: PDF 나누기·합치기·추출·AI 요약
│ ├── MdConvertDlg.h / .cpp ← 탭3: Markdown → HTML/PDF
│ ├── WordConvertDlg.h / .cpp ← 탭4: Word → PDF (Word/LibreOffice COM)
│ └── PptConvertDlg.h / .cpp ← 탭5: PPT → PDF (PowerPoint/LibreOffice)
│
├── [Conversion Engine]
│ ├── ConvertWorker.h / .cpp ← 이미지 변환 스레드 풀
│ ├── PdfWriter.h / .cpp ← PDF 1.4 스트림 생성
│ ├── PdfConverter.h / .cpp ← WinRT PDF 읽기·JPG 렌더링
│ └── MdConverter.h / .cpp ← Markdown → RTF/HTML 변환
│
├── [UI Controls]
│ ├── FileListCtrl.h / .cpp ← 커스텀 CListCtrl (상태 아이콘·행 배경색)
│ ├── ImagePreviewCtrl.h / .cpp ← GDI+ 이미지 미리보기
│ ├── ProgressLabel.cpp ← 3색 카운터 레이블
│ └── ColorButton.h ← 커스텀 색상 버튼
│
├── [Language & Messages]
│ ├── AppLang.h / .cpp ← 런타임 언어 전환 (LS, BuildFilter)
│ ├── AppMessages.h ← 커스텀 WM_USER 메시지 상수
│ └── resource.h ← 컨트롤 ID, 다이얼로그 ID
│
├── [Resources]
│ ├── ImgToPdf.rc ← 다이얼로그 템플릿
│ └── ImgToPdf.ico
│
├── installer/
│ └── ImgToPdf_setup.iss ← Inno Setup 설치 스크립트
│
└── third_party/
└── stb_image.h
| 종류 | 확장자 |
|---|---|
| 이미지 | .jpg .jpeg .png .bmp .tiff .tif .gif |
.pdf |
|
| Markdown | .md .markdown |
| Word | .doc .docx |
| PowerPoint | .ppt .pptx |
| 변환 종류 | 출력 파일 |
|---|---|
| 이미지 → PDF (개별) | 원본명.pdf |
| 이미지 → PDF (합치기) | 원본명_통합.pdf |
| PDF → JPG | 원본명_p001.jpg, _p002.jpg, … |
| PDF 나누기 | 원본명_p001.pdf, _p002.pdf, … |
| PDF 나누기 (범위) | 원본명_range1.pdf, _range2.pdf, … |
| PDF 합치기 | 지정파일명.pdf |
| PDF 추출 (단일) | 원본명_extracted.pdf |
| Markdown → HTML | 원본명.html |
| Markdown → PDF | 원본명.pdf |
| Word → PDF | 원본명.pdf |
| PPT → PDF | 원본명.pdf |
- jaeho
- pim9697@gmail.com
이 프로젝트는 Claude(Anthropic) 로 바이브코딩(Vibe Coding)하고,
Gemini(Google) 로 소스코드를 검수하여 완성했습니다.
