David PHAM-VAN

Generalize PdfObject

... ... @@ -17,24 +17,15 @@
import 'data_types.dart';
import 'document.dart';
import 'object.dart';
import 'stream.dart';
/// An array object
class PdfArrayObject extends PdfObject {
class PdfArrayObject extends PdfObject<PdfArray> {
/// Creates an array object
PdfArrayObject(
PdfDocument pdfDocument,
this.array,
) : super(pdfDocument);
PdfArray array,
) : super(pdfDocument, params: array);
/// The array
final PdfArray array;
@override
void writeContent(PdfStream os) {
super.writeContent(os);
array.output(os);
os.putBytes(<int>[0x0a]);
}
PdfArray get array => params;
}
... ...
... ... @@ -17,7 +17,7 @@
import 'annotation.dart';
import 'data_types.dart';
import 'document.dart';
import 'object.dart';
import 'object_dict.dart';
/// Border style
enum PdfBorderStyle {
... ... @@ -40,7 +40,7 @@ enum PdfBorderStyle {
}
/// Defines a border object
class PdfBorder extends PdfObject {
class PdfBorder extends PdfObjectDict {
/// Creates a border using the predefined styles in [PdfAnnot].
PdfBorder(
PdfDocument pdfDocument,
... ...
... ... @@ -18,7 +18,6 @@ import 'annotation.dart';
import 'data_types.dart';
import 'document.dart';
import 'names.dart';
import 'object.dart';
import 'object_dict.dart';
import 'outline.dart';
import 'page_list.dart';
... ...
... ... @@ -18,9 +18,10 @@ import 'dart:typed_data';
import 'document.dart';
import 'object.dart';
import 'object_dict.dart';
/// Encryption object
abstract class PdfEncryption extends PdfObject {
abstract class PdfEncryption extends PdfObjectDict {
/// Creates an encryption object
PdfEncryption(PdfDocument pdfDocument) : super(pdfDocument);
... ...
... ... @@ -15,7 +15,6 @@
*/
import 'data_types.dart';
import 'object.dart';
import 'object_dict.dart';
import 'object_stream.dart';
import 'ttffont.dart';
... ...
... ... @@ -17,10 +17,10 @@
import 'color.dart';
import 'data_types.dart';
import 'document.dart';
import 'object.dart';
import 'object_dict.dart';
import 'object_stream.dart';
abstract class PdfBaseFunction extends PdfObject {
abstract class PdfBaseFunction extends PdfObjectDict {
PdfBaseFunction(PdfDocument pdfDocument) : super(pdfDocument);
factory PdfBaseFunction.colorsAndStops(
... ...
... ... @@ -21,7 +21,7 @@ import 'package:meta/meta.dart';
import 'data_types.dart';
import 'document.dart';
import 'function.dart';
import 'object.dart';
import 'object_dict.dart';
import 'smask.dart';
enum PdfBlendMode {
... ... @@ -159,7 +159,7 @@ class PdfGraphicState {
}
/// Stores all the graphic states used in the document
class PdfGraphicStates extends PdfObject {
class PdfGraphicStates extends PdfObjectDict {
/// Create a new Graphic States object
PdfGraphicStates(PdfDocument pdfDocument) : super(pdfDocument);
... ...
... ... @@ -18,13 +18,13 @@ import 'data_types.dart';
import 'document.dart';
import 'font.dart';
import 'graphic_state.dart';
import 'object.dart';
import 'object_dict.dart';
import 'pattern.dart';
import 'shading.dart';
import 'xobject.dart';
/// Helper functions for graphic objects
mixin PdfGraphicStream on PdfObject {
mixin PdfGraphicStream on PdfObjectDict {
/// Isolated transparency: If this flag is true, objects within the group
/// shall be composited against a fully transparent initial backdrop;
/// if false, they shall be composited against the group’s backdrop
... ...
... ... @@ -16,10 +16,10 @@
import 'data_types.dart';
import 'document.dart';
import 'object.dart';
import 'object_dict.dart';
/// Information object
class PdfInfo extends PdfObject {
class PdfInfo extends PdfObjectDict {
/// Create an information object
PdfInfo(PdfDocument pdfDocument,
{this.title,
... ...
... ... @@ -16,11 +16,11 @@
import 'data_types.dart';
import 'document.dart';
import 'object.dart';
import 'object_dict.dart';
import 'page.dart';
/// Pdf Name object
class PdfNames extends PdfObject {
class PdfNames extends PdfObjectDict {
/// This constructs a Pdf Name object
PdfNames(PdfDocument pdfDocument) : super(pdfDocument);
... ...
... ... @@ -21,12 +21,12 @@ import 'document.dart';
import 'stream.dart';
/// Base Object used in the PDF file
class PdfObject {
abstract class PdfObject<T extends PdfDataType> {
/// This is usually called by extensors to this class, and sets the
/// Pdf Object Type
PdfObject(
this.pdfDocument, {
// String? type,
required this.params,
this.objgen = 0,
int? objser,
}) : objser = objser ?? pdfDocument.genSerial() {
... ... @@ -34,7 +34,7 @@ class PdfObject {
}
/// This is the object parameters.
final PdfDict params = PdfDict();
final T params;
/// This is the unique serial number for this object.
final int objser;
... ... @@ -64,10 +64,8 @@ class PdfObject {
}
void writeContent(PdfStream os) {
if (params.isNotEmpty) {
params.output(os);
os.putString('\n');
}
os.putByte(0x0a);
}
/// The write method should call this after writing anything to the
... ...
... ... @@ -17,9 +17,10 @@
import 'data_types.dart';
import 'document.dart';
import 'object.dart';
import 'stream.dart';
/// Object with a PdfDict used in the PDF file
class PdfObjectDict extends PdfObject {
class PdfObjectDict extends PdfObject<PdfDict> {
/// This is usually called by extensors to this class, and sets the
/// Pdf Object Type
PdfObjectDict(
... ... @@ -27,15 +28,17 @@ class PdfObjectDict extends PdfObject {
String? type,
int objgen = 0,
int? objser,
}) : super(pdfDocument, objgen: objgen, objser: objser) {
}) : super(pdfDocument, params: PdfDict(), objgen: objgen, objser: objser) {
if (type != null) {
params['/Type'] = PdfName(type);
}
}
/// This is the object parameters.
final PdfDict params = PdfDict();
@override
String toString() => '$runtimeType $params';
void writeContent(PdfStream os) {
if (params.isNotEmpty) {
params.output(os);
os.putByte(0x0a);
}
}
}
... ...
... ... @@ -14,9 +14,6 @@
* limitations under the License.
*/
import 'dart:typed_data';
import 'ascii85.dart';
import 'data_types.dart';
import 'document.dart';
import 'object_dict.dart';
... ... @@ -37,47 +34,13 @@ class PdfObjectStream extends PdfObjectDict {
/// defines if the stream needs to be converted to ascii85
final bool isBinary;
Uint8List? _data;
@override
void prepare() {
super.prepare();
if (params.containsKey('/Filter') && _data == null) {
// The data is already in the right format
_data = buf.output();
} else if (pdfDocument.deflate != null) {
final original = buf.output();
final newData = Uint8List.fromList(pdfDocument.deflate!(original));
if (newData.lengthInBytes < original.lengthInBytes) {
params['/Filter'] = const PdfName('/FlateDecode');
_data = newData;
}
}
if (_data == null) {
if (isBinary) {
// This is an Ascii85 stream
final e = Ascii85Encoder();
_data = e.convert(buf.output());
params['/Filter'] = const PdfName('/ASCII85Decode');
} else {
// This is a non-deflated stream
_data = buf.output();
}
}
if (pdfDocument.encryption != null) {
_data = pdfDocument.encryption!.encrypt(_data!, this);
}
params['/Length'] = PdfNum(_data!.length);
}
@override
void writeContent(PdfStream os) {
super.writeContent(os);
os.putString('stream\n');
os.putBytes(_data!);
os.putString('\nendstream\n');
PdfDictStream(
object: this,
isBinary: isBinary,
values: params.values,
data: buf.output(),
).output(os);
}
}
... ...
... ... @@ -17,7 +17,7 @@
import 'color.dart';
import 'data_types.dart';
import 'document.dart';
import 'object.dart';
import 'object_dict.dart';
import 'page.dart';
import 'rect.dart';
... ... @@ -46,7 +46,7 @@ enum PdfOutlineStyle {
}
/// Pdf Outline object
class PdfOutline extends PdfObject {
class PdfOutline extends PdfObjectDict {
/// Constructs a Pdf Outline object.
/// When selected, the specified region is displayed.
PdfOutline(
... ...
... ... @@ -19,10 +19,10 @@ import 'package:vector_math/vector_math_64.dart';
import 'data_types.dart';
import 'document.dart';
import 'graphic_state.dart';
import 'object.dart';
import 'object_dict.dart';
import 'shading.dart';
abstract class PdfPattern extends PdfObject {
abstract class PdfPattern extends PdfObjectDict {
PdfPattern(PdfDocument pdfDocument, this.patternType, this.matrix)
: super(pdfDocument);
... ...
... ... @@ -17,13 +17,13 @@
import 'data_types.dart';
import 'document.dart';
import 'function.dart';
import 'object.dart';
import 'object_dict.dart';
import 'point.dart';
import 'rect.dart';
enum PdfShadingType { axial, radial }
class PdfShading extends PdfObject {
class PdfShading extends PdfObjectDict {
PdfShading(
PdfDocument pdfDocument, {
required this.shadingType,
... ...