해당 포스트에서는 아래와 같은 라이브러리가 필요합니다.
- PDF 해독: syncfusion_flutter_pdf: ^19.1.55-beta
- PDF 뷰어: native_pdf_view: ^4.1.0
import 'package:native_pdf_view/native_pdf_view.dart';
import 'package:syncfusion_flutter_pdf/pdf.dart' as syncPdf;
맨 위에 'PDF 해독 라이브러리'라고 말씀 드렸던 라이브러리에서 동작을 합니다.
순서는 아래와 같습니다.
// _pdfPath에 있는 데이터를 바이트 단위로 읽고 리스트로 반환합니다.
var pdfDataBytes = File(_pdfPath).readAsBytesSync();
// 위에서 받은 읽어온 파일의 바이트 리스트와 문서의 비밀번호를 받아서 넣습니다.
syncPdf.PdfDocument document
= syncPdf.PdfDocument(inputBytes: pdfDataBytes, password: _password);
: 한번 사용자가 비밀번호로 열은 파일은 다시 비밀번호를 입력하지 않아도 되도록 하기 permission을 clear 해주는 작업을 거쳤습니다.
syncPdf.PdfSecurity security = document.security;
// 비밀번호로 연 PDF 파일에서 permission을 획득하고 모든 권한을 default로 돌립니다.
security.permissions.clear();
// 그런 뒤에 document를 저장하고 dispose 시켜줍니다.
List<int> bytes = document.save();
document.dispose();
Future<void> _overwriteDecryptPdfFile(List<int> bytes) async {
String _pdfPath = await macrogenPdfDownloadPath();
var file = File(_pdfPath);
// flush를 true로 하면 비동기에서 complete를 던져주기 전에 영구파일로 저장하도록 해줍니다.
await file.writeAsBytes(bytes, flush: true);
}
Future<void> _createPdfController() async {
String _pdfPath = await macrogenPdfDownloadPath();
if (_pdfPath.isNotEmpty) {
_pdfController = PdfController(document: PdfDocument.openFile(_pdfPath));
}
}
: rootBundle.load('assets/파일명') 을 사용해서 파일을 읽어서 바이트 데이터를 리스트로 만들어줍니다.
예)
Future<List<int>> _readDocumentData(String name) async {
final ByteData data = await rootBundle.load('assets/$name');
return data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
}
PdfDocument document = PdfDocument(
inputBytes: await _readDocumentData('result.pdf'), password: '1991');
** buffer flush?
버퍼 플러시는 임시 저장 영역에서 컴퓨터의 영구 메모리로 컴퓨터 데이터를 전송하는 것입니다. 예를 들어 파일을 변경하면 한 컴퓨터 화면에서 볼 수 있는 변경 사항이 일시적으로 버퍼에 저장됩니다.
일반적으로 임시 파일은 워드 문서를 열 때 생성되고 기본 파일을 닫으면 자동으로 소멸됩니다. 따라서 작업을 저장할 때 마지막으로 문서를 저장한 이후 문서에 대한 변경 사항이 버퍼에서 하드 디스크의 영구 저장소로 플러시됩니다.