.toDelta()에 값이 없거나, 빈 Document를 넘김.pw.MultiPage의 build 콜백에서 빈 리스트 반환.document.toDelta().toList()에서 실제로 op들이 나오는지 프린트.width/height 파라미터가 없거나 고정값(너무 큰 값).fit: pw.BoxFit.contain 등).pw.Image(image, width: contentWidth, fit: pw.BoxFit.contain) 적용.fit 파라미터 체크.fontSize, fontWeight, color 등 스타일을 일관되게 적용하지 않음.size, bold, color, header 등) 파싱 누락.실제 노트 앱에서 쓰는 폰트 크기, 스타일을 파싱 코드에 정확히 맵핑.
예시)
bold/italic/underline 등은 Delta attribute 체크 후,
pw.TextStyle(fontWeight: ..., fontStyle: ..., decoration: ...)로 모두 반영.
Pretendard 등 커스텀 폰트도 반드시 PDF용으로 로딩해서 사용.
pw.MultiPage 대신 pw.Page만 써서 수동으로 분할 안 됨.pw.MultiPage 사용.pw.Widget을 생성해서 List에 쌓고,MultiPage의 build에 바로 넘기면 자동 분할됨.padding, margin)을 적절히 주지 않음.align, list, header 등 Delta 속성을 PDF에 제대로 적용 안 함.Delta의 각 속성을 일일이 파싱해서 PDF 위젯의 정렬/여백에 정확히 반영.
예시)
attributes['align'] == 'center'면 pw.TextAlign.centerpw.Text, pw.RichText로 텍스트를 추가해야Share.shareXFiles([XFile(file.path)], subject: ...)share 함수 인자에 포함되지 않도록 정리.PDF에서 "진짜 노트처럼, 길이 제한 없이, 텍스트/이미지/리스트/코드블럭/헤더/폰트/정렬"을 제대로 뽑으려면
Delta(Quill JSON)를 직접 파싱해서 PDF로 변환하는 것이 가장 안정적임.
실제로 앱 서비스에선 파싱 방식만 씀(스크린샷 방식은 특수 목적).
각종 이슈는
혹시 실제로 겪은 특정 증상/에러 로그 있으면, 바로 말씀해주시면
해당 케이스 맞춤 트러블슈팅도 드릴 수 있습니다!
추가로, "노트 사이즈/공백/폰트/이미지 자동조절"의 튜닝이 더 필요하면 알려주세요.
오류 메시지
flutter: Unable to find a font to draw "니" (U+b2c8) try to provide a TextStyle.fontFallback
원인
pdf 패키지는 기본적으로 한글 폰트를 내장하고 있지 않음해결 방법
assets/fonts/Pretendard-Regular.ttf (또는 NotoSansKR 등) 폰트를
Flutter assets에 추가
아래와 같이 pdf에 폰트 적용하는 코드로 수정
Future<pw.Font> loadKoreanFont() async {
final fontData = await rootBundle.load('assets/fonts/Pretendard-Regular.ttf');
return pw.Font.ttf(fontData);
}
// PDF 생성 시
final ttf = await loadKoreanFont();
pw.Text(text, style: pw.TextStyle(font: ttf, fontSize: 18))
pubspec.yaml에 해당 폰트 파일 assets 등록 필수
원인
getApplicationDocumentsDirectory()에 저장해결 방법
PDF로 저장한 후,
임시 파일 생성 → 바로 “공유 다이얼로그” 띄워서 내보내기 제공
원인
RepaintBoundary로 캡처할 경우,해결 방법
스크롤 전체를 렌더링/캡처하려면
현실적 대안:
원인
quillController.document.toPlainText()를 사용하면해결 방법

원인
해결 방법
flutter pub getiOS에서 아래 코드처럼 Android API인 getExternalStorageDirectory()를 호출하려고 시도함:
final dir = await getExternalStorageDirectory();
iOS에서는 이 API가 없으므로, 런타임에서 'MissingPluginException' 혹은 'Method not implemented' 등의 에러가 발생
[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: MissingPluginException(No implementation found for method getExternalStorageDirectory on channel plugins.flutter.io/path_provider)
또는
Exception: 지원하지 않는 플랫폼입니다.
path_provider 패키지의 getExternalStorageDirectory() 함수는 Android 전용임getApplicationDocumentsDirectory()만 제공아래처럼 플랫폼별로 분기해서 API 호출해야 함
import 'dart:io';
import 'package:path_provider/path_provider.dart';
Future<Directory> _getSaveDirectory() async {
if (Platform.isAndroid) {
return await getExternalStorageDirectory() ??
await getApplicationDocumentsDirectory();
} else if (Platform.isIOS) {
return await getApplicationDocumentsDirectory();
} else {
throw Exception('지원하지 않는 플랫폼입니다.');
}
}
final dir = await _getSaveDirectory();
final file = File('${dir.path}/$fileName.pdf');
await file.writeAsBytes(await pdf.save());
| 증상/오류 | 원인 | 해결 방법 |
|---|---|---|
| iOS에서 Android API 호출 | 플랫폼 분기 미구현, Android API 호출 | 플랫폼별 분기, iOS는 Documents 사용 |
| 증상/오류 | 원인 | 해결 방법 |
|---|---|---|
| 한글 PDF 오류 | pdf 폰트 미지정 | 커스텀 한글폰트 로딩/적용 |
| iOS 저장경로 접근 불가 | 샌드박스 구조, Finder서 직접 못 봄 | 파일 공유(share) 기능 추가 |
| 화면 일부만 PDF 변환됨 | RepaintBoundary로 보이는 부분만 캡처 | 전체 스크롤 분할 캡처 or Delta→PDF |
| 이미지가 PDF에 없음 | 텍스트만 추출 | Delta→PDF 파싱로직 추가 or 캡처 방식 |
| 폰트 적용 안됨 | asset 누락/경로 불일치 | assets 폴더/경로/pubspec 확인 |
| 안드로이드 권한 오류 | 퍼미션 미설정 | AndroidManifest.xml에 퍼미션 추가 |
| iOS에서 Android API 호출 | 플랫폼 분기 미구현, Android API 호출 | 플랫폼별 분기, iOS는 Documents 사용 |