Skip to content

Commit 6309f0a

Browse files
committed
feat: add readAsBytes method to PdfDocument interface and implementations
- Introduced `readAsBytes` method in the `PdfDocument` interface for reading PDF document bytes. - Implemented `readAsBytes` in `PdfDocumentMethodChannel` and `PdfDocumentPigeon` classes. - Updated `PdfxApi` to handle `readDocumentBytes` method calls. - Added `ReadBytesReply` class to handle responses from the `read.document.bytes` method. - Modified web platform implementation to support reading bytes from opened documents. - Enhanced Windows plugin to retrieve document bytes through the new method.
1 parent 5437732 commit 6309f0a

File tree

18 files changed

+1189
-824
lines changed

18 files changed

+1189
-824
lines changed

packages/pdfx/android/src/main/java/dev/flutter/pigeon/Pigeon.java

Lines changed: 334 additions & 245 deletions
Large diffs are not rendered by default.

packages/pdfx/android/src/main/kotlin/io/scer/pdfx/Messages.kt

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ class Messages(private val binding : FlutterPlugin.FlutterPluginBinding,
4747
) {
4848
val resultResponse = Pigeon.OpenReply()
4949
try {
50-
val documentRenderer = openDataDocument(message.data!!, message.password)
51-
val document = documents.register(documentRenderer)
50+
val data = message.data!!
51+
val documentRenderer = openDataDocument(data, message.password)
52+
val document = documents.register(documentRenderer, data)
5253
resultResponse.id = document.id
5354
resultResponse.pagesCount = document.pagesCount.toLong()
5455
result.success(resultResponse)
@@ -93,8 +94,12 @@ class Messages(private val binding : FlutterPlugin.FlutterPluginBinding,
9394
val resultResponse = Pigeon.OpenReply()
9495
try {
9596
val path = message.path
96-
val documentRenderer = openAssetDocument(path!!, message.password)
97-
val document = documents.register(documentRenderer)
97+
val fullAssetPath = binding.flutterAssets.getAssetFilePathByName(path!!)
98+
val inputStream = binding.applicationContext.assets.open(fullAssetPath)
99+
val data = inputStream.readBytes()
100+
inputStream.close()
101+
val documentRenderer = openAssetDocument(path, message.password)
102+
val document = documents.register(documentRenderer, data)
98103
resultResponse.id = document.id
99104
resultResponse.pagesCount = document.pagesCount.toLong()
100105
result.success(resultResponse)
@@ -124,6 +129,34 @@ class Messages(private val binding : FlutterPlugin.FlutterPluginBinding,
124129
}
125130
}
126131

132+
override fun readDocumentBytes(
133+
message: Pigeon.IdMessage,
134+
result: Pigeon.Result<Pigeon.ReadBytesReply>
135+
) {
136+
val resultResponse = Pigeon.ReadBytesReply()
137+
try {
138+
val id = message.id!!
139+
val document = documents.get(id)
140+
val data = document.data
141+
if (data != null) {
142+
resultResponse.data = data
143+
result.success(resultResponse)
144+
} else {
145+
result.error(PdfRendererException(
146+
"pdf_renderer",
147+
"Document data not available. readAsBytes is only supported for documents opened with openData or openAsset",
148+
null
149+
))
150+
}
151+
} catch (e: NullPointerException) {
152+
result.error(PdfRendererException("pdf_renderer", "Need call arguments: id!", null))
153+
} catch (e: RepositoryItemNotFoundException) {
154+
result.error(PdfRendererException("pdf_renderer", "Document not found", null))
155+
} catch (e: Exception) {
156+
result.error(PdfRendererException("pdf_renderer", "Unknown error", null))
157+
}
158+
}
159+
127160
override fun getPage(
128161
message: Pigeon.GetPageMessage,
129162
result: Pigeon.Result<Pigeon.GetPageReply>

packages/pdfx/android/src/main/kotlin/io/scer/pdfx/document/Document.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import android.os.ParcelFileDescriptor
99
class Document (
1010
val id: String,
1111
private val documentRenderer: PdfRenderer,
12-
private val fileDescriptor: ParcelFileDescriptor
12+
private val fileDescriptor: ParcelFileDescriptor,
13+
val data: ByteArray? = null
1314
) {
1415
val pagesCount: Int get() = documentRenderer.pageCount
1516

packages/pdfx/android/src/main/kotlin/io/scer/pdfx/resources/DocumentRepository.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ class DocumentRepository : Repository<Document>() {
1313
* Register document in repository
1414
* @returns document id
1515
*/
16-
fun register(getPair: Pair<ParcelFileDescriptor, PdfRenderer>?): Document {
16+
fun register(getPair: Pair<ParcelFileDescriptor, PdfRenderer>?, data: ByteArray? = null): Document {
1717
val id = randomID
1818
val (fileDescriptor, renderer) = getPair!!
19-
val document = Document(id, renderer, fileDescriptor)
19+
val document = Document(id, renderer, fileDescriptor, data)
2020
set(id, document)
2121
return document
2222
}

packages/pdfx/ios/Classes/Document.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ class Document {
22
let id: String
33
let renderer: CGPDFDocument
44
var pages: [CGPDFPage?]
5+
var data: Data?
56

6-
init(id: String, renderer: CGPDFDocument) {
7+
init(id: String, renderer: CGPDFDocument, data: Data? = nil) {
78
self.id = id
89
self.renderer = renderer
910
self.pages = Array<CGPDFPage?>(repeating: nil, count: renderer.numberOfPages)
11+
self.data = data
1012
}
1113

1214
var pagesCount: Int {

packages/pdfx/ios/Classes/Resources.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ class Repository<T> {
2626
}
2727

2828
class DocumentRepository : Repository<Document> {
29-
func register(renderer: CGPDFDocument) -> Document {
29+
func register(renderer: CGPDFDocument, data: Data? = nil) -> Document {
3030
let id = NSUUID().uuidString
31-
let page = Document(id: id, renderer: renderer)
31+
let page = Document(id: id, renderer: renderer, data: data)
3232
set(id: id, item: page)
3333
return page
3434
}

packages/pdfx/ios/Classes/SwiftPdfxPlugin.swift

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public class SwiftPdfxPlugin: NSObject, FlutterPlugin, PdfxApi {
4242
details: nil))
4343
}
4444

45-
let document = documents.register(renderer: renderer);
45+
let document = documents.register(renderer: renderer, data: data.data);
4646
let result = OpenReply.init()
4747
result.id = document.id
4848
result.pagesCount = NSNumber.init(value: document.pagesCount)
@@ -76,13 +76,30 @@ public class SwiftPdfxPlugin: NSObject, FlutterPlugin, PdfxApi {
7676
message: "Arguments not sended",
7777
details: nil))
7878
}
79-
guard let renderer = openAssetDocument(name: name, password: message.password) else {
79+
80+
#if os(iOS)
81+
guard let path = Bundle.main.path(forResource: "Frameworks/App.framework/flutter_assets/" + name, ofType: "") else {
82+
return completion(nil, FlutterError(code: "RENDER_ERROR",
83+
message: "Asset not found",
84+
details: nil))
85+
}
86+
#elseif os(macOS)
87+
let path = Bundle.main.bundlePath + "/Contents/Frameworks/App.framework/Resources/flutter_assets/" + name;
88+
#endif
89+
90+
guard let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else {
91+
return completion(nil, FlutterError(code: "RENDER_ERROR",
92+
message: "Failed to read asset data",
93+
details: nil))
94+
}
95+
96+
guard let renderer = openDataDocument(data: data, password: message.password) else {
8097
return completion(nil, FlutterError(code: "RENDER_ERROR",
8198
message: "Invalid PDF format",
8299
details: nil))
83100
}
84101

85-
let document = documents.register(renderer: renderer);
102+
let document = documents.register(renderer: renderer, data: data);
86103
let result = OpenReply.init()
87104
result.id = document.id
88105
result.pagesCount = NSNumber.init(value: document.pagesCount)
@@ -96,6 +113,31 @@ public class SwiftPdfxPlugin: NSObject, FlutterPlugin, PdfxApi {
96113
}
97114
}
98115

116+
public func readDocumentBytesMessage(_ message: IdMessage, completion: @escaping (ReadBytesReply?, FlutterError?) -> Void) {
117+
guard let id = message.id else {
118+
return completion(nil, FlutterError(code: "RENDER_ERROR",
119+
message: "Document ID not provided",
120+
details: nil))
121+
}
122+
123+
do {
124+
let document = try documents.get(id: id)
125+
guard let data = document.data else {
126+
return completion(nil, FlutterError(code: "RENDER_ERROR",
127+
message: "Document data not available. readAsBytes is only supported for documents opened with openData or openAsset",
128+
details: nil))
129+
}
130+
131+
let result = ReadBytesReply.init()
132+
result.data = FlutterStandardTypedData(bytes: data)
133+
completion(result, nil)
134+
} catch {
135+
return completion(nil, FlutterError(code: "RENDER_ERROR",
136+
message: "Document not found",
137+
details: nil))
138+
}
139+
}
140+
99141
public func getPageMessage(_ message: GetPageMessage, completion: @escaping (GetPageReply?, FlutterError?) -> Void) {
100142
do {
101143
let documentId = message.documentId

packages/pdfx/ios/Classes/messages.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Autogenerated from Pigeon (v4.2.0), do not edit directly.
1+
// Autogenerated from Pigeon (v4.2.14), do not edit directly.
22
// See also: https://pub.dev/packages/pigeon
33
#import <Foundation/Foundation.h>
44
@protocol FlutterBinaryMessenger;
@@ -20,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
2020
@class UpdateTextureMessage;
2121
@class ResizeTextureMessage;
2222
@class UnregisterTextureMessage;
23+
@class ReadBytesReply;
2324

2425
@interface OpenDataMessage : NSObject
2526
+ (instancetype)makeWithData:(nullable FlutterStandardTypedData *)data
@@ -157,7 +158,12 @@ NS_ASSUME_NONNULL_BEGIN
157158
@property(nonatomic, strong, nullable) NSNumber * id;
158159
@end
159160

160-
///The codec used by PdfxApi.
161+
@interface ReadBytesReply : NSObject
162+
+ (instancetype)makeWithData:(nullable FlutterStandardTypedData *)data;
163+
@property(nonatomic, strong, nullable) FlutterStandardTypedData * data;
164+
@end
165+
166+
/// The codec used by PdfxApi.
161167
NSObject<FlutterMessageCodec> *PdfxApiGetCodec(void);
162168

163169
/// Rebuild: `flutter pub run pigeon --input pigeons/message.dart`
@@ -171,6 +177,7 @@ NSObject<FlutterMessageCodec> *PdfxApiGetCodec(void);
171177
- (void)openDocumentFileMessage:(OpenPathMessage *)message completion:(void(^)(OpenReply *_Nullable, FlutterError *_Nullable))completion;
172178
- (void)openDocumentAssetMessage:(OpenPathMessage *)message completion:(void(^)(OpenReply *_Nullable, FlutterError *_Nullable))completion;
173179
- (void)closeDocumentMessage:(IdMessage *)message error:(FlutterError *_Nullable *_Nonnull)error;
180+
- (void)readDocumentBytesMessage:(IdMessage *)message completion:(void(^)(ReadBytesReply *_Nullable, FlutterError *_Nullable))completion;
174181
- (void)getPageMessage:(GetPageMessage *)message completion:(void(^)(GetPageReply *_Nullable, FlutterError *_Nullable))completion;
175182
- (void)renderPageMessage:(RenderPageMessage *)message completion:(void(^)(RenderPageReply *_Nullable, FlutterError *_Nullable))completion;
176183
- (void)closePageMessage:(IdMessage *)message error:(FlutterError *_Nullable *_Nonnull)error;

0 commit comments

Comments
 (0)