Showing
37 changed files
with
481 additions
and
232 deletions
| @@ -9,24 +9,24 @@ environment: | @@ -9,24 +9,24 @@ environment: | ||
| 9 | dependencies: | 9 | dependencies: |
| 10 | flutter: | 10 | flutter: |
| 11 | sdk: flutter | 11 | sdk: flutter |
| 12 | - printing: | ||
| 13 | - path_provider: | 12 | + intl: |
| 14 | open_file: | 13 | open_file: |
| 14 | + path_provider: | ||
| 15 | + printing: | ||
| 15 | url_launcher: | 16 | url_launcher: |
| 16 | - intl: | ||
| 17 | 17 | ||
| 18 | dev_dependencies: | 18 | dev_dependencies: |
| 19 | - flutter_test: | ||
| 20 | - sdk: flutter | ||
| 21 | flutter_driver: | 19 | flutter_driver: |
| 22 | sdk: flutter | 20 | sdk: flutter |
| 21 | + flutter_test: | ||
| 22 | + sdk: flutter | ||
| 23 | test: | 23 | test: |
| 24 | 24 | ||
| 25 | dependency_overrides: | 25 | dependency_overrides: |
| 26 | - printing: | ||
| 27 | - path: ../printing | ||
| 28 | pdf: | 26 | pdf: |
| 29 | path: ../pdf | 27 | path: ../pdf |
| 28 | + printing: | ||
| 29 | + path: ../printing | ||
| 30 | 30 | ||
| 31 | flutter: | 31 | flutter: |
| 32 | uses-material-design: true | 32 | uses-material-design: true |
| @@ -18,4 +18,5 @@ import 'package:archive/archive.dart'; | @@ -18,4 +18,5 @@ import 'package:archive/archive.dart'; | ||
| 18 | 18 | ||
| 19 | import 'package:pdf/pdf.dart'; | 19 | import 'package:pdf/pdf.dart'; |
| 20 | 20 | ||
| 21 | +/// Zip compression function | ||
| 21 | DeflateCallback defaultDeflate = ZLibEncoder().encode; | 22 | DeflateCallback defaultDeflate = ZLibEncoder().encode; |
| @@ -30,8 +30,6 @@ class PdfAnnot extends PdfObject { | @@ -30,8 +30,6 @@ class PdfAnnot extends PdfObject { | ||
| 30 | final PdfPage pdfPage; | 30 | final PdfPage pdfPage; |
| 31 | 31 | ||
| 32 | /// Output the annotation | 32 | /// Output the annotation |
| 33 | - /// | ||
| 34 | - /// @param os OutputStream to send the object to | ||
| 35 | @override | 33 | @override |
| 36 | void _prepare() { | 34 | void _prepare() { |
| 37 | super._prepare(); | 35 | super._prepare(); |
| @@ -20,6 +20,7 @@ | @@ -20,6 +20,7 @@ | ||
| 20 | 20 | ||
| 21 | part of pdf; | 21 | part of pdf; |
| 22 | 22 | ||
| 23 | +/// Arabic shape substitutions functions | ||
| 23 | class PdfArabic { | 24 | class PdfArabic { |
| 24 | /// Arabic shape substitutions: char code => (isolated, final, initial, medial). | 25 | /// Arabic shape substitutions: char code => (isolated, final, initial, medial). |
| 25 | /// Arabic Substition A | 26 | /// Arabic Substition A |
| @@ -398,6 +399,7 @@ class PdfArabic { | @@ -398,6 +399,7 @@ class PdfArabic { | ||
| 398 | } | 399 | } |
| 399 | } | 400 | } |
| 400 | 401 | ||
| 402 | + /// Apply Arabic shape substitutions | ||
| 401 | static String convert(String input) { | 403 | static String convert(String input) { |
| 402 | return List<String>.from(_parse(input)).join(''); | 404 | return List<String>.from(_parse(input)).join(''); |
| 403 | } | 405 | } |
| @@ -16,13 +16,16 @@ | @@ -16,13 +16,16 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// An array object | ||
| 19 | class PdfArrayObject extends PdfObject { | 20 | class PdfArrayObject extends PdfObject { |
| 21 | + /// Creates an array object | ||
| 20 | PdfArrayObject( | 22 | PdfArrayObject( |
| 21 | PdfDocument pdfDocument, | 23 | PdfDocument pdfDocument, |
| 22 | this.array, | 24 | this.array, |
| 23 | ) : assert(array != null), | 25 | ) : assert(array != null), |
| 24 | super(pdfDocument); | 26 | super(pdfDocument); |
| 25 | 27 | ||
| 28 | + /// The array | ||
| 26 | final PdfArray array; | 29 | final PdfArray array; |
| 27 | 30 | ||
| 28 | @override | 31 | @override |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Ascii 85 encoder | ||
| 19 | class Ascii85Encoder extends Converter<Uint8List, Uint8List> { | 20 | class Ascii85Encoder extends Converter<Uint8List, Uint8List> { |
| 20 | @override | 21 | @override |
| 21 | Uint8List convert(Uint8List input) { | 22 | Uint8List convert(Uint8List input) { |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Border style | ||
| 19 | enum PdfBorderStyle { | 20 | enum PdfBorderStyle { |
| 20 | /// Solid border. The border is drawn as a solid line. | 21 | /// Solid border. The border is drawn as a solid line. |
| 21 | solid, | 22 | solid, |
| @@ -35,15 +36,9 @@ enum PdfBorderStyle { | @@ -35,15 +36,9 @@ enum PdfBorderStyle { | ||
| 35 | underlined | 36 | underlined |
| 36 | } | 37 | } |
| 37 | 38 | ||
| 39 | +/// Defines a border object | ||
| 38 | class PdfBorder extends PdfObject { | 40 | class PdfBorder extends PdfObject { |
| 39 | /// Creates a border using the predefined styles in [PdfAnnot]. | 41 | /// Creates a border using the predefined styles in [PdfAnnot]. |
| 40 | - /// Note: Do not use [PdfAnnot.dashed] with this method. | ||
| 41 | - /// Use the other constructor. | ||
| 42 | - /// | ||
| 43 | - /// @param width The width of the border | ||
| 44 | - /// @param style The style of the border | ||
| 45 | - /// @param dash The line pattern definition | ||
| 46 | - /// @see [PdfAnnot] | ||
| 47 | PdfBorder( | 42 | PdfBorder( |
| 48 | PdfDocument pdfDocument, | 43 | PdfDocument pdfDocument, |
| 49 | this.width, { | 44 | this.width, { |
| @@ -62,7 +57,6 @@ class PdfBorder extends PdfObject { | @@ -62,7 +57,6 @@ class PdfBorder extends PdfObject { | ||
| 62 | /// This array allows the definition of a dotted line for the border | 57 | /// This array allows the definition of a dotted line for the border |
| 63 | final List<double> dash; | 58 | final List<double> dash; |
| 64 | 59 | ||
| 65 | - /// @param os OutputStream to send the object to | ||
| 66 | @override | 60 | @override |
| 67 | void _prepare() { | 61 | void _prepare() { |
| 68 | super._prepare(); | 62 | super._prepare(); |
| @@ -16,12 +16,9 @@ | @@ -16,12 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Pdf Catalog object | ||
| 19 | class PdfCatalog extends PdfObject { | 20 | class PdfCatalog extends PdfObject { |
| 20 | /// This constructs a Pdf Catalog object | 21 | /// This constructs a Pdf Catalog object |
| 21 | - /// | ||
| 22 | - /// @param pdfPageList The [PdfPageList] object that's the root of the documents page tree | ||
| 23 | - /// @param pagemode How the document should appear when opened. | ||
| 24 | - /// Allowed values are usenone, useoutlines, usethumbs or fullscreen. | ||
| 25 | PdfCatalog( | 22 | PdfCatalog( |
| 26 | PdfDocument pdfDocument, | 23 | PdfDocument pdfDocument, |
| 27 | this.pdfPageList, | 24 | this.pdfPageList, |
| @@ -44,7 +41,6 @@ class PdfCatalog extends PdfObject { | @@ -44,7 +41,6 @@ class PdfCatalog extends PdfObject { | ||
| 44 | /// The initial page mode | 41 | /// The initial page mode |
| 45 | final PdfNames names; | 42 | final PdfNames names; |
| 46 | 43 | ||
| 47 | - /// @param os OutputStream to send the object to | ||
| 48 | @override | 44 | @override |
| 49 | void _prepare() { | 45 | void _prepare() { |
| 50 | super._prepare(); | 46 | super._prepare(); |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Represents an RGB color | ||
| 19 | class PdfColor { | 20 | class PdfColor { |
| 20 | /// Create a color with red, green, blue and alpha components | 21 | /// Create a color with red, green, blue and alpha components |
| 21 | /// values between 0 and 1 | 22 | /// values between 0 and 1 |
| @@ -69,6 +70,7 @@ class PdfColor { | @@ -69,6 +70,7 @@ class PdfColor { | ||
| 69 | return PdfColor(red, green, blue, alpha); | 70 | return PdfColor(red, green, blue, alpha); |
| 70 | } | 71 | } |
| 71 | 72 | ||
| 73 | + /// Load an RGB color from a RYB color | ||
| 72 | factory PdfColor.fromRYB(double red, double yellow, double blue, | 74 | factory PdfColor.fromRYB(double red, double yellow, double blue, |
| 73 | [double alpha = 1.0]) { | 75 | [double alpha = 1.0]) { |
| 74 | assert(red >= 0 && red <= 1); | 76 | assert(red >= 0 && red <= 1); |
| @@ -128,11 +130,19 @@ class PdfColor { | @@ -128,11 +130,19 @@ class PdfColor { | ||
| 128 | return PdfColor(redValue, greenValue, blueValue, alpha); | 130 | return PdfColor(redValue, greenValue, blueValue, alpha); |
| 129 | } | 131 | } |
| 130 | 132 | ||
| 133 | + /// Opacity | ||
| 131 | final double alpha; | 134 | final double alpha; |
| 135 | + | ||
| 136 | + /// Red component | ||
| 132 | final double red; | 137 | final double red; |
| 138 | + | ||
| 139 | + /// Green component | ||
| 133 | final double green; | 140 | final double green; |
| 141 | + | ||
| 142 | + /// Blue component | ||
| 134 | final double blue; | 143 | final double blue; |
| 135 | 144 | ||
| 145 | + /// Get the int32 representation of this color | ||
| 136 | int toInt() => | 146 | int toInt() => |
| 137 | ((((alpha * 255.0).round() & 0xff) << 24) | | 147 | ((((alpha * 255.0).round() & 0xff) << 24) | |
| 138 | (((red * 255.0).round() & 0xff) << 16) | | 148 | (((red * 255.0).round() & 0xff) << 16) | |
| @@ -140,6 +150,7 @@ class PdfColor { | @@ -140,6 +150,7 @@ class PdfColor { | ||
| 140 | (((blue * 255.0).round() & 0xff) << 0)) & | 150 | (((blue * 255.0).round() & 0xff) << 0)) & |
| 141 | 0xFFFFFFFF; | 151 | 0xFFFFFFFF; |
| 142 | 152 | ||
| 153 | + /// Get an Hexadecimal representation of this color | ||
| 143 | String toHex() { | 154 | String toHex() { |
| 144 | final i = toInt(); | 155 | final i = toInt(); |
| 145 | final rgb = (i & 0xffffff).toRadixString(16); | 156 | final rgb = (i & 0xffffff).toRadixString(16); |
| @@ -147,14 +158,17 @@ class PdfColor { | @@ -147,14 +158,17 @@ class PdfColor { | ||
| 147 | return '#$rgb$a'; | 158 | return '#$rgb$a'; |
| 148 | } | 159 | } |
| 149 | 160 | ||
| 161 | + /// Convert this color to CMYK | ||
| 150 | PdfColorCmyk toCmyk() { | 162 | PdfColorCmyk toCmyk() { |
| 151 | return PdfColorCmyk.fromRgb(red, green, blue, alpha); | 163 | return PdfColorCmyk.fromRgb(red, green, blue, alpha); |
| 152 | } | 164 | } |
| 153 | 165 | ||
| 166 | + /// Convert this color to HSV | ||
| 154 | PdfColorHsv toHsv() { | 167 | PdfColorHsv toHsv() { |
| 155 | return PdfColorHsv.fromRgb(red, green, blue, alpha); | 168 | return PdfColorHsv.fromRgb(red, green, blue, alpha); |
| 156 | } | 169 | } |
| 157 | 170 | ||
| 171 | + /// Convert this color to HSL | ||
| 158 | PdfColorHsl toHsl() { | 172 | PdfColorHsl toHsl() { |
| 159 | return PdfColorHsl.fromRgb(red, green, blue, alpha); | 173 | return PdfColorHsl.fromRgb(red, green, blue, alpha); |
| 160 | } | 174 | } |
| @@ -166,6 +180,7 @@ class PdfColor { | @@ -166,6 +180,7 @@ class PdfColor { | ||
| 166 | return math.pow((component + 0.055) / 1.055, 2.4); | 180 | return math.pow((component + 0.055) / 1.055, 2.4); |
| 167 | } | 181 | } |
| 168 | 182 | ||
| 183 | + /// Get the luminance | ||
| 169 | double get luminance { | 184 | double get luminance { |
| 170 | final R = _linearizeColorComponent(red); | 185 | final R = _linearizeColorComponent(red); |
| 171 | final G = _linearizeColorComponent(green); | 186 | final G = _linearizeColorComponent(green); |
| @@ -191,24 +206,31 @@ class PdfColor { | @@ -191,24 +206,31 @@ class PdfColor { | ||
| 191 | /// Get some similar colors | 206 | /// Get some similar colors |
| 192 | List<PdfColor> get monochromatic => toHsv().monochromatic; | 207 | List<PdfColor> get monochromatic => toHsv().monochromatic; |
| 193 | 208 | ||
| 209 | + /// Returns a list of complementary colors | ||
| 194 | List<PdfColor> get splitcomplementary => toHsv().splitcomplementary; | 210 | List<PdfColor> get splitcomplementary => toHsv().splitcomplementary; |
| 195 | 211 | ||
| 212 | + /// Returns a list of tetradic colors | ||
| 196 | List<PdfColor> get tetradic => toHsv().tetradic; | 213 | List<PdfColor> get tetradic => toHsv().tetradic; |
| 197 | 214 | ||
| 215 | + /// Returns a list of triadic colors | ||
| 198 | List<PdfColor> get triadic => toHsv().triadic; | 216 | List<PdfColor> get triadic => toHsv().triadic; |
| 199 | 217 | ||
| 218 | + /// Returns a list of analagous colors | ||
| 200 | List<PdfColor> get analagous => toHsv().analagous; | 219 | List<PdfColor> get analagous => toHsv().analagous; |
| 201 | 220 | ||
| 202 | @override | 221 | @override |
| 203 | String toString() => '$runtimeType($red, $green, $blue, $alpha)'; | 222 | String toString() => '$runtimeType($red, $green, $blue, $alpha)'; |
| 204 | } | 223 | } |
| 205 | 224 | ||
| 225 | +/// Represents an CMYK color | ||
| 206 | class PdfColorCmyk extends PdfColor { | 226 | class PdfColorCmyk extends PdfColor { |
| 227 | + /// Creates a CMYK color | ||
| 207 | const PdfColorCmyk(this.cyan, this.magenta, this.yellow, this.black, | 228 | const PdfColorCmyk(this.cyan, this.magenta, this.yellow, this.black, |
| 208 | [double a = 1.0]) | 229 | [double a = 1.0]) |
| 209 | : super((1.0 - cyan) * (1.0 - black), (1.0 - magenta) * (1.0 - black), | 230 | : super((1.0 - cyan) * (1.0 - black), (1.0 - magenta) * (1.0 - black), |
| 210 | (1.0 - yellow) * (1.0 - black), a); | 231 | (1.0 - yellow) * (1.0 - black), a); |
| 211 | 232 | ||
| 233 | + /// Create a CMYK color from red ,green and blue components | ||
| 212 | const PdfColorCmyk.fromRgb(double r, double g, double b, [double a = 1.0]) | 234 | const PdfColorCmyk.fromRgb(double r, double g, double b, [double a = 1.0]) |
| 213 | : black = 1.0 - r > g | 235 | : black = 1.0 - r > g |
| 214 | ? r | 236 | ? r |
| @@ -270,9 +292,16 @@ class PdfColorCmyk extends PdfColor { | @@ -270,9 +292,16 @@ class PdfColorCmyk extends PdfColor { | ||
| 270 | : b)), | 292 | : b)), |
| 271 | super(r, g, b, a); | 293 | super(r, g, b, a); |
| 272 | 294 | ||
| 295 | + /// Cyan component | ||
| 273 | final double cyan; | 296 | final double cyan; |
| 297 | + | ||
| 298 | + /// Magenta component | ||
| 274 | final double magenta; | 299 | final double magenta; |
| 300 | + | ||
| 301 | + /// Yellow component | ||
| 275 | final double yellow; | 302 | final double yellow; |
| 303 | + | ||
| 304 | + /// Black component | ||
| 276 | final double black; | 305 | final double black; |
| 277 | 306 | ||
| 278 | @override | 307 | @override |
| @@ -306,6 +335,7 @@ double _getHue( | @@ -306,6 +335,7 @@ double _getHue( | ||
| 306 | /// starting at the red primary at 0°, passing through the green primary | 335 | /// starting at the red primary at 0°, passing through the green primary |
| 307 | /// at 120° and the blue primary at 240°, and then wrapping back to red at 360° | 336 | /// at 120° and the blue primary at 240°, and then wrapping back to red at 360° |
| 308 | class PdfColorHsv extends PdfColor { | 337 | class PdfColorHsv extends PdfColor { |
| 338 | + /// Creates an HSV color | ||
| 309 | factory PdfColorHsv(double hue, double saturation, double value, | 339 | factory PdfColorHsv(double hue, double saturation, double value, |
| 310 | [double alpha = 1.0]) { | 340 | [double alpha = 1.0]) { |
| 311 | final chroma = saturation * value; | 341 | final chroma = saturation * value; |
| @@ -352,6 +382,7 @@ class PdfColorHsv extends PdfColor { | @@ -352,6 +382,7 @@ class PdfColorHsv extends PdfColor { | ||
| 352 | assert(value >= 0 && value <= 1), | 382 | assert(value >= 0 && value <= 1), |
| 353 | super(red, green, blue, alpha); | 383 | super(red, green, blue, alpha); |
| 354 | 384 | ||
| 385 | + /// Creates an HSV color from red, green, blue components | ||
| 355 | factory PdfColorHsv.fromRgb(double red, double green, double blue, | 386 | factory PdfColorHsv.fromRgb(double red, double green, double blue, |
| 356 | [double alpha = 1.0]) { | 387 | [double alpha = 1.0]) { |
| 357 | final max = math.max(red, math.max(green, blue)); | 388 | final max = math.max(red, math.max(green, blue)); |
| @@ -433,7 +464,9 @@ class PdfColorHsv extends PdfColor { | @@ -433,7 +464,9 @@ class PdfColorHsv extends PdfColor { | ||
| 433 | String toString() => '$runtimeType($hue, $saturation, $value, $alpha)'; | 464 | String toString() => '$runtimeType($hue, $saturation, $value, $alpha)'; |
| 434 | } | 465 | } |
| 435 | 466 | ||
| 467 | +/// Represents an HSL color | ||
| 436 | class PdfColorHsl extends PdfColor { | 468 | class PdfColorHsl extends PdfColor { |
| 469 | + /// Creates an HSL color | ||
| 437 | factory PdfColorHsl(double hue, double saturation, double lightness, | 470 | factory PdfColorHsl(double hue, double saturation, double lightness, |
| 438 | [double alpha = 1.0]) { | 471 | [double alpha = 1.0]) { |
| 439 | final chroma = (1.0 - (2.0 * lightness - 1.0).abs()) * saturation; | 472 | final chroma = (1.0 - (2.0 * lightness - 1.0).abs()) * saturation; |
| @@ -485,6 +518,7 @@ class PdfColorHsl extends PdfColor { | @@ -485,6 +518,7 @@ class PdfColorHsl extends PdfColor { | ||
| 485 | assert(lightness >= 0 && lightness <= 1), | 518 | assert(lightness >= 0 && lightness <= 1), |
| 486 | super(red, green, blue, alpha); | 519 | super(red, green, blue, alpha); |
| 487 | 520 | ||
| 521 | + /// Creates an HSL color from red, green, and blue components | ||
| 488 | factory PdfColorHsl.fromRgb(double red, double green, double blue, | 522 | factory PdfColorHsl.fromRgb(double red, double green, double blue, |
| 489 | [double alpha = 1.0]) { | 523 | [double alpha = 1.0]) { |
| 490 | final max = math.max(red, math.max(green, blue)); | 524 | final max = math.max(red, math.max(green, blue)); |
| @@ -500,8 +534,13 @@ class PdfColorHsl extends PdfColor { | @@ -500,8 +534,13 @@ class PdfColorHsl extends PdfColor { | ||
| 500 | return PdfColorHsl._(hue, saturation, lightness, alpha, red, green, blue); | 534 | return PdfColorHsl._(hue, saturation, lightness, alpha, red, green, blue); |
| 501 | } | 535 | } |
| 502 | 536 | ||
| 537 | + /// Hue component | ||
| 503 | final double hue; | 538 | final double hue; |
| 539 | + | ||
| 540 | + /// Saturation component | ||
| 504 | final double saturation; | 541 | final double saturation; |
| 542 | + | ||
| 543 | + /// Lightness component | ||
| 505 | final double lightness; | 544 | final double lightness; |
| 506 | 545 | ||
| 507 | @override | 546 | @override |
| @@ -14,8 +14,11 @@ | @@ -14,8 +14,11 @@ | ||
| 14 | * limitations under the License. | 14 | * limitations under the License. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | +// ignore_for_file: public_member_api_docs | ||
| 18 | + | ||
| 17 | part of pdf; | 19 | part of pdf; |
| 18 | 20 | ||
| 21 | +/// Material design colors | ||
| 19 | class PdfColors { | 22 | class PdfColors { |
| 20 | PdfColors._(); | 23 | PdfColors._(); |
| 21 | 24 | ||
| @@ -393,6 +396,7 @@ class PdfColors { | @@ -393,6 +396,7 @@ class PdfColors { | ||
| 393 | deepOrangeAccent, | 396 | deepOrangeAccent, |
| 394 | ]; | 397 | ]; |
| 395 | 398 | ||
| 399 | + /// Get a pseudo-random color | ||
| 396 | static PdfColor getColor(int index) { | 400 | static PdfColor getColor(int index) { |
| 397 | final hue = index * 137.508; | 401 | final hue = index * 137.508; |
| 398 | final PdfColor color = PdfColorHsv(hue % 360, 1, 1); | 402 | final PdfColor color = PdfColorHsv(hue % 360, 1, 1); |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Display hint for the PDF viewer | ||
| 19 | enum PdfPageMode { | 20 | enum PdfPageMode { |
| 20 | /// This page mode indicates that the document | 21 | /// This page mode indicates that the document |
| 21 | /// should be opened just with the page visible. This is the default | 22 | /// should be opened just with the page visible. This is the default |
| @@ -35,6 +36,7 @@ enum PdfPageMode { | @@ -35,6 +36,7 @@ enum PdfPageMode { | ||
| 35 | fullscreen | 36 | fullscreen |
| 36 | } | 37 | } |
| 37 | 38 | ||
| 39 | +/// Callback used to compress the data | ||
| 38 | typedef DeflateCallback = List<int> Function(List<int> data); | 40 | typedef DeflateCallback = List<int> Function(List<int> data); |
| 39 | 41 | ||
| 40 | /// This class is the base of the Pdf generator. A [PdfDocument] class is | 42 | /// This class is the base of the Pdf generator. A [PdfDocument] class is |
| @@ -44,8 +46,6 @@ typedef DeflateCallback = List<int> Function(List<int> data); | @@ -44,8 +46,6 @@ typedef DeflateCallback = List<int> Function(List<int> data); | ||
| 44 | /// document's internal structures are kept in sync. | 46 | /// document's internal structures are kept in sync. |
| 45 | class PdfDocument { | 47 | class PdfDocument { |
| 46 | /// This creates a Pdf document | 48 | /// This creates a Pdf document |
| 47 | - /// @param pagemode an int, determines how the document will present itself to | ||
| 48 | - /// the viewer when it first opens. | ||
| 49 | PdfDocument({ | 49 | PdfDocument({ |
| 50 | PdfPageMode pageMode = PdfPageMode.none, | 50 | PdfPageMode pageMode = PdfPageMode.none, |
| 51 | DeflateCallback deflate, | 51 | DeflateCallback deflate, |
| @@ -113,8 +113,9 @@ class PdfDocument { | @@ -113,8 +113,9 @@ class PdfDocument { | ||
| 113 | /// This holds the current fonts | 113 | /// This holds the current fonts |
| 114 | final Set<PdfFont> fonts = <PdfFont>{}; | 114 | final Set<PdfFont> fonts = <PdfFont>{}; |
| 115 | 115 | ||
| 116 | - /// Generates the document ID | ||
| 117 | Uint8List _documentID; | 116 | Uint8List _documentID; |
| 117 | + | ||
| 118 | + /// Generates the document ID | ||
| 118 | Uint8List get documentID { | 119 | Uint8List get documentID { |
| 119 | if (_documentID == null) { | 120 | if (_documentID == null) { |
| 120 | final rnd = math.Random(); | 121 | final rnd = math.Random(); |
| @@ -132,16 +133,11 @@ class PdfDocument { | @@ -132,16 +133,11 @@ class PdfDocument { | ||
| 132 | 133 | ||
| 133 | /// This returns a specific page. It's used mainly when using a | 134 | /// This returns a specific page. It's used mainly when using a |
| 134 | /// Serialized template file. | 135 | /// Serialized template file. |
| 135 | - /// | ||
| 136 | - /// ?? How does a serialized template file work ??? | ||
| 137 | - /// | ||
| 138 | - /// @param page page number to return | ||
| 139 | - /// @return [PdfPage] at that position | ||
| 140 | PdfPage page(int page) { | 136 | PdfPage page(int page) { |
| 141 | return pdfPageList.getPage(page); | 137 | return pdfPageList.getPage(page); |
| 142 | } | 138 | } |
| 143 | 139 | ||
| 144 | - /// @return the root outline | 140 | + /// The root outline |
| 145 | PdfOutline get outline { | 141 | PdfOutline get outline { |
| 146 | if (_outline == null) { | 142 | if (_outline == null) { |
| 147 | _outline = PdfOutline(this); | 143 | _outline = PdfOutline(this); |
| @@ -156,19 +152,10 @@ class PdfDocument { | @@ -156,19 +152,10 @@ class PdfDocument { | ||
| 156 | return _graphicStates; | 152 | return _graphicStates; |
| 157 | } | 153 | } |
| 158 | 154 | ||
| 155 | + /// This document has at least one graphic state | ||
| 159 | bool get hasGraphicStates => _graphicStates != null; | 156 | bool get hasGraphicStates => _graphicStates != null; |
| 160 | 157 | ||
| 161 | /// This writes the document to an OutputStream. | 158 | /// This writes the document to an OutputStream. |
| 162 | - /// | ||
| 163 | - /// Note: You can call this as many times as you wish, as long as | ||
| 164 | - /// the calls are not running at the same time. | ||
| 165 | - /// | ||
| 166 | - /// Also, objects can be added or amended between these calls. | ||
| 167 | - /// | ||
| 168 | - /// Also, the OutputStream is not closed, but will be flushed on | ||
| 169 | - /// completion. It is up to the caller to close the stream. | ||
| 170 | - /// | ||
| 171 | - /// @param os OutputStream to write the document to | ||
| 172 | void _write(PdfStream os) { | 159 | void _write(PdfStream os) { |
| 173 | final pos = PdfOutput(os); | 160 | final pos = PdfOutput(os); |
| 174 | 161 | ||
| @@ -180,6 +167,7 @@ class PdfDocument { | @@ -180,6 +167,7 @@ class PdfDocument { | ||
| 180 | pos.close(); | 167 | pos.close(); |
| 181 | } | 168 | } |
| 182 | 169 | ||
| 170 | + /// Generate the PDF document as a memory file | ||
| 183 | Uint8List save() { | 171 | Uint8List save() { |
| 184 | final os = PdfStream(); | 172 | final os = PdfStream(); |
| 185 | _write(os); | 173 | _write(os); |
| @@ -16,8 +16,11 @@ | @@ -16,8 +16,11 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Encryption object | ||
| 19 | abstract class PdfEncryption extends PdfObject { | 20 | abstract class PdfEncryption extends PdfObject { |
| 21 | + /// Creates an encryption object | ||
| 20 | PdfEncryption(PdfDocument pdfDocument) : super(pdfDocument, null); | 22 | PdfEncryption(PdfDocument pdfDocument) : super(pdfDocument, null); |
| 21 | 23 | ||
| 24 | + /// Encrypt some data | ||
| 22 | Uint8List encrypt(Uint8List input, PdfObject object); | 25 | Uint8List encrypt(Uint8List input, PdfObject object); |
| 23 | } | 26 | } |
| @@ -16,7 +16,9 @@ | @@ -16,7 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Jpeg metadata extraction | ||
| 19 | class PdfJpegInfo { | 20 | class PdfJpegInfo { |
| 21 | + /// Load a Jpeg image's metadata | ||
| 20 | factory PdfJpegInfo(Uint8List image) { | 22 | factory PdfJpegInfo(Uint8List image) { |
| 21 | assert(image != null); | 23 | assert(image != null); |
| 22 | 24 | ||
| @@ -73,14 +75,18 @@ class PdfJpegInfo { | @@ -73,14 +75,18 @@ class PdfJpegInfo { | ||
| 73 | 75 | ||
| 74 | PdfJpegInfo._(this.width, this.height, this._color, this.tags); | 76 | PdfJpegInfo._(this.width, this.height, this._color, this.tags); |
| 75 | 77 | ||
| 78 | + /// Width of the image | ||
| 76 | final int width; | 79 | final int width; |
| 77 | 80 | ||
| 81 | + /// Height of the image | ||
| 78 | final int height; | 82 | final int height; |
| 79 | 83 | ||
| 80 | final int _color; | 84 | final int _color; |
| 81 | 85 | ||
| 86 | + /// Is the image color or greyscale | ||
| 82 | bool get isRGB => _color == 3; | 87 | bool get isRGB => _color == 3; |
| 83 | 88 | ||
| 89 | + /// Exif tags discovered | ||
| 84 | final Map<PdfExifTag, dynamic> tags; | 90 | final Map<PdfExifTag, dynamic> tags; |
| 85 | 91 | ||
| 86 | /// EXIF version | 92 | /// EXIF version |
| @@ -94,6 +100,7 @@ class PdfJpegInfo { | @@ -94,6 +100,7 @@ class PdfJpegInfo { | ||
| 94 | ? null | 100 | ? null |
| 95 | : utf8.decode(tags[PdfExifTag.FlashpixVersion]); | 101 | : utf8.decode(tags[PdfExifTag.FlashpixVersion]); |
| 96 | 102 | ||
| 103 | + /// Rotation angle of this image | ||
| 97 | PdfImageOrientation get orientation { | 104 | PdfImageOrientation get orientation { |
| 98 | if (tags == null || tags[PdfExifTag.Orientation] == null) { | 105 | if (tags == null || tags[PdfExifTag.Orientation] == null) { |
| 99 | return PdfImageOrientation.topLeft; | 106 | return PdfImageOrientation.topLeft; |
| @@ -106,21 +113,25 @@ class PdfJpegInfo { | @@ -106,21 +113,25 @@ class PdfJpegInfo { | ||
| 106 | } | 113 | } |
| 107 | } | 114 | } |
| 108 | 115 | ||
| 116 | + /// Exif horizontal resolution | ||
| 109 | double get xResolution => tags == null || tags[PdfExifTag.XResolution] == null | 117 | double get xResolution => tags == null || tags[PdfExifTag.XResolution] == null |
| 110 | ? null | 118 | ? null |
| 111 | : tags[PdfExifTag.XResolution][0].toDouble() / | 119 | : tags[PdfExifTag.XResolution][0].toDouble() / |
| 112 | tags[PdfExifTag.XResolution][1].toDouble(); | 120 | tags[PdfExifTag.XResolution][1].toDouble(); |
| 113 | 121 | ||
| 122 | + /// Exif vertical resolution | ||
| 114 | double get yResolution => tags == null || tags[PdfExifTag.YResolution] == null | 123 | double get yResolution => tags == null || tags[PdfExifTag.YResolution] == null |
| 115 | ? null | 124 | ? null |
| 116 | : tags[PdfExifTag.YResolution][0].toDouble() / | 125 | : tags[PdfExifTag.YResolution][0].toDouble() / |
| 117 | tags[PdfExifTag.YResolution][1].toDouble(); | 126 | tags[PdfExifTag.YResolution][1].toDouble(); |
| 118 | 127 | ||
| 128 | + /// Exif horizontal pixel dimension | ||
| 119 | int get pixelXDimension => | 129 | int get pixelXDimension => |
| 120 | tags == null || tags[PdfExifTag.PixelXDimension] == null | 130 | tags == null || tags[PdfExifTag.PixelXDimension] == null |
| 121 | ? width | 131 | ? width |
| 122 | : tags[PdfExifTag.PixelXDimension]; | 132 | : tags[PdfExifTag.PixelXDimension]; |
| 123 | 133 | ||
| 134 | + /// Exif vertical pixel dimension | ||
| 124 | int get pixelYDimension => | 135 | int get pixelYDimension => |
| 125 | tags == null || tags[PdfExifTag.PixelYDimension] == null | 136 | tags == null || tags[PdfExifTag.PixelYDimension] == null |
| 126 | ? height | 137 | ? height |
| @@ -440,111 +451,280 @@ orientation: $orientation'''; | @@ -440,111 +451,280 @@ orientation: $orientation'''; | ||
| 440 | }; | 451 | }; |
| 441 | } | 452 | } |
| 442 | 453 | ||
| 454 | +/// Possible Exif tags | ||
| 443 | enum PdfExifTag { | 455 | enum PdfExifTag { |
| 444 | // version tags | 456 | // version tags |
| 445 | - ExifVersion, // EXIF version | ||
| 446 | - FlashpixVersion, // Flashpix format version | 457 | + /// EXIF version |
| 458 | + ExifVersion, | ||
| 459 | + | ||
| 460 | + /// Flashpix format version | ||
| 461 | + FlashpixVersion, | ||
| 447 | 462 | ||
| 448 | // colorspace tags | 463 | // colorspace tags |
| 449 | - ColorSpace, // Color space information tag | 464 | + /// Color space information tag |
| 465 | + ColorSpace, | ||
| 450 | 466 | ||
| 451 | // image configuration | 467 | // image configuration |
| 452 | - PixelXDimension, // Valid width of meaningful image | ||
| 453 | - PixelYDimension, // Valid height of meaningful image | ||
| 454 | - ComponentsConfiguration, // Information about channels | ||
| 455 | - CompressedBitsPerPixel, // Compressed bits per pixel | 468 | + /// Valid width of meaningful image |
| 469 | + PixelXDimension, | ||
| 470 | + | ||
| 471 | + /// Valid height of meaningful image | ||
| 472 | + PixelYDimension, | ||
| 473 | + | ||
| 474 | + /// Information about channels | ||
| 475 | + ComponentsConfiguration, | ||
| 476 | + | ||
| 477 | + /// Compressed bits per pixel | ||
| 478 | + CompressedBitsPerPixel, | ||
| 456 | 479 | ||
| 457 | // user information | 480 | // user information |
| 458 | - MakerNote, // Any desired information written by the manufacturer | ||
| 459 | - UserComment, // Comments by user | 481 | + /// Any desired information written by the manufacturer |
| 482 | + MakerNote, | ||
| 483 | + | ||
| 484 | + /// Comments by user | ||
| 485 | + UserComment, | ||
| 460 | 486 | ||
| 461 | // related file | 487 | // related file |
| 462 | - RelatedSoundFile, // Name of related sound file | 488 | + /// Name of related sound file |
| 489 | + RelatedSoundFile, | ||
| 463 | 490 | ||
| 464 | // date and time | 491 | // date and time |
| 465 | - DateTimeOriginal, // Date and time when the original image was generated | ||
| 466 | - DateTimeDigitized, // Date and time when the image was stored digitally | ||
| 467 | - SubsecTime, // Fractions of seconds for DateTime | ||
| 468 | - SubsecTimeOriginal, // Fractions of seconds for DateTimeOriginal | ||
| 469 | - SubsecTimeDigitized, // Fractions of seconds for DateTimeDigitized | 492 | + /// Date and time when the original image was generated |
| 493 | + DateTimeOriginal, | ||
| 494 | + | ||
| 495 | + /// Date and time when the image was stored digitally | ||
| 496 | + DateTimeDigitized, | ||
| 497 | + | ||
| 498 | + /// Fractions of seconds for DateTime | ||
| 499 | + SubsecTime, | ||
| 500 | + | ||
| 501 | + /// Fractions of seconds for DateTimeOriginal | ||
| 502 | + SubsecTimeOriginal, | ||
| 503 | + | ||
| 504 | + /// Fractions of seconds for DateTimeDigitized | ||
| 505 | + SubsecTimeDigitized, | ||
| 470 | 506 | ||
| 471 | // picture-taking conditions | 507 | // picture-taking conditions |
| 472 | - ExposureTime, // Exposure time (in seconds) | ||
| 473 | - FNumber, // F number | ||
| 474 | - ExposureProgram, // Exposure program | ||
| 475 | - SpectralSensitivity, // Spectral sensitivity | ||
| 476 | - ISOSpeedRatings, // ISO speed rating | ||
| 477 | - OECF, // Optoelectric conversion factor | ||
| 478 | - ShutterSpeedValue, // Shutter speed | ||
| 479 | - ApertureValue, // Lens aperture | ||
| 480 | - BrightnessValue, // Value of brightness | ||
| 481 | - ExposureBias, // Exposure bias | ||
| 482 | - MaxApertureValue, // Smallest F number of lens | ||
| 483 | - SubjectDistance, // Distance to subject in meters | ||
| 484 | - MeteringMode, // Metering mode | ||
| 485 | - LightSource, // Kind of light source | ||
| 486 | - Flash, // Flash status | ||
| 487 | - SubjectArea, // Location and area of main subject | ||
| 488 | - FocalLength, // Focal length of the lens in mm | ||
| 489 | - FlashEnergy, // Strobe energy in BCPS | ||
| 490 | - SpatialFrequencyResponse, // | ||
| 491 | - FocalPlaneXResolution, // Number of pixels in width direction per FocalPlaneResolutionUnit | ||
| 492 | - FocalPlaneYResolution, // Number of pixels in height direction per FocalPlaneResolutionUnit | ||
| 493 | - FocalPlaneResolutionUnit, // Unit for measuring FocalPlaneXResolution and FocalPlaneYResolution | ||
| 494 | - SubjectLocation, // Location of subject in image | ||
| 495 | - ExposureIndex, // Exposure index selected on camera | ||
| 496 | - SensingMethod, // Image sensor type | ||
| 497 | - FileSource, // Image source (3 == DSC) | ||
| 498 | - SceneType, // Scene type (1 == directly photographed) | ||
| 499 | - CFAPattern, // Color filter array geometric pattern | ||
| 500 | - CustomRendered, // Special processing | ||
| 501 | - ExposureMode, // Exposure mode | ||
| 502 | - WhiteBalance, // 1 = auto white balance, 2 = manual | ||
| 503 | - DigitalZoomRation, // Digital zoom ratio | ||
| 504 | - FocalLengthIn35mmFilm, // Equivalent foacl length assuming 35mm film camera (in mm) | ||
| 505 | - SceneCaptureType, // Type of scene | ||
| 506 | - GainControl, // Degree of overall image gain adjustment | ||
| 507 | - Contrast, // Direction of contrast processing applied by camera | ||
| 508 | - Saturation, // Direction of saturation processing applied by camera | ||
| 509 | - Sharpness, // Direction of sharpness processing applied by camera | ||
| 510 | - DeviceSettingDescription, // | ||
| 511 | - SubjectDistanceRange, // Distance to subject | 508 | + /// Exposure time (in seconds) |
| 509 | + ExposureTime, | ||
| 510 | + | ||
| 511 | + /// F number | ||
| 512 | + FNumber, | ||
| 513 | + | ||
| 514 | + /// Exposure program | ||
| 515 | + ExposureProgram, | ||
| 516 | + | ||
| 517 | + /// Spectral sensitivity | ||
| 518 | + SpectralSensitivity, | ||
| 519 | + | ||
| 520 | + /// ISO speed rating | ||
| 521 | + ISOSpeedRatings, | ||
| 522 | + | ||
| 523 | + /// Optoelectric conversion factor | ||
| 524 | + OECF, | ||
| 525 | + | ||
| 526 | + /// Shutter speed | ||
| 527 | + ShutterSpeedValue, | ||
| 528 | + | ||
| 529 | + /// Lens aperture | ||
| 530 | + ApertureValue, | ||
| 531 | + | ||
| 532 | + /// Value of brightness | ||
| 533 | + BrightnessValue, | ||
| 534 | + | ||
| 535 | + /// Exposure bias | ||
| 536 | + ExposureBias, | ||
| 537 | + | ||
| 538 | + /// Smallest F number of lens | ||
| 539 | + MaxApertureValue, | ||
| 540 | + | ||
| 541 | + /// Distance to subject in meters | ||
| 542 | + SubjectDistance, | ||
| 543 | + | ||
| 544 | + /// Metering mode | ||
| 545 | + MeteringMode, | ||
| 546 | + | ||
| 547 | + /// Kind of light source | ||
| 548 | + LightSource, | ||
| 549 | + | ||
| 550 | + /// Flash status | ||
| 551 | + Flash, | ||
| 552 | + | ||
| 553 | + /// Location and area of main subject | ||
| 554 | + SubjectArea, | ||
| 555 | + | ||
| 556 | + /// Focal length of the lens in mm | ||
| 557 | + FocalLength, | ||
| 558 | + | ||
| 559 | + /// Strobe energy in BCPS | ||
| 560 | + FlashEnergy, | ||
| 561 | + | ||
| 562 | + /// Spatial Frequency Response | ||
| 563 | + SpatialFrequencyResponse, | ||
| 564 | + | ||
| 565 | + /// Number of pixels in width direction per FocalPlaneResolutionUnit | ||
| 566 | + FocalPlaneXResolution, | ||
| 567 | + | ||
| 568 | + /// Number of pixels in height direction per FocalPlaneResolutionUnit | ||
| 569 | + FocalPlaneYResolution, | ||
| 570 | + | ||
| 571 | + /// Unit for measuring FocalPlaneXResolution and FocalPlaneYResolution | ||
| 572 | + FocalPlaneResolutionUnit, | ||
| 573 | + | ||
| 574 | + /// Location of subject in image | ||
| 575 | + SubjectLocation, | ||
| 576 | + | ||
| 577 | + /// Exposure index selected on camera | ||
| 578 | + ExposureIndex, | ||
| 579 | + | ||
| 580 | + /// Image sensor type | ||
| 581 | + SensingMethod, | ||
| 582 | + | ||
| 583 | + /// Image source (3 == DSC) | ||
| 584 | + FileSource, | ||
| 585 | + | ||
| 586 | + /// Scene type (1 == directly photographed) | ||
| 587 | + SceneType, | ||
| 588 | + | ||
| 589 | + /// Color filter array geometric pattern | ||
| 590 | + CFAPattern, | ||
| 591 | + | ||
| 592 | + /// Special processing | ||
| 593 | + CustomRendered, | ||
| 594 | + | ||
| 595 | + /// Exposure mode | ||
| 596 | + ExposureMode, | ||
| 597 | + | ||
| 598 | + /// 1 = auto white balance, 2 = manual | ||
| 599 | + WhiteBalance, | ||
| 600 | + | ||
| 601 | + /// Digital zoom ratio | ||
| 602 | + DigitalZoomRation, | ||
| 603 | + | ||
| 604 | + /// Equivalent foacl length assuming 35mm film camera (in mm) | ||
| 605 | + FocalLengthIn35mmFilm, | ||
| 606 | + | ||
| 607 | + /// Type of scene | ||
| 608 | + SceneCaptureType, | ||
| 609 | + | ||
| 610 | + /// Degree of overall image gain adjustment | ||
| 611 | + GainControl, | ||
| 612 | + | ||
| 613 | + /// Direction of contrast processing applied by camera | ||
| 614 | + Contrast, | ||
| 615 | + | ||
| 616 | + /// Direction of saturation processing applied by camera | ||
| 617 | + Saturation, | ||
| 618 | + | ||
| 619 | + /// Direction of sharpness processing applied by camera | ||
| 620 | + Sharpness, | ||
| 621 | + | ||
| 622 | + /// Device Setting Description | ||
| 623 | + DeviceSettingDescription, | ||
| 624 | + | ||
| 625 | + /// Distance to subject | ||
| 626 | + SubjectDistanceRange, | ||
| 512 | 627 | ||
| 513 | // other tags | 628 | // other tags |
| 629 | + /// Interoperability IFD Pointer | ||
| 514 | InteroperabilityIFDPointer, | 630 | InteroperabilityIFDPointer, |
| 515 | - ImageUniqueID, // Identifier assigned uniquely to each image | 631 | + //// Identifier assigned uniquely to each image |
| 632 | + ImageUniqueID, | ||
| 516 | 633 | ||
| 517 | // tiff Tags | 634 | // tiff Tags |
| 635 | + /// ImageWidth | ||
| 518 | ImageWidth, | 636 | ImageWidth, |
| 637 | + | ||
| 638 | + /// ImageHeight | ||
| 519 | ImageHeight, | 639 | ImageHeight, |
| 640 | + | ||
| 641 | + /// ExifIFDPointer | ||
| 520 | ExifIFDPointer, | 642 | ExifIFDPointer, |
| 643 | + | ||
| 644 | + /// GPSInfoIFDPointer | ||
| 521 | GPSInfoIFDPointer, | 645 | GPSInfoIFDPointer, |
| 646 | + | ||
| 647 | + /// BitsPerSample | ||
| 522 | BitsPerSample, | 648 | BitsPerSample, |
| 649 | + | ||
| 650 | + /// Compression | ||
| 523 | Compression, | 651 | Compression, |
| 652 | + | ||
| 653 | + /// PhotometricInterpretation | ||
| 524 | PhotometricInterpretation, | 654 | PhotometricInterpretation, |
| 655 | + | ||
| 656 | + /// Orientation | ||
| 525 | Orientation, | 657 | Orientation, |
| 658 | + | ||
| 659 | + /// SamplesPerPixel | ||
| 526 | SamplesPerPixel, | 660 | SamplesPerPixel, |
| 661 | + | ||
| 662 | + /// PlanarConfiguration | ||
| 527 | PlanarConfiguration, | 663 | PlanarConfiguration, |
| 664 | + | ||
| 665 | + /// YCbCrSubSampling | ||
| 528 | YCbCrSubSampling, | 666 | YCbCrSubSampling, |
| 667 | + | ||
| 668 | + /// YCbCrPositioning | ||
| 529 | YCbCrPositioning, | 669 | YCbCrPositioning, |
| 670 | + | ||
| 671 | + /// XResolution | ||
| 530 | XResolution, | 672 | XResolution, |
| 673 | + | ||
| 674 | + /// YResolution | ||
| 531 | YResolution, | 675 | YResolution, |
| 676 | + | ||
| 677 | + /// ResolutionUnit | ||
| 532 | ResolutionUnit, | 678 | ResolutionUnit, |
| 679 | + | ||
| 680 | + /// StripOffsets | ||
| 533 | StripOffsets, | 681 | StripOffsets, |
| 682 | + | ||
| 683 | + /// RowsPerStrip | ||
| 534 | RowsPerStrip, | 684 | RowsPerStrip, |
| 685 | + | ||
| 686 | + /// StripByteCounts | ||
| 535 | StripByteCounts, | 687 | StripByteCounts, |
| 688 | + | ||
| 689 | + /// JPEGInterchangeFormat | ||
| 536 | JPEGInterchangeFormat, | 690 | JPEGInterchangeFormat, |
| 691 | + | ||
| 692 | + /// JPEGInterchangeFormatLength | ||
| 537 | JPEGInterchangeFormatLength, | 693 | JPEGInterchangeFormatLength, |
| 694 | + | ||
| 695 | + /// TransferFunction | ||
| 538 | TransferFunction, | 696 | TransferFunction, |
| 697 | + | ||
| 698 | + /// WhitePoint | ||
| 539 | WhitePoint, | 699 | WhitePoint, |
| 700 | + | ||
| 701 | + /// PrimaryChromaticities | ||
| 540 | PrimaryChromaticities, | 702 | PrimaryChromaticities, |
| 703 | + | ||
| 704 | + /// YCbCrCoefficients | ||
| 541 | YCbCrCoefficients, | 705 | YCbCrCoefficients, |
| 706 | + | ||
| 707 | + /// ReferenceBlackWhite | ||
| 542 | ReferenceBlackWhite, | 708 | ReferenceBlackWhite, |
| 709 | + | ||
| 710 | + /// DateTime | ||
| 543 | DateTime, | 711 | DateTime, |
| 712 | + | ||
| 713 | + /// ImageDescription | ||
| 544 | ImageDescription, | 714 | ImageDescription, |
| 715 | + | ||
| 716 | + /// Make | ||
| 545 | Make, | 717 | Make, |
| 718 | + | ||
| 719 | + /// Model | ||
| 546 | Model, | 720 | Model, |
| 721 | + | ||
| 722 | + /// Software | ||
| 547 | Software, | 723 | Software, |
| 724 | + | ||
| 725 | + /// Artist | ||
| 548 | Artist, | 726 | Artist, |
| 727 | + | ||
| 728 | + /// Copyright | ||
| 549 | Copyright, | 729 | Copyright, |
| 550 | } | 730 | } |
| @@ -16,84 +16,96 @@ | @@ -16,84 +16,96 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Pdf font object | ||
| 19 | abstract class PdfFont extends PdfObject { | 20 | abstract class PdfFont extends PdfObject { |
| 20 | /// Constructs a [PdfFont]. This will attempt to map the font from a known | 21 | /// Constructs a [PdfFont]. This will attempt to map the font from a known |
| 21 | /// font name to that in Pdf, defaulting to Helvetica if not possible. | 22 | /// font name to that in Pdf, defaulting to Helvetica if not possible. |
| 22 | - /// | ||
| 23 | - /// @param name The document name, ie /F1 | ||
| 24 | - /// @param subtype The pdf type, ie /Type1 | ||
| 25 | - /// @param baseFont The font name, ie /Helvetica | ||
| 26 | PdfFont._create(PdfDocument pdfDocument, {@required this.subtype}) | 23 | PdfFont._create(PdfDocument pdfDocument, {@required this.subtype}) |
| 27 | : assert(subtype != null), | 24 | : assert(subtype != null), |
| 28 | super(pdfDocument, '/Font') { | 25 | super(pdfDocument, '/Font') { |
| 29 | pdfDocument.fonts.add(this); | 26 | pdfDocument.fonts.add(this); |
| 30 | } | 27 | } |
| 31 | 28 | ||
| 29 | + /// Monospaced slab serif typeface. | ||
| 32 | factory PdfFont.courier(PdfDocument pdfDocument) { | 30 | factory PdfFont.courier(PdfDocument pdfDocument) { |
| 33 | return PdfType1Font._create( | 31 | return PdfType1Font._create( |
| 34 | pdfDocument, 'Courier', 0.910, -0.220, const <double>[]); | 32 | pdfDocument, 'Courier', 0.910, -0.220, const <double>[]); |
| 35 | } | 33 | } |
| 36 | 34 | ||
| 35 | + /// Bold monospaced slab serif typeface. | ||
| 37 | factory PdfFont.courierBold(PdfDocument pdfDocument) { | 36 | factory PdfFont.courierBold(PdfDocument pdfDocument) { |
| 38 | return PdfType1Font._create( | 37 | return PdfType1Font._create( |
| 39 | pdfDocument, 'Courier-Bold', 0.910, -0.220, const <double>[]); | 38 | pdfDocument, 'Courier-Bold', 0.910, -0.220, const <double>[]); |
| 40 | } | 39 | } |
| 41 | 40 | ||
| 41 | + /// Bold and Italic monospaced slab serif typeface. | ||
| 42 | factory PdfFont.courierBoldOblique(PdfDocument pdfDocument) { | 42 | factory PdfFont.courierBoldOblique(PdfDocument pdfDocument) { |
| 43 | return PdfType1Font._create( | 43 | return PdfType1Font._create( |
| 44 | pdfDocument, 'Courier-BoldOblique', 0.910, -0.220, const <double>[]); | 44 | pdfDocument, 'Courier-BoldOblique', 0.910, -0.220, const <double>[]); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | + /// Italic monospaced slab serif typeface. | ||
| 47 | factory PdfFont.courierOblique(PdfDocument pdfDocument) { | 48 | factory PdfFont.courierOblique(PdfDocument pdfDocument) { |
| 48 | return PdfType1Font._create( | 49 | return PdfType1Font._create( |
| 49 | pdfDocument, 'Courier-Oblique', 0.910, -0.220, const <double>[]); | 50 | pdfDocument, 'Courier-Oblique', 0.910, -0.220, const <double>[]); |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 53 | + /// Neo-grotesque design sans-serif typeface | ||
| 52 | factory PdfFont.helvetica(PdfDocument pdfDocument) { | 54 | factory PdfFont.helvetica(PdfDocument pdfDocument) { |
| 53 | return PdfType1Font._create( | 55 | return PdfType1Font._create( |
| 54 | pdfDocument, 'Helvetica', 0.931, -0.225, _helveticaWidths); | 56 | pdfDocument, 'Helvetica', 0.931, -0.225, _helveticaWidths); |
| 55 | } | 57 | } |
| 56 | 58 | ||
| 59 | + /// Bold Neo-grotesque design sans-serif typeface | ||
| 57 | factory PdfFont.helveticaBold(PdfDocument pdfDocument) { | 60 | factory PdfFont.helveticaBold(PdfDocument pdfDocument) { |
| 58 | return PdfType1Font._create( | 61 | return PdfType1Font._create( |
| 59 | pdfDocument, 'Helvetica-Bold', 0.962, -0.228, _helveticaBoldWidths); | 62 | pdfDocument, 'Helvetica-Bold', 0.962, -0.228, _helveticaBoldWidths); |
| 60 | } | 63 | } |
| 61 | 64 | ||
| 65 | + /// Bold and Italic Neo-grotesque design sans-serif typeface | ||
| 62 | factory PdfFont.helveticaBoldOblique(PdfDocument pdfDocument) { | 66 | factory PdfFont.helveticaBoldOblique(PdfDocument pdfDocument) { |
| 63 | return PdfType1Font._create(pdfDocument, 'Helvetica-BoldOblique', 0.962, | 67 | return PdfType1Font._create(pdfDocument, 'Helvetica-BoldOblique', 0.962, |
| 64 | -0.228, _helveticaBoldObliqueWidths); | 68 | -0.228, _helveticaBoldObliqueWidths); |
| 65 | } | 69 | } |
| 66 | 70 | ||
| 71 | + /// Italic Neo-grotesque design sans-serif typeface | ||
| 67 | factory PdfFont.helveticaOblique(PdfDocument pdfDocument) { | 72 | factory PdfFont.helveticaOblique(PdfDocument pdfDocument) { |
| 68 | return PdfType1Font._create(pdfDocument, 'Helvetica-Oblique', 0.931, -0.225, | 73 | return PdfType1Font._create(pdfDocument, 'Helvetica-Oblique', 0.931, -0.225, |
| 69 | _helveticaObliqueWidths); | 74 | _helveticaObliqueWidths); |
| 70 | } | 75 | } |
| 71 | 76 | ||
| 77 | + /// Serif typeface commissioned by the British newspaper The Times | ||
| 72 | factory PdfFont.times(PdfDocument pdfDocument) { | 78 | factory PdfFont.times(PdfDocument pdfDocument) { |
| 73 | return PdfType1Font._create( | 79 | return PdfType1Font._create( |
| 74 | pdfDocument, 'Times-Roman', 0.898, -0.218, _timesWidths); | 80 | pdfDocument, 'Times-Roman', 0.898, -0.218, _timesWidths); |
| 75 | } | 81 | } |
| 76 | 82 | ||
| 83 | + /// Bold serif typeface commissioned by the British newspaper The Times | ||
| 77 | factory PdfFont.timesBold(PdfDocument pdfDocument) { | 84 | factory PdfFont.timesBold(PdfDocument pdfDocument) { |
| 78 | return PdfType1Font._create( | 85 | return PdfType1Font._create( |
| 79 | pdfDocument, 'Times-Bold', 0.935, -0.218, _timesBoldWidths); | 86 | pdfDocument, 'Times-Bold', 0.935, -0.218, _timesBoldWidths); |
| 80 | } | 87 | } |
| 81 | 88 | ||
| 89 | + /// Bold and Italic serif typeface commissioned by the British newspaper The Times | ||
| 82 | factory PdfFont.timesBoldItalic(PdfDocument pdfDocument) { | 90 | factory PdfFont.timesBoldItalic(PdfDocument pdfDocument) { |
| 83 | return PdfType1Font._create( | 91 | return PdfType1Font._create( |
| 84 | pdfDocument, 'Times-BoldItalic', 0.921, -0.218, _timesBoldItalicWidths); | 92 | pdfDocument, 'Times-BoldItalic', 0.921, -0.218, _timesBoldItalicWidths); |
| 85 | } | 93 | } |
| 86 | 94 | ||
| 95 | + /// Italic serif typeface commissioned by the British newspaper The Times | ||
| 87 | factory PdfFont.timesItalic(PdfDocument pdfDocument) { | 96 | factory PdfFont.timesItalic(PdfDocument pdfDocument) { |
| 88 | return PdfType1Font._create( | 97 | return PdfType1Font._create( |
| 89 | pdfDocument, 'Times-Italic', 0.883, -0.217, _timesItalicWidths); | 98 | pdfDocument, 'Times-Italic', 0.883, -0.217, _timesItalicWidths); |
| 90 | } | 99 | } |
| 91 | 100 | ||
| 101 | + /// Complete unaccented serif Greek alphabet (upper and lower case) and a | ||
| 102 | + /// selection of commonly used mathematical symbols. | ||
| 92 | factory PdfFont.symbol(PdfDocument pdfDocument) { | 103 | factory PdfFont.symbol(PdfDocument pdfDocument) { |
| 93 | return PdfType1Font._create( | 104 | return PdfType1Font._create( |
| 94 | pdfDocument, 'Symbol', 1.010, -0.293, _symbolWidths); | 105 | pdfDocument, 'Symbol', 1.010, -0.293, _symbolWidths); |
| 95 | } | 106 | } |
| 96 | 107 | ||
| 108 | + /// Hermann Zapf ornament glyphs or spacers, often employed to create box frames | ||
| 97 | factory PdfFont.zapfDingbats(PdfDocument pdfDocument) { | 109 | factory PdfFont.zapfDingbats(PdfDocument pdfDocument) { |
| 98 | return PdfType1Font._create( | 110 | return PdfType1Font._create( |
| 99 | pdfDocument, 'ZapfDingbats', 0.820, -0.143, _zapfDingbatsWidths); | 111 | pdfDocument, 'ZapfDingbats', 0.820, -0.143, _zapfDingbatsWidths); |
| @@ -110,17 +122,22 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | @@ -110,17 +122,22 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | ||
| 110 | /// The df type of the font, usually /Type1 | 122 | /// The df type of the font, usually /Type1 |
| 111 | final String subtype; | 123 | final String subtype; |
| 112 | 124 | ||
| 125 | + /// Internal name | ||
| 113 | String get name => '/F$objser'; | 126 | String get name => '/F$objser'; |
| 114 | 127 | ||
| 128 | + /// The font's real name | ||
| 115 | String get fontName => null; | 129 | String get fontName => null; |
| 116 | 130 | ||
| 131 | + /// Spans the distance between the baseline and the top of the glyph that | ||
| 132 | + /// reaches farthest from the baseline | ||
| 117 | double get ascent => null; | 133 | double get ascent => null; |
| 118 | 134 | ||
| 135 | + /// Spans the distance between the baseline and the lowest descending glyph | ||
| 119 | double get descent => null; | 136 | double get descent => null; |
| 120 | 137 | ||
| 138 | + /// Default width of a glyph | ||
| 121 | static const double defaultGlyphWidth = 0.600; | 139 | static const double defaultGlyphWidth = 0.600; |
| 122 | 140 | ||
| 123 | - /// @param os OutputStream to send the object to | ||
| 124 | @override | 141 | @override |
| 125 | void _prepare() { | 142 | void _prepare() { |
| 126 | super._prepare(); | 143 | super._prepare(); |
| @@ -130,14 +147,18 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | @@ -130,14 +147,18 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | ||
| 130 | params['/Encoding'] = const PdfName('/WinAnsiEncoding'); | 147 | params['/Encoding'] = const PdfName('/WinAnsiEncoding'); |
| 131 | } | 148 | } |
| 132 | 149 | ||
| 150 | + /// How many units to move for the next glyph | ||
| 133 | @Deprecated('Use `glyphMetrics` instead') | 151 | @Deprecated('Use `glyphMetrics` instead') |
| 134 | double glyphAdvance(int charCode) => glyphMetrics(charCode).advanceWidth; | 152 | double glyphAdvance(int charCode) => glyphMetrics(charCode).advanceWidth; |
| 135 | 153 | ||
| 154 | + /// Calculate the [PdfFontMetrics] for this glyph | ||
| 136 | PdfFontMetrics glyphMetrics(int charCode); | 155 | PdfFontMetrics glyphMetrics(int charCode); |
| 137 | 156 | ||
| 157 | + /// Calculate the dimensions of this glyph | ||
| 138 | @Deprecated('Use `glyphMetrics` instead') | 158 | @Deprecated('Use `glyphMetrics` instead') |
| 139 | PdfRect glyphBounds(int charCode) => glyphMetrics(charCode).toPdfRect(); | 159 | PdfRect glyphBounds(int charCode) => glyphMetrics(charCode).toPdfRect(); |
| 140 | 160 | ||
| 161 | + /// Calculate the [PdfFontMetrics] for this string | ||
| 141 | PdfFontMetrics stringMetrics(String s, {double letterSpacing = 0}) { | 162 | PdfFontMetrics stringMetrics(String s, {double letterSpacing = 0}) { |
| 142 | if (s.isEmpty) { | 163 | if (s.isEmpty) { |
| 143 | return PdfFontMetrics.zero; | 164 | return PdfFontMetrics.zero; |
| @@ -157,9 +178,11 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | @@ -157,9 +178,11 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | ||
| 157 | } | 178 | } |
| 158 | } | 179 | } |
| 159 | 180 | ||
| 181 | + /// Calculage the bounding box for this string | ||
| 160 | @Deprecated('Use `stringMetrics` instead') | 182 | @Deprecated('Use `stringMetrics` instead') |
| 161 | PdfRect stringBounds(String s) => stringMetrics(s).toPdfRect(); | 183 | PdfRect stringBounds(String s) => stringMetrics(s).toPdfRect(); |
| 162 | 184 | ||
| 185 | + /// Calculage the unit size of this string | ||
| 163 | PdfPoint stringSize(String s) { | 186 | PdfPoint stringSize(String s) { |
| 164 | final metrics = stringMetrics(s); | 187 | final metrics = stringMetrics(s); |
| 165 | return PdfPoint(metrics.width, metrics.height); | 188 | return PdfPoint(metrics.width, metrics.height); |
| @@ -168,6 +191,7 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | @@ -168,6 +191,7 @@ See https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | ||
| 168 | @override | 191 | @override |
| 169 | String toString() => 'Font($fontName)'; | 192 | String toString() => 'Font($fontName)'; |
| 170 | 193 | ||
| 194 | + /// Draw some text | ||
| 171 | void putText(PdfStream stream, String text) { | 195 | void putText(PdfStream stream, String text) { |
| 172 | try { | 196 | try { |
| 173 | PdfString(latin1.encode(text), PdfStringFormat.litteral).output(stream); | 197 | PdfString(latin1.encode(text), PdfStringFormat.litteral).output(stream); |
| @@ -16,7 +16,9 @@ | @@ -16,7 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Font descriptor object | ||
| 19 | class PdfFontDescriptor extends PdfObject { | 20 | class PdfFontDescriptor extends PdfObject { |
| 21 | + /// Create a Font descriptor object | ||
| 20 | PdfFontDescriptor( | 22 | PdfFontDescriptor( |
| 21 | this.ttfFont, | 23 | this.ttfFont, |
| 22 | this.file, | 24 | this.file, |
| @@ -24,8 +26,10 @@ class PdfFontDescriptor extends PdfObject { | @@ -24,8 +26,10 @@ class PdfFontDescriptor extends PdfObject { | ||
| 24 | assert(file != null), | 26 | assert(file != null), |
| 25 | super(ttfFont.pdfDocument, '/FontDescriptor'); | 27 | super(ttfFont.pdfDocument, '/FontDescriptor'); |
| 26 | 28 | ||
| 29 | + /// File data | ||
| 27 | final PdfObjectStream file; | 30 | final PdfObjectStream file; |
| 28 | 31 | ||
| 32 | + /// Truetype font | ||
| 29 | final PdfTtfFont ttfFont; | 33 | final PdfTtfFont ttfFont; |
| 30 | 34 | ||
| 31 | @override | 35 | @override |
| @@ -16,8 +16,10 @@ | @@ -16,8 +16,10 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Describe dimensions for glyphs in a font | ||
| 19 | @immutable | 20 | @immutable |
| 20 | class PdfFontMetrics { | 21 | class PdfFontMetrics { |
| 22 | + /// Create a PdfFontMetrics object | ||
| 21 | const PdfFontMetrics( | 23 | const PdfFontMetrics( |
| 22 | {@required this.left, | 24 | {@required this.left, |
| 23 | @required this.top, | 25 | @required this.top, |
| @@ -37,6 +39,7 @@ class PdfFontMetrics { | @@ -37,6 +39,7 @@ class PdfFontMetrics { | ||
| 37 | assert(top <= bottom), | 39 | assert(top <= bottom), |
| 38 | assert((descent ?? top) <= (ascent ?? bottom)); | 40 | assert((descent ?? top) <= (ascent ?? bottom)); |
| 39 | 41 | ||
| 42 | + /// Add another metric | ||
| 40 | factory PdfFontMetrics.append( | 43 | factory PdfFontMetrics.append( |
| 41 | Iterable<PdfFontMetrics> metrics, { | 44 | Iterable<PdfFontMetrics> metrics, { |
| 42 | double letterSpacing = 0, | 45 | double letterSpacing = 0, |
| @@ -76,42 +79,59 @@ class PdfFontMetrics { | @@ -76,42 +79,59 @@ class PdfFontMetrics { | ||
| 76 | advanceWidth: right - spacing); | 79 | advanceWidth: right - spacing); |
| 77 | } | 80 | } |
| 78 | 81 | ||
| 82 | + /// Zero-sized dimensions | ||
| 79 | static const PdfFontMetrics zero = | 83 | static const PdfFontMetrics zero = |
| 80 | PdfFontMetrics(left: 0, top: 0, right: 0, bottom: 0); | 84 | PdfFontMetrics(left: 0, top: 0, right: 0, bottom: 0); |
| 81 | 85 | ||
| 86 | + /// Left most of the bounding box | ||
| 82 | final double left; | 87 | final double left; |
| 83 | 88 | ||
| 89 | + /// Top most of the bounding box | ||
| 84 | final double top; | 90 | final double top; |
| 85 | 91 | ||
| 92 | + /// Bottom most of the bounding box | ||
| 86 | final double bottom; | 93 | final double bottom; |
| 87 | 94 | ||
| 95 | + /// Right most of the bounding box | ||
| 88 | final double right; | 96 | final double right; |
| 89 | 97 | ||
| 98 | + /// Spans the distance between the baseline and the top of the glyph that | ||
| 99 | + /// reaches farthest from the baseline | ||
| 90 | final double ascent; | 100 | final double ascent; |
| 91 | 101 | ||
| 102 | + /// Spans the distance between the baseline and the lowest descending glyph | ||
| 92 | final double descent; | 103 | final double descent; |
| 93 | 104 | ||
| 105 | + /// distance to move right to draw the next glyph | ||
| 94 | final double advanceWidth; | 106 | final double advanceWidth; |
| 95 | 107 | ||
| 108 | + /// Width of the glyph | ||
| 96 | double get width => right - left; | 109 | double get width => right - left; |
| 97 | 110 | ||
| 111 | + /// Height of the glyph | ||
| 98 | double get height => bottom - top; | 112 | double get height => bottom - top; |
| 99 | 113 | ||
| 100 | - double get maxHeight => ascent - descent; | ||
| 101 | - | 114 | + /// Maximum Width any glyph from this font can have |
| 102 | double get maxWidth => | 115 | double get maxWidth => |
| 103 | math.max(advanceWidth, right) + math.max(-leftBearing, 0.0); | 116 | math.max(advanceWidth, right) + math.max(-leftBearing, 0.0); |
| 104 | 117 | ||
| 118 | + /// Maximum Height any glyph from this font can have | ||
| 119 | + double get maxHeight => ascent - descent; | ||
| 120 | + | ||
| 121 | + /// Real left position. The glyph may overflow on the left | ||
| 105 | double get effectiveLeft => math.min(leftBearing, 0); | 122 | double get effectiveLeft => math.min(leftBearing, 0); |
| 106 | 123 | ||
| 124 | + /// Starting point | ||
| 107 | double get leftBearing => left; | 125 | double get leftBearing => left; |
| 108 | 126 | ||
| 127 | + /// Ending point | ||
| 109 | double get rightBearing => advanceWidth - right; | 128 | double get rightBearing => advanceWidth - right; |
| 110 | 129 | ||
| 111 | @override | 130 | @override |
| 112 | String toString() => | 131 | String toString() => |
| 113 | 'PdfFontMetrics(left:$left, top:$top, right:$right, bottom:$bottom, ascent:$ascent, descent:$descent, advanceWidth:$advanceWidth)'; | 132 | 'PdfFontMetrics(left:$left, top:$top, right:$right, bottom:$bottom, ascent:$ascent, descent:$descent, advanceWidth:$advanceWidth)'; |
| 114 | 133 | ||
| 134 | + /// Make a copy of this object | ||
| 115 | PdfFontMetrics copyWith( | 135 | PdfFontMetrics copyWith( |
| 116 | {double left, | 136 | {double left, |
| 117 | double top, | 137 | double top, |
| @@ -130,6 +150,7 @@ class PdfFontMetrics { | @@ -130,6 +150,7 @@ class PdfFontMetrics { | ||
| 130 | advanceWidth: advanceWidth ?? this.advanceWidth); | 150 | advanceWidth: advanceWidth ?? this.advanceWidth); |
| 131 | } | 151 | } |
| 132 | 152 | ||
| 153 | + /// Multiply this metrics object with a font size | ||
| 133 | PdfFontMetrics operator *(double factor) { | 154 | PdfFontMetrics operator *(double factor) { |
| 134 | return copyWith( | 155 | return copyWith( |
| 135 | left: left * factor, | 156 | left: left * factor, |
| @@ -142,5 +163,6 @@ class PdfFontMetrics { | @@ -142,5 +163,6 @@ class PdfFontMetrics { | ||
| 142 | ); | 163 | ); |
| 143 | } | 164 | } |
| 144 | 165 | ||
| 166 | + /// Get the bounding box | ||
| 145 | PdfRect toPdfRect() => PdfRect.fromLTRB(left, top, right, bottom); | 167 | PdfRect toPdfRect() => PdfRect.fromLTRB(left, top, right, bottom); |
| 146 | } | 168 | } |
| @@ -16,7 +16,9 @@ | @@ -16,7 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Form XObject | ||
| 19 | class PdfFormXObject extends PdfXObject { | 20 | class PdfFormXObject extends PdfXObject { |
| 21 | + /// Create a Form XObject | ||
| 20 | PdfFormXObject(PdfDocument pdfDocument) : super(pdfDocument, '/Form') { | 22 | PdfFormXObject(PdfDocument pdfDocument) : super(pdfDocument, '/Form') { |
| 21 | params['/FormType'] = const PdfNum(1); | 23 | params['/FormType'] = const PdfNum(1); |
| 22 | params['/BBox'] = PdfArray.fromNum(const <int>[0, 0, 1000, 1000]); | 24 | params['/BBox'] = PdfArray.fromNum(const <int>[0, 0, 1000, 1000]); |
| @@ -28,7 +30,7 @@ class PdfFormXObject extends PdfXObject { | @@ -28,7 +30,7 @@ class PdfFormXObject extends PdfXObject { | ||
| 28 | /// The xobjects or other images in the pdf | 30 | /// The xobjects or other images in the pdf |
| 29 | final Map<String, PdfXObject> xobjects = <String, PdfXObject>{}; | 31 | final Map<String, PdfXObject> xobjects = <String, PdfXObject>{}; |
| 30 | 32 | ||
| 31 | - /// set matrix | 33 | + /// Transformation matrix |
| 32 | void setMatrix(Matrix4 t) { | 34 | void setMatrix(Matrix4 t) { |
| 33 | final s = t.storage; | 35 | final s = t.storage; |
| 34 | params['/Matrix'] = | 36 | params['/Matrix'] = |
| @@ -39,8 +41,7 @@ class PdfFormXObject extends PdfXObject { | @@ -39,8 +41,7 @@ class PdfFormXObject extends PdfXObject { | ||
| 39 | void _prepare() { | 41 | void _prepare() { |
| 40 | super._prepare(); | 42 | super._prepare(); |
| 41 | 43 | ||
| 42 | - // Now the resources | ||
| 43 | - /// This holds any resources for this FormXObject | 44 | + // This holds any resources for this FormXObject |
| 44 | final resources = PdfDict(); | 45 | final resources = PdfDict(); |
| 45 | 46 | ||
| 46 | // fonts | 47 | // fonts |
| @@ -18,10 +18,13 @@ | @@ -18,10 +18,13 @@ | ||
| 18 | 18 | ||
| 19 | part of pdf; | 19 | part of pdf; |
| 20 | 20 | ||
| 21 | +/// Graphic state | ||
| 21 | @immutable | 22 | @immutable |
| 22 | class PdfGraphicState { | 23 | class PdfGraphicState { |
| 24 | + /// Create a new graphic state | ||
| 23 | const PdfGraphicState({this.opacity}); | 25 | const PdfGraphicState({this.opacity}); |
| 24 | 26 | ||
| 27 | + /// The opacity to apply to this graphic state | ||
| 25 | final double opacity; | 28 | final double opacity; |
| 26 | 29 | ||
| 27 | @protected | 30 | @protected |
| @@ -48,13 +51,16 @@ class PdfGraphicState { | @@ -48,13 +51,16 @@ class PdfGraphicState { | ||
| 48 | int get hashCode => opacity.hashCode; | 51 | int get hashCode => opacity.hashCode; |
| 49 | } | 52 | } |
| 50 | 53 | ||
| 54 | +/// Stores all the graphic states used in the document | ||
| 51 | class PdfGraphicStates extends PdfObject { | 55 | class PdfGraphicStates extends PdfObject { |
| 56 | + /// Create a new Graphic States object | ||
| 52 | PdfGraphicStates(PdfDocument pdfDocument) : super(pdfDocument); | 57 | PdfGraphicStates(PdfDocument pdfDocument) : super(pdfDocument); |
| 53 | 58 | ||
| 54 | final List<PdfGraphicState> _states = <PdfGraphicState>[]; | 59 | final List<PdfGraphicState> _states = <PdfGraphicState>[]; |
| 55 | 60 | ||
| 56 | static const String _prefix = '/a'; | 61 | static const String _prefix = '/a'; |
| 57 | 62 | ||
| 63 | + /// Generate a name for a state object | ||
| 58 | String stateName(PdfGraphicState state) { | 64 | String stateName(PdfGraphicState state) { |
| 59 | var index = _states.indexOf(state); | 65 | var index = _states.indexOf(state); |
| 60 | if (index < 0) { | 66 | if (index < 0) { |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Helper functions for graphic objects | ||
| 19 | mixin PdfGraphicStream on PdfObject { | 20 | mixin PdfGraphicStream on PdfObject { |
| 20 | /// Isolated transparency: If this flag is true, objects within the group | 21 | /// Isolated transparency: If this flag is true, objects within the group |
| 21 | /// shall be composited against a fully transparent initial backdrop; | 22 | /// shall be composited against a fully transparent initial backdrop; |
| @@ -38,24 +39,28 @@ mixin PdfGraphicStream on PdfObject { | @@ -38,24 +39,28 @@ mixin PdfGraphicStream on PdfObject { | ||
| 38 | /// The xobjects or other images in the pdf | 39 | /// The xobjects or other images in the pdf |
| 39 | final Map<String, PdfXObject> xObjects = <String, PdfXObject>{}; | 40 | final Map<String, PdfXObject> xObjects = <String, PdfXObject>{}; |
| 40 | 41 | ||
| 42 | + /// Add a font to this graphic object | ||
| 41 | void addFont(PdfFont font) { | 43 | void addFont(PdfFont font) { |
| 42 | if (!fonts.containsKey(font.name)) { | 44 | if (!fonts.containsKey(font.name)) { |
| 43 | fonts[font.name] = font; | 45 | fonts[font.name] = font; |
| 44 | } | 46 | } |
| 45 | } | 47 | } |
| 46 | 48 | ||
| 49 | + /// Add a shader to this graphic object | ||
| 47 | void addShader(PdfShading shader) { | 50 | void addShader(PdfShading shader) { |
| 48 | if (!shading.containsKey(shader.name)) { | 51 | if (!shading.containsKey(shader.name)) { |
| 49 | shading[shader.name] = shader; | 52 | shading[shader.name] = shader; |
| 50 | } | 53 | } |
| 51 | } | 54 | } |
| 52 | 55 | ||
| 56 | + /// Add an XObject to this graphic object | ||
| 53 | void addXObject(PdfXObject object) { | 57 | void addXObject(PdfXObject object) { |
| 54 | if (!xObjects.containsKey(object.name)) { | 58 | if (!xObjects.containsKey(object.name)) { |
| 55 | xObjects[object.name] = object; | 59 | xObjects[object.name] = object; |
| 56 | } | 60 | } |
| 57 | } | 61 | } |
| 58 | 62 | ||
| 63 | + /// Get the default font of this graphic object | ||
| 59 | PdfFont getDefaultFont() { | 64 | PdfFont getDefaultFont() { |
| 60 | if (pdfDocument.fonts.isEmpty) { | 65 | if (pdfDocument.fonts.isEmpty) { |
| 61 | PdfFont.helvetica(pdfDocument); | 66 | PdfFont.helvetica(pdfDocument); |
| @@ -64,6 +69,7 @@ mixin PdfGraphicStream on PdfObject { | @@ -64,6 +69,7 @@ mixin PdfGraphicStream on PdfObject { | ||
| 64 | return pdfDocument.fonts.elementAt(0); | 69 | return pdfDocument.fonts.elementAt(0); |
| 65 | } | 70 | } |
| 66 | 71 | ||
| 72 | + /// Generate a name for the graphic state object | ||
| 67 | String stateName(PdfGraphicState state) { | 73 | String stateName(PdfGraphicState state) { |
| 68 | return pdfDocument.graphicStates.stateName(state); | 74 | return pdfDocument.graphicStates.stateName(state); |
| 69 | } | 75 | } |
| @@ -114,7 +120,9 @@ mixin PdfGraphicStream on PdfObject { | @@ -114,7 +120,9 @@ mixin PdfGraphicStream on PdfObject { | ||
| 114 | } | 120 | } |
| 115 | } | 121 | } |
| 116 | 122 | ||
| 123 | +/// Graphic XObject | ||
| 117 | class PdfGraphicXObject extends PdfXObject with PdfGraphicStream { | 124 | class PdfGraphicXObject extends PdfXObject with PdfGraphicStream { |
| 125 | + /// Creates a Graphic XObject | ||
| 118 | PdfGraphicXObject( | 126 | PdfGraphicXObject( |
| 119 | PdfDocument pdfDocument, [ | 127 | PdfDocument pdfDocument, [ |
| 120 | String subtype, | 128 | String subtype, |
| @@ -76,7 +76,9 @@ class _PdfGraphicsContext { | @@ -76,7 +76,9 @@ class _PdfGraphicsContext { | ||
| 76 | _PdfGraphicsContext copy() => _PdfGraphicsContext(ctm: ctm.clone()); | 76 | _PdfGraphicsContext copy() => _PdfGraphicsContext(ctm: ctm.clone()); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | +/// Pdf drawing operations | ||
| 79 | class PdfGraphics { | 80 | class PdfGraphics { |
| 81 | + /// Create a new graphic canvas | ||
| 80 | PdfGraphics(this._page, this.buf) { | 82 | PdfGraphics(this._page, this.buf) { |
| 81 | _context = _PdfGraphicsContext(ctm: Matrix4.identity()); | 83 | _context = _PdfGraphicsContext(ctm: Matrix4.identity()); |
| 82 | } | 84 | } |
| @@ -90,22 +92,29 @@ class PdfGraphics { | @@ -90,22 +92,29 @@ class PdfGraphics { | ||
| 90 | 92 | ||
| 91 | final PdfGraphicStream _page; | 93 | final PdfGraphicStream _page; |
| 92 | 94 | ||
| 95 | + /// Buffer where to write the graphic operations | ||
| 93 | final PdfStream buf; | 96 | final PdfStream buf; |
| 94 | 97 | ||
| 98 | + /// Default font if none selected | ||
| 95 | PdfFont get defaultFont => _page.getDefaultFont(); | 99 | PdfFont get defaultFont => _page.getDefaultFont(); |
| 96 | 100 | ||
| 101 | + /// Draw a surface on the previously defined shape | ||
| 97 | void fillPath() { | 102 | void fillPath() { |
| 98 | buf.putString('f\n'); | 103 | buf.putString('f\n'); |
| 99 | } | 104 | } |
| 100 | 105 | ||
| 106 | + /// Draw the contour of the previously defined shape | ||
| 101 | void strokePath() { | 107 | void strokePath() { |
| 102 | buf.putString('S\n'); | 108 | buf.putString('S\n'); |
| 103 | } | 109 | } |
| 104 | 110 | ||
| 111 | + /// Close the path with a line | ||
| 105 | void closePath() { | 112 | void closePath() { |
| 106 | buf.putString('s\n'); | 113 | buf.putString('s\n'); |
| 107 | } | 114 | } |
| 108 | 115 | ||
| 116 | + /// Create a clipping surface from the previously defined shape, | ||
| 117 | + /// to prevent any further drawing outside | ||
| 109 | void clipPath() { | 118 | void clipPath() { |
| 110 | buf.putString('W n\n'); | 119 | buf.putString('W n\n'); |
| 111 | } | 120 | } |
| @@ -130,26 +139,13 @@ class PdfGraphics { | @@ -130,26 +139,13 @@ class PdfGraphics { | ||
| 130 | } | 139 | } |
| 131 | } | 140 | } |
| 132 | 141 | ||
| 142 | + /// Save the graphc context | ||
| 133 | void saveContext() { | 143 | void saveContext() { |
| 134 | - // save graphics context | ||
| 135 | buf.putString('q\n'); | 144 | buf.putString('q\n'); |
| 136 | _contextQueue.addLast(_context.copy()); | 145 | _contextQueue.addLast(_context.copy()); |
| 137 | } | 146 | } |
| 138 | 147 | ||
| 139 | /// Draws an image onto the page. | 148 | /// Draws an image onto the page. |
| 140 | - /// | ||
| 141 | - /// This method is implemented with [Ascii85Encoder] encoding and the | ||
| 142 | - /// zip stream deflater. It results in a stream that is anywhere | ||
| 143 | - /// from 3 to 10 times as big as the image. This obviously needs some | ||
| 144 | - /// improvement, but it works well for small images | ||
| 145 | - /// | ||
| 146 | - /// @param img The Image | ||
| 147 | - /// @param x coordinate on page | ||
| 148 | - /// @param y coordinate on page | ||
| 149 | - /// @param w Width on page | ||
| 150 | - /// @param h height on page | ||
| 151 | - /// @param bgcolor Background colour | ||
| 152 | - /// @return true if drawn | ||
| 153 | void drawImage(PdfImage img, double x, double y, [double w, double h]) { | 149 | void drawImage(PdfImage img, double x, double y, [double w, double h]) { |
| 154 | w ??= img.width.toDouble(); | 150 | w ??= img.width.toDouble(); |
| 155 | h ??= img.height.toDouble() * w / img.width.toDouble(); | 151 | h ??= img.height.toDouble() * w / img.width.toDouble(); |
| @@ -190,19 +186,12 @@ class PdfGraphics { | @@ -190,19 +186,12 @@ class PdfGraphics { | ||
| 190 | } | 186 | } |
| 191 | 187 | ||
| 192 | /// Draws a line between two coordinates. | 188 | /// Draws a line between two coordinates. |
| 193 | - /// | ||
| 194 | - /// If the first coordinate is the same as the last one drawn | ||
| 195 | - /// (i.e. a previous drawLine, moveto, etc) it is ignored. | ||
| 196 | - /// | ||
| 197 | - /// @param x1 coordinate | ||
| 198 | - /// @param y1 coordinate | ||
| 199 | - /// @param x2 coordinate | ||
| 200 | - /// @param y2 coordinate | ||
| 201 | void drawLine(double x1, double y1, double x2, double y2) { | 189 | void drawLine(double x1, double y1, double x2, double y2) { |
| 202 | moveTo(x1, y1); | 190 | moveTo(x1, y1); |
| 203 | lineTo(x2, y2); | 191 | lineTo(x2, y2); |
| 204 | } | 192 | } |
| 205 | 193 | ||
| 194 | + /// Draws an ellipse | ||
| 206 | void drawEllipse(double x, double y, double r1, double r2) { | 195 | void drawEllipse(double x, double y, double r1, double r2) { |
| 207 | moveTo(x, y - r2); | 196 | moveTo(x, y - r2); |
| 208 | curveTo(x + _m4 * r1, y - r2, x + r1, y - _m4 * r2, x + r1, y); | 197 | curveTo(x + _m4 * r1, y - r2, x + r1, y - _m4 * r2, x + r1, y); |
| @@ -212,11 +201,6 @@ class PdfGraphics { | @@ -212,11 +201,6 @@ class PdfGraphics { | ||
| 212 | } | 201 | } |
| 213 | 202 | ||
| 214 | /// Draws a Rectangle | 203 | /// Draws a Rectangle |
| 215 | - /// | ||
| 216 | - /// @param x coordinate | ||
| 217 | - /// @param y coordinate | ||
| 218 | - /// @param w width | ||
| 219 | - /// @param h height | ||
| 220 | void drawRect( | 204 | void drawRect( |
| 221 | double x, | 205 | double x, |
| 222 | double y, | 206 | double y, |
| @@ -228,13 +212,6 @@ class PdfGraphics { | @@ -228,13 +212,6 @@ class PdfGraphics { | ||
| 228 | } | 212 | } |
| 229 | 213 | ||
| 230 | /// Draws a Rounded Rectangle | 214 | /// Draws a Rounded Rectangle |
| 231 | - /// | ||
| 232 | - /// @param x coordinate | ||
| 233 | - /// @param y coordinate | ||
| 234 | - /// @param w width | ||
| 235 | - /// @param h height | ||
| 236 | - /// @param rh horizontal radius | ||
| 237 | - /// @param rv vertical radius | ||
| 238 | void drawRRect(double x, double y, double w, double h, double rv, double rh) { | 215 | void drawRRect(double x, double y, double w, double h, double rv, double rh) { |
| 239 | moveTo(x, y + rv); | 216 | moveTo(x, y + rv); |
| 240 | curveTo(x, y - _m4 * rv + rv, x - _m4 * rh + rh, y, x + rh, y); | 217 | curveTo(x, y - _m4 * rv + rv, x - _m4 * rh + rh, y, x + rh, y); |
| @@ -283,10 +260,6 @@ class PdfGraphics { | @@ -283,10 +260,6 @@ class PdfGraphics { | ||
| 283 | } | 260 | } |
| 284 | 261 | ||
| 285 | /// This draws a string. | 262 | /// This draws a string. |
| 286 | - /// | ||
| 287 | - /// @param x coordinate | ||
| 288 | - /// @param y coordinate | ||
| 289 | - /// @param s String to draw | ||
| 290 | void drawString( | 263 | void drawString( |
| 291 | PdfFont font, | 264 | PdfFont font, |
| 292 | double size, | 265 | double size, |
| @@ -316,16 +289,12 @@ class PdfGraphics { | @@ -316,16 +289,12 @@ class PdfGraphics { | ||
| 316 | } | 289 | } |
| 317 | 290 | ||
| 318 | /// Sets the color for drawing | 291 | /// Sets the color for drawing |
| 319 | - /// | ||
| 320 | - /// @param c Color to use | ||
| 321 | void setColor(PdfColor color) { | 292 | void setColor(PdfColor color) { |
| 322 | setFillColor(color); | 293 | setFillColor(color); |
| 323 | setStrokeColor(color); | 294 | setStrokeColor(color); |
| 324 | } | 295 | } |
| 325 | 296 | ||
| 326 | /// Sets the fill color for drawing | 297 | /// Sets the fill color for drawing |
| 327 | - /// | ||
| 328 | - /// @param c Color to use | ||
| 329 | void setFillColor(PdfColor color) { | 298 | void setFillColor(PdfColor color) { |
| 330 | if (color is PdfColorCmyk) { | 299 | if (color is PdfColorCmyk) { |
| 331 | PdfNumList(<double>[color.cyan, color.magenta, color.yellow, color.black]) | 300 | PdfNumList(<double>[color.cyan, color.magenta, color.yellow, color.black]) |
| @@ -338,8 +307,6 @@ class PdfGraphics { | @@ -338,8 +307,6 @@ class PdfGraphics { | ||
| 338 | } | 307 | } |
| 339 | 308 | ||
| 340 | /// Sets the stroke color for drawing | 309 | /// Sets the stroke color for drawing |
| 341 | - /// | ||
| 342 | - /// @param c Color to use | ||
| 343 | void setStrokeColor(PdfColor color) { | 310 | void setStrokeColor(PdfColor color) { |
| 344 | if (color is PdfColorCmyk) { | 311 | if (color is PdfColorCmyk) { |
| 345 | PdfNumList(<double>[color.cyan, color.magenta, color.yellow, color.black]) | 312 | PdfNumList(<double>[color.cyan, color.magenta, color.yellow, color.black]) |
| @@ -371,18 +338,12 @@ class PdfGraphics { | @@ -371,18 +338,12 @@ class PdfGraphics { | ||
| 371 | } | 338 | } |
| 372 | 339 | ||
| 373 | /// This adds a line segment to the current path | 340 | /// This adds a line segment to the current path |
| 374 | - /// | ||
| 375 | - /// @param x coordinate | ||
| 376 | - /// @param y coordinate | ||
| 377 | void lineTo(double x, double y) { | 341 | void lineTo(double x, double y) { |
| 378 | PdfNumList(<double>[x, y]).output(buf); | 342 | PdfNumList(<double>[x, y]).output(buf); |
| 379 | buf.putString(' l\n'); | 343 | buf.putString(' l\n'); |
| 380 | } | 344 | } |
| 381 | 345 | ||
| 382 | /// This moves the current drawing point. | 346 | /// This moves the current drawing point. |
| 383 | - /// | ||
| 384 | - /// @param x coordinate | ||
| 385 | - /// @param y coordinate | ||
| 386 | void moveTo(double x, double y) { | 347 | void moveTo(double x, double y) { |
| 387 | PdfNumList(<double>[x, y]).output(buf); | 348 | PdfNumList(<double>[x, y]).output(buf); |
| 388 | buf.putString(' m\n'); | 349 | buf.putString(' m\n'); |
| @@ -391,13 +352,6 @@ class PdfGraphics { | @@ -391,13 +352,6 @@ class PdfGraphics { | ||
| 391 | /// Draw a cubic bézier curve from the current point to (x3,y3) | 352 | /// Draw a cubic bézier curve from the current point to (x3,y3) |
| 392 | /// using (x1,y1) as the control point at the beginning of the curve | 353 | /// using (x1,y1) as the control point at the beginning of the curve |
| 393 | /// and (x2,y2) as the control point at the end of the curve. | 354 | /// and (x2,y2) as the control point at the end of the curve. |
| 394 | - /// | ||
| 395 | - /// @param x1 first control point | ||
| 396 | - /// @param y1 first control point | ||
| 397 | - /// @param x2 second control point | ||
| 398 | - /// @param y2 second control point | ||
| 399 | - /// @param x3 end point | ||
| 400 | - /// @param y3 end point | ||
| 401 | void curveTo( | 355 | void curveTo( |
| 402 | double x1, double y1, double x2, double y2, double x3, double y3) { | 356 | double x1, double y1, double x2, double y2, double x3, double y3) { |
| 403 | PdfNumList(<double>[x1, y1, x2, y2, x3, y3]).output(buf); | 357 | PdfNumList(<double>[x1, y1, x2, y2, x3, y3]).output(buf); |
| @@ -546,11 +500,13 @@ class PdfGraphics { | @@ -546,11 +500,13 @@ class PdfGraphics { | ||
| 546 | } | 500 | } |
| 547 | } | 501 | } |
| 548 | 502 | ||
| 503 | + /// Draw an SVG path | ||
| 549 | void drawShape(String d, {bool stroke = true}) { | 504 | void drawShape(String d, {bool stroke = true}) { |
| 550 | final proxy = _PathProxy(this, stroke); | 505 | final proxy = _PathProxy(this, stroke); |
| 551 | writeSvgPathDataToPath(d, proxy); | 506 | writeSvgPathDataToPath(d, proxy); |
| 552 | } | 507 | } |
| 553 | 508 | ||
| 509 | + /// Set line starting and ending cap type | ||
| 554 | void setLineCap(PdfLineCap cap) { | 510 | void setLineCap(PdfLineCap cap) { |
| 555 | buf.putString('${cap.index} J\n'); | 511 | buf.putString('${cap.index} J\n'); |
| 556 | } | 512 | } |
| @@ -560,16 +516,22 @@ class PdfGraphics { | @@ -560,16 +516,22 @@ class PdfGraphics { | ||
| 560 | buf.putString('${join.index} j\n'); | 516 | buf.putString('${join.index} j\n'); |
| 561 | } | 517 | } |
| 562 | 518 | ||
| 519 | + /// Set line width | ||
| 563 | void setLineWidth(double width) { | 520 | void setLineWidth(double width) { |
| 564 | PdfNum(width).output(buf); | 521 | PdfNum(width).output(buf); |
| 565 | buf.putString(' w\n'); | 522 | buf.putString(' w\n'); |
| 566 | } | 523 | } |
| 567 | 524 | ||
| 525 | + /// Set line joint miter limit, applies if the | ||
| 568 | void setMiterLimit(double limit) { | 526 | void setMiterLimit(double limit) { |
| 569 | PdfNum(limit).output(buf); | 527 | PdfNum(limit).output(buf); |
| 570 | buf.putString(' M\n'); | 528 | buf.putString(' M\n'); |
| 571 | } | 529 | } |
| 572 | 530 | ||
| 531 | + /// The dash array shall be cycled through, adding up the lengths of dashes and gaps. | ||
| 532 | + /// When the accumulated length equals the value specified by the dash phase | ||
| 533 | + /// | ||
| 534 | + /// Example: [2 1] will create a dash pattern with 2 on, 1 off, 2 on, 1 off, ... | ||
| 573 | void setLineDashPattern([List<int> array = const <int>[], int phase = 0]) { | 535 | void setLineDashPattern([List<int> array = const <int>[], int phase = 0]) { |
| 574 | PdfArray.fromNum(array).output(buf); | 536 | PdfArray.fromNum(array).output(buf); |
| 575 | buf.putString(' $phase d\n'); | 537 | buf.putString(' $phase d\n'); |
| @@ -19,16 +19,32 @@ part of pdf; | @@ -19,16 +19,32 @@ part of pdf; | ||
| 19 | /// Represents the position of the first pixel in the data stream | 19 | /// Represents the position of the first pixel in the data stream |
| 20 | /// This corresponds to the exif orientations | 20 | /// This corresponds to the exif orientations |
| 21 | enum PdfImageOrientation { | 21 | enum PdfImageOrientation { |
| 22 | + /// Rotated 0° | ||
| 22 | topLeft, | 23 | topLeft, |
| 24 | + | ||
| 25 | + /// Rotated 90° | ||
| 23 | topRight, | 26 | topRight, |
| 27 | + | ||
| 28 | + /// Rotated 180° | ||
| 24 | bottomRight, | 29 | bottomRight, |
| 30 | + | ||
| 31 | + /// Rotated 270° | ||
| 25 | bottomLeft, | 32 | bottomLeft, |
| 33 | + | ||
| 34 | + /// Rotated 0° mirror | ||
| 26 | leftTop, | 35 | leftTop, |
| 36 | + | ||
| 37 | + /// Rotated 90° mirror | ||
| 27 | rightTop, | 38 | rightTop, |
| 39 | + | ||
| 40 | + /// Rotated 180° mirror | ||
| 28 | rightBottom, | 41 | rightBottom, |
| 42 | + | ||
| 43 | + /// Rotated 270° mirror | ||
| 29 | leftBottom, | 44 | leftBottom, |
| 30 | } | 45 | } |
| 31 | 46 | ||
| 47 | +/// Image object stored in the Pdf document | ||
| 32 | class PdfImage extends PdfXObject { | 48 | class PdfImage extends PdfXObject { |
| 33 | /// Creates a new [PdfImage] instance. | 49 | /// Creates a new [PdfImage] instance. |
| 34 | factory PdfImage( | 50 | factory PdfImage( |
| @@ -77,6 +93,7 @@ class PdfImage extends PdfXObject { | @@ -77,6 +93,7 @@ class PdfImage extends PdfXObject { | ||
| 77 | return im; | 93 | return im; |
| 78 | } | 94 | } |
| 79 | 95 | ||
| 96 | + /// Create an image from a jpeg file | ||
| 80 | factory PdfImage.jpeg( | 97 | factory PdfImage.jpeg( |
| 81 | PdfDocument pdfDocument, { | 98 | PdfDocument pdfDocument, { |
| 82 | @required Uint8List image, | 99 | @required Uint8List image, |
| @@ -107,6 +124,7 @@ class PdfImage extends PdfXObject { | @@ -107,6 +124,7 @@ class PdfImage extends PdfXObject { | ||
| 107 | return im; | 124 | return im; |
| 108 | } | 125 | } |
| 109 | 126 | ||
| 127 | + /// Create an image from an [im.Image] object | ||
| 110 | factory PdfImage.fromImage( | 128 | factory PdfImage.fromImage( |
| 111 | PdfDocument pdfDocument, { | 129 | PdfDocument pdfDocument, { |
| 112 | @required im.Image image, | 130 | @required im.Image image, |
| @@ -124,6 +142,7 @@ class PdfImage extends PdfXObject { | @@ -124,6 +142,7 @@ class PdfImage extends PdfXObject { | ||
| 124 | ); | 142 | ); |
| 125 | } | 143 | } |
| 126 | 144 | ||
| 145 | + /// Create an image from an image file | ||
| 127 | factory PdfImage.file( | 146 | factory PdfImage.file( |
| 128 | PdfDocument pdfDocument, { | 147 | PdfDocument pdfDocument, { |
| 129 | @required Uint8List bytes, | 148 | @required Uint8List bytes, |
| @@ -185,12 +204,14 @@ class PdfImage extends PdfXObject { | @@ -185,12 +204,14 @@ class PdfImage extends PdfXObject { | ||
| 185 | params['/Height'] = PdfNum(_height); | 204 | params['/Height'] = PdfNum(_height); |
| 186 | } | 205 | } |
| 187 | 206 | ||
| 188 | - /// Image width | ||
| 189 | final int _width; | 207 | final int _width; |
| 208 | + | ||
| 209 | + /// Image width | ||
| 190 | int get width => orientation.index >= 4 ? _height : _width; | 210 | int get width => orientation.index >= 4 ? _height : _width; |
| 191 | 211 | ||
| 192 | - /// Image height | ||
| 193 | final int _height; | 212 | final int _height; |
| 213 | + | ||
| 214 | + /// Image height | ||
| 194 | int get height => orientation.index < 4 ? _height : _width; | 215 | int get height => orientation.index < 4 ? _height : _width; |
| 195 | 216 | ||
| 196 | /// The internal orientation of the image | 217 | /// The internal orientation of the image |
| @@ -16,8 +16,9 @@ | @@ -16,8 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Information object | ||
| 19 | class PdfInfo extends PdfObject { | 20 | class PdfInfo extends PdfObject { |
| 20 | - /// @param title Title of this document | 21 | + /// Create an information object |
| 21 | PdfInfo(PdfDocument pdfDocument, | 22 | PdfInfo(PdfDocument pdfDocument, |
| 22 | {this.title, | 23 | {this.title, |
| 23 | this.author, | 24 | this.author, |
| @@ -53,15 +54,21 @@ class PdfInfo extends PdfObject { | @@ -53,15 +54,21 @@ class PdfInfo extends PdfObject { | ||
| 53 | 54 | ||
| 54 | static const String _libraryName = 'https://github.com/DavBfr/dart_pdf'; | 55 | static const String _libraryName = 'https://github.com/DavBfr/dart_pdf'; |
| 55 | 56 | ||
| 57 | + /// Author of this document | ||
| 56 | final String author; | 58 | final String author; |
| 57 | 59 | ||
| 60 | + /// Creator of this document | ||
| 58 | final String creator; | 61 | final String creator; |
| 59 | 62 | ||
| 63 | + /// Title of this document | ||
| 60 | final String title; | 64 | final String title; |
| 61 | 65 | ||
| 66 | + /// Subject of this document | ||
| 62 | final String subject; | 67 | final String subject; |
| 63 | 68 | ||
| 69 | + /// Keywords of this document | ||
| 64 | final String keywords; | 70 | final String keywords; |
| 65 | 71 | ||
| 72 | + /// Application that created this document | ||
| 66 | final String producer; | 73 | final String producer; |
| 67 | } | 74 | } |
| @@ -16,12 +16,14 @@ | @@ -16,12 +16,14 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Pdf Name object | ||
| 19 | class PdfNames extends PdfObject { | 20 | class PdfNames extends PdfObject { |
| 20 | /// This constructs a Pdf Name object | 21 | /// This constructs a Pdf Name object |
| 21 | PdfNames(PdfDocument pdfDocument) : super(pdfDocument); | 22 | PdfNames(PdfDocument pdfDocument) : super(pdfDocument); |
| 22 | 23 | ||
| 23 | final Map<String, PdfDataType> _dests = <String, PdfDataType>{}; | 24 | final Map<String, PdfDataType> _dests = <String, PdfDataType>{}; |
| 24 | 25 | ||
| 26 | + /// Add a named destination | ||
| 25 | void addDest( | 27 | void addDest( |
| 26 | String name, | 28 | String name, |
| 27 | PdfPage page, { | 29 | PdfPage page, { |
| @@ -16,12 +16,14 @@ | @@ -16,12 +16,14 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Base Object used in the PDF file | ||
| 19 | class PdfObject { | 20 | class PdfObject { |
| 20 | /// This is usually called by extensors to this class, and sets the | 21 | /// This is usually called by extensors to this class, and sets the |
| 21 | /// Pdf Object Type | 22 | /// Pdf Object Type |
| 22 | - /// @param type the Pdf Object Type | ||
| 23 | - PdfObject(this.pdfDocument, [String type]) | ||
| 24 | - : assert(pdfDocument != null), | 23 | + PdfObject( |
| 24 | + this.pdfDocument, [ | ||
| 25 | + String type, | ||
| 26 | + ]) : assert(pdfDocument != null), | ||
| 25 | objser = pdfDocument._genSerial() { | 27 | objser = pdfDocument._genSerial() { |
| 26 | if (type != null) { | 28 | if (type != null) { |
| 27 | params['/Type'] = PdfName(type); | 29 | params['/Type'] = PdfName(type); |
| @@ -43,12 +45,6 @@ class PdfObject { | @@ -43,12 +45,6 @@ class PdfObject { | ||
| 43 | final PdfDocument pdfDocument; | 45 | final PdfDocument pdfDocument; |
| 44 | 46 | ||
| 45 | /// Writes the object to the output stream. | 47 | /// Writes the object to the output stream. |
| 46 | - /// This method must be overridden. | ||
| 47 | - /// | ||
| 48 | - /// Note: It should not write any other objects, even if they are | ||
| 49 | - /// it's Kids, as they will be written by the calling routine. | ||
| 50 | - /// | ||
| 51 | - /// @param os OutputStream to send the object to | ||
| 52 | void _write(PdfStream os) { | 48 | void _write(PdfStream os) { |
| 53 | _prepare(); | 49 | _prepare(); |
| 54 | _writeStart(os); | 50 | _writeStart(os); |
| @@ -62,10 +58,6 @@ class PdfObject { | @@ -62,10 +58,6 @@ class PdfObject { | ||
| 62 | 58 | ||
| 63 | /// The write method should call this before writing anything to the | 59 | /// The write method should call this before writing anything to the |
| 64 | /// OutputStream. This will send the standard header for each object. | 60 | /// OutputStream. This will send the standard header for each object. |
| 65 | - /// | ||
| 66 | - /// Note: There are a few rare cases where this method is not called. | ||
| 67 | - /// | ||
| 68 | - /// @param os OutputStream to write to | ||
| 69 | void _writeStart(PdfStream os) { | 61 | void _writeStart(PdfStream os) { |
| 70 | os.putString('$objser $objgen obj\n'); | 62 | os.putString('$objser $objgen obj\n'); |
| 71 | } | 63 | } |
| @@ -79,15 +71,10 @@ class PdfObject { | @@ -79,15 +71,10 @@ class PdfObject { | ||
| 79 | 71 | ||
| 80 | /// The write method should call this after writing anything to the | 72 | /// The write method should call this after writing anything to the |
| 81 | /// OutputStream. This will send the standard footer for each object. | 73 | /// OutputStream. This will send the standard footer for each object. |
| 82 | - /// | ||
| 83 | - /// Note: There are a few rare cases where this method is not called. | ||
| 84 | - /// | ||
| 85 | - /// @param os OutputStream to write to | ||
| 86 | void _writeEnd(PdfStream os) { | 74 | void _writeEnd(PdfStream os) { |
| 87 | os.putString('endobj\n'); | 75 | os.putString('endobj\n'); |
| 88 | } | 76 | } |
| 89 | 77 | ||
| 90 | /// Returns the unique serial number in Pdf format | 78 | /// Returns the unique serial number in Pdf format |
| 91 | - /// @return the serial number in Pdf format | ||
| 92 | PdfIndirect ref() => PdfIndirect(objser, objgen); | 79 | PdfIndirect ref() => PdfIndirect(objser, objgen); |
| 93 | } | 80 | } |
| @@ -16,16 +16,14 @@ | @@ -16,16 +16,14 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Stream Object | ||
| 19 | class PdfObjectStream extends PdfObject { | 20 | class PdfObjectStream extends PdfObject { |
| 20 | - /// Constructs a stream. The supplied type is stored in the stream's header | ||
| 21 | - /// and is used by other objects that extend the [PdfStream] class (like | ||
| 22 | - /// [PdfImage]). | ||
| 23 | - /// By default, the stream will be compressed. | ||
| 24 | - /// | ||
| 25 | - /// @param type type for the stream | ||
| 26 | - /// @see [PdfImage] | ||
| 27 | - PdfObjectStream(PdfDocument pdfDocument, {String type, this.isBinary = false}) | ||
| 28 | - : super(pdfDocument, type); | 21 | + /// Constructs a stream object to store some data |
| 22 | + PdfObjectStream( | ||
| 23 | + PdfDocument pdfDocument, { | ||
| 24 | + String type, | ||
| 25 | + this.isBinary = false, | ||
| 26 | + }) : super(pdfDocument, type); | ||
| 29 | 27 | ||
| 30 | /// This holds the stream's content. | 28 | /// This holds the stream's content. |
| 31 | final PdfStream buf = PdfStream(); | 29 | final PdfStream buf = PdfStream(); |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Outline mode | ||
| 19 | enum PdfOutlineMode { | 20 | enum PdfOutlineMode { |
| 20 | /// When jumping to the destination, display the whole page | 21 | /// When jumping to the destination, display the whole page |
| 21 | fitPage, | 22 | fitPage, |
| @@ -24,6 +25,7 @@ enum PdfOutlineMode { | @@ -24,6 +25,7 @@ enum PdfOutlineMode { | ||
| 24 | fitRect | 25 | fitRect |
| 25 | } | 26 | } |
| 26 | 27 | ||
| 28 | +/// Outline style | ||
| 27 | enum PdfOutlineStyle { | 29 | enum PdfOutlineStyle { |
| 28 | /// Normal | 30 | /// Normal |
| 29 | normal, | 31 | normal, |
| @@ -31,16 +33,17 @@ enum PdfOutlineStyle { | @@ -31,16 +33,17 @@ enum PdfOutlineStyle { | ||
| 31 | /// Italic | 33 | /// Italic |
| 32 | italic, | 34 | italic, |
| 33 | 35 | ||
| 34 | - // Bold | 36 | + /// Bold |
| 35 | bold, | 37 | bold, |
| 36 | 38 | ||
| 37 | /// Italic and Bold | 39 | /// Italic and Bold |
| 38 | italicBold, | 40 | italicBold, |
| 39 | } | 41 | } |
| 40 | 42 | ||
| 43 | +/// Pdf Outline object | ||
| 41 | class PdfOutline extends PdfObject { | 44 | class PdfOutline extends PdfObject { |
| 42 | - /// Constructs a Pdf Outline object. When selected, the specified region | ||
| 43 | - /// is displayed. | 45 | + /// Constructs a Pdf Outline object. |
| 46 | + /// When selected, the specified region is displayed. | ||
| 44 | PdfOutline( | 47 | PdfOutline( |
| 45 | PdfDocument pdfDocument, { | 48 | PdfDocument pdfDocument, { |
| 46 | this.title, | 49 | this.title, |
| @@ -82,6 +85,7 @@ class PdfOutline extends PdfObject { | @@ -82,6 +85,7 @@ class PdfOutline extends PdfObject { | ||
| 82 | /// How to display the outline text | 85 | /// How to display the outline text |
| 83 | final PdfOutlineStyle style; | 86 | final PdfOutlineStyle style; |
| 84 | 87 | ||
| 88 | + /// External level for this outline | ||
| 85 | int effectiveLevel; | 89 | int effectiveLevel; |
| 86 | 90 | ||
| 87 | /// This method creates an outline, and attaches it to this one. | 91 | /// This method creates an outline, and attaches it to this one. |
| @@ -91,7 +95,6 @@ class PdfOutline extends PdfObject { | @@ -91,7 +95,6 @@ class PdfOutline extends PdfObject { | ||
| 91 | outlines.add(outline); | 95 | outlines.add(outline); |
| 92 | } | 96 | } |
| 93 | 97 | ||
| 94 | - /// @param os OutputStream to send the object to | ||
| 95 | @override | 98 | @override |
| 96 | void _prepare() { | 99 | void _prepare() { |
| 97 | super._prepare(); | 100 | super._prepare(); |
| @@ -162,22 +165,15 @@ class PdfOutline extends PdfObject { | @@ -162,22 +165,15 @@ class PdfOutline extends PdfObject { | ||
| 162 | 165 | ||
| 163 | /// This is called by children to find their position in this outlines | 166 | /// This is called by children to find their position in this outlines |
| 164 | /// tree. | 167 | /// tree. |
| 165 | - /// | ||
| 166 | - /// @param outline [PdfOutline] to search for | ||
| 167 | - /// @return index within Vector | ||
| 168 | int getIndex(PdfOutline outline) => outlines.indexOf(outline); | 168 | int getIndex(PdfOutline outline) => outlines.indexOf(outline); |
| 169 | 169 | ||
| 170 | /// Returns the last index in this outline | 170 | /// Returns the last index in this outline |
| 171 | - /// @return last index in outline | ||
| 172 | int getLast() => outlines.length - 1; | 171 | int getLast() => outlines.length - 1; |
| 173 | 172 | ||
| 174 | /// Returns the outline at a specified position. | 173 | /// Returns the outline at a specified position. |
| 175 | - /// @param i index | ||
| 176 | - /// @return the node at index i | ||
| 177 | PdfOutline getNode(int i) => outlines[i]; | 174 | PdfOutline getNode(int i) => outlines[i]; |
| 178 | 175 | ||
| 179 | /// Returns the total number of descendants below this one. | 176 | /// Returns the total number of descendants below this one. |
| 180 | - /// @return the number of descendants below this one | ||
| 181 | int descendants() { | 177 | int descendants() { |
| 182 | var c = outlines.length; // initially the number of kids | 178 | var c = outlines.length; // initially the number of kids |
| 183 | 179 |
| @@ -16,10 +16,9 @@ | @@ -16,10 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// PDF document writer | ||
| 19 | class PdfOutput { | 20 | class PdfOutput { |
| 20 | /// This creates a Pdf [PdfStream] | 21 | /// This creates a Pdf [PdfStream] |
| 21 | - /// | ||
| 22 | - /// @param os The output stream to write the Pdf file to. | ||
| 23 | PdfOutput(this.os) { | 22 | PdfOutput(this.os) { |
| 24 | os.putString('%PDF-1.4\n'); | 23 | os.putString('%PDF-1.4\n'); |
| 25 | os.putBytes(const <int>[0x25, 0xC2, 0xA5, 0xC2, 0xB1, 0xC3, 0xAB, 0x0A]); | 24 | os.putBytes(const <int>[0x25, 0xC2, 0xA5, 0xC2, 0xB1, 0xC3, 0xAB, 0x0A]); |
| @@ -44,8 +43,6 @@ class PdfOutput { | @@ -44,8 +43,6 @@ class PdfOutput { | ||
| 44 | PdfSignature signatureID; | 43 | PdfSignature signatureID; |
| 45 | 44 | ||
| 46 | /// This method writes a [PdfObject] to the stream. | 45 | /// This method writes a [PdfObject] to the stream. |
| 47 | - /// | ||
| 48 | - /// @param ob [PdfObject] Object to write | ||
| 49 | void write(PdfObject ob) { | 46 | void write(PdfObject ob) { |
| 50 | // Check the object to see if it's one that is needed in the trailer | 47 | // Check the object to see if it's one that is needed in the trailer |
| 51 | // object | 48 | // object |
| @@ -146,8 +143,6 @@ class PdfOutput { | @@ -146,8 +143,6 @@ class PdfOutput { | ||
| 146 | } | 143 | } |
| 147 | 144 | ||
| 148 | /// Writes a block of references to the Pdf file | 145 | /// Writes a block of references to the Pdf file |
| 149 | - /// @param firstid ID of the first reference in this block | ||
| 150 | - /// @param block Vector containing the references in this block | ||
| 151 | void writeblock(int firstid, List<PdfXref> block) { | 146 | void writeblock(int firstid, List<PdfXref> block) { |
| 152 | os.putString('$firstid ${block.length}\n'); | 147 | os.putString('$firstid ${block.length}\n'); |
| 153 | 148 |
| @@ -16,14 +16,10 @@ | @@ -16,14 +16,10 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Page object, which will hold any contents for this page. | ||
| 19 | class PdfPage extends PdfObject with PdfGraphicStream { | 20 | class PdfPage extends PdfObject with PdfGraphicStream { |
| 20 | /// This constructs a Page object, which will hold any contents for this | 21 | /// This constructs a Page object, which will hold any contents for this |
| 21 | /// page. | 22 | /// page. |
| 22 | - /// | ||
| 23 | - /// Once created, it is added to the document via the [PdfDocument.add()] method. | ||
| 24 | - /// | ||
| 25 | - /// @param pdfDocument Document | ||
| 26 | - /// @param pageFormat [PdfPageFormat] describing the page size | ||
| 27 | PdfPage(PdfDocument pdfDocument, {this.pageFormat = PdfPageFormat.standard}) | 23 | PdfPage(PdfDocument pdfDocument, {this.pageFormat = PdfPageFormat.standard}) |
| 28 | : super(pdfDocument, '/Page') { | 24 | : super(pdfDocument, '/Page') { |
| 29 | pdfDocument.pdfPageList.pages.add(this); | 25 | pdfDocument.pdfPageList.pages.add(this); |
| @@ -46,8 +42,6 @@ class PdfPage extends PdfObject with PdfGraphicStream { | @@ -46,8 +42,6 @@ class PdfPage extends PdfObject with PdfGraphicStream { | ||
| 46 | /// on to this page. If a previous [PdfGraphics] object was used, this object | 42 | /// on to this page. If a previous [PdfGraphics] object was used, this object |
| 47 | /// is appended to the page, and will be drawn over the top of any previous | 43 | /// is appended to the page, and will be drawn over the top of any previous |
| 48 | /// objects. | 44 | /// objects. |
| 49 | - /// | ||
| 50 | - /// @return a new [PdfGraphics] object to be used to draw this page. | ||
| 51 | PdfGraphics getGraphics() { | 45 | PdfGraphics getGraphics() { |
| 52 | final stream = PdfObjectStream(pdfDocument); | 46 | final stream = PdfObjectStream(pdfDocument); |
| 53 | final g = PdfGraphics(this, stream.buf); | 47 | final g = PdfGraphics(this, stream.buf); |
| @@ -56,11 +50,6 @@ class PdfPage extends PdfObject with PdfGraphicStream { | @@ -56,11 +50,6 @@ class PdfPage extends PdfObject with PdfGraphicStream { | ||
| 56 | } | 50 | } |
| 57 | 51 | ||
| 58 | /// This adds an Annotation to the page. | 52 | /// This adds an Annotation to the page. |
| 59 | - /// | ||
| 60 | - /// As with other objects, the annotation must be added to the pdf | ||
| 61 | - /// document using [PdfDocument.add()] before adding to the page. | ||
| 62 | - /// | ||
| 63 | - /// @param ob Annotation to add. | ||
| 64 | void addAnnotation(PdfObject ob) { | 53 | void addAnnotation(PdfObject ob) { |
| 65 | annotations.add(ob); | 54 | annotations.add(ob); |
| 66 | } | 55 | } |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// PdfPageList object | ||
| 19 | class PdfPageList extends PdfObject { | 20 | class PdfPageList extends PdfObject { |
| 20 | /// This constructs a [PdfPageList] object. | 21 | /// This constructs a [PdfPageList] object. |
| 21 | PdfPageList(PdfDocument pdfDocument) : super(pdfDocument, '/Pages'); | 22 | PdfPageList(PdfDocument pdfDocument) : super(pdfDocument, '/Pages'); |
| @@ -24,8 +25,6 @@ class PdfPageList extends PdfObject { | @@ -24,8 +25,6 @@ class PdfPageList extends PdfObject { | ||
| 24 | final List<PdfPage> pages = <PdfPage>[]; | 25 | final List<PdfPage> pages = <PdfPage>[]; |
| 25 | 26 | ||
| 26 | /// This returns a specific page. Used by the Pdf class. | 27 | /// This returns a specific page. Used by the Pdf class. |
| 27 | - /// @param page page number to return | ||
| 28 | - /// @return [PdfPage] at that position | ||
| 29 | PdfPage getPage(int page) => pages[page]; | 28 | PdfPage getPage(int page) => pages[page]; |
| 30 | 29 | ||
| 31 | @override | 30 | @override |
| @@ -16,10 +16,15 @@ | @@ -16,10 +16,15 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Generate a TTF font copy with the minimal number of glyph to embedd | ||
| 20 | +/// into the PDF document | ||
| 21 | +/// | ||
| 19 | /// https://opentype.js.org/ | 22 | /// https://opentype.js.org/ |
| 20 | class TtfWriter { | 23 | class TtfWriter { |
| 24 | + /// Create a Truetype Writer object | ||
| 21 | TtfWriter(this.ttf); | 25 | TtfWriter(this.ttf); |
| 22 | 26 | ||
| 27 | + /// original truetype file | ||
| 23 | final TtfParser ttf; | 28 | final TtfParser ttf; |
| 24 | 29 | ||
| 25 | int _calcTableChecksum(ByteData table) { | 30 | int _calcTableChecksum(ByteData table) { |
| @@ -52,6 +57,7 @@ class TtfWriter { | @@ -52,6 +57,7 @@ class TtfWriter { | ||
| 52 | return offset + ((align - (offset % align)) % align); | 57 | return offset + ((align - (offset % align)) % align); |
| 53 | } | 58 | } |
| 54 | 59 | ||
| 60 | + /// Write this list of glyphs | ||
| 55 | Uint8List withChars(List<int> chars) { | 61 | Uint8List withChars(List<int> chars) { |
| 56 | final tables = <String, Uint8List>{}; | 62 | final tables = <String, Uint8List>{}; |
| 57 | final tablesLength = <String, int>{}; | 63 | final tablesLength = <String, int>{}; |
| @@ -16,6 +16,14 @@ | @@ -16,6 +16,14 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Type 1 font object. | ||
| 20 | +/// this font is a default PDF font available in all PDF readers, | ||
| 21 | +/// but it's only compatible with western latin languages. | ||
| 22 | +/// | ||
| 23 | +/// To use other languages, use a [PdfTtfFont] that contains the | ||
| 24 | +/// glyph for the language you will use. | ||
| 25 | +/// | ||
| 26 | +/// see https://github.com/DavBfr/dart_pdf/wiki/Fonts-Management | ||
| 19 | class PdfType1Font extends PdfFont { | 27 | class PdfType1Font extends PdfFont { |
| 20 | /// Constructs a [PdfTtfFont] | 28 | /// Constructs a [PdfTtfFont] |
| 21 | PdfType1Font._create(PdfDocument pdfDocument, this.fontName, this.ascent, | 29 | PdfType1Font._create(PdfDocument pdfDocument, this.fontName, this.ascent, |
| @@ -27,7 +35,6 @@ class PdfType1Font extends PdfFont { | @@ -27,7 +35,6 @@ class PdfType1Font extends PdfFont { | ||
| 27 | }()), | 35 | }()), |
| 28 | super._create(pdfDocument, subtype: '/Type1'); | 36 | super._create(pdfDocument, subtype: '/Type1'); |
| 29 | 37 | ||
| 30 | - /// The font's real name | ||
| 31 | @override | 38 | @override |
| 32 | final String fontName; | 39 | final String fontName; |
| 33 | 40 | ||
| @@ -37,9 +44,9 @@ class PdfType1Font extends PdfFont { | @@ -37,9 +44,9 @@ class PdfType1Font extends PdfFont { | ||
| 37 | @override | 44 | @override |
| 38 | final double descent; | 45 | final double descent; |
| 39 | 46 | ||
| 47 | + /// Width of each glyph | ||
| 40 | final List<double> widths; | 48 | final List<double> widths; |
| 41 | 49 | ||
| 42 | - /// @param os OutputStream to send the object to | ||
| 43 | @override | 50 | @override |
| 44 | void _prepare() { | 51 | void _prepare() { |
| 45 | super._prepare(); | 52 | super._prepare(); |
| @@ -16,11 +16,15 @@ | @@ -16,11 +16,15 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Unicode character map object | ||
| 19 | class PdfUnicodeCmap extends PdfObjectStream { | 20 | class PdfUnicodeCmap extends PdfObjectStream { |
| 21 | + /// Create a Unicode character map object | ||
| 20 | PdfUnicodeCmap(PdfDocument pdfDocument, this.protect) : super(pdfDocument); | 22 | PdfUnicodeCmap(PdfDocument pdfDocument, this.protect) : super(pdfDocument); |
| 21 | 23 | ||
| 24 | + /// List of characters | ||
| 22 | final List<int> cmap = <int>[0]; | 25 | final List<int> cmap = <int>[0]; |
| 23 | 26 | ||
| 27 | + /// Protects the text from being "seen" by the PDF reader. | ||
| 24 | final bool protect; | 28 | final bool protect; |
| 25 | 29 | ||
| 26 | @override | 30 | @override |
| @@ -16,11 +16,9 @@ | @@ -16,11 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | part of pdf; | 17 | part of pdf; |
| 18 | 18 | ||
| 19 | +/// Cross-reference for a Pdf Object | ||
| 19 | class PdfXref { | 20 | class PdfXref { |
| 20 | /// Creates a cross-reference for a Pdf Object | 21 | /// Creates a cross-reference for a Pdf Object |
| 21 | - /// @param id The object's ID | ||
| 22 | - /// @param offset The object's position in the file | ||
| 23 | - /// @param generation The object's generation, usually 0 | ||
| 24 | PdfXref(this.id, this.offset, {this.generation = 0}); | 22 | PdfXref(this.id, this.offset, {this.generation = 0}); |
| 25 | 23 | ||
| 26 | /// The id of a Pdf Object | 24 | /// The id of a Pdf Object |
| @@ -32,7 +30,7 @@ class PdfXref { | @@ -32,7 +30,7 @@ class PdfXref { | ||
| 32 | /// The generation of the object, usually 0 | 30 | /// The generation of the object, usually 0 |
| 33 | int generation = 0; | 31 | int generation = 0; |
| 34 | 32 | ||
| 35 | - /// @return The xref in the format of the xref section in the Pdf file | 33 | + /// The xref in the format of the xref section in the Pdf file |
| 36 | String ref() { | 34 | String ref() { |
| 37 | final rs = offset.toString().padLeft(10, '0') + | 35 | final rs = offset.toString().padLeft(10, '0') + |
| 38 | ' ' + | 36 | ' ' + |
| @@ -149,8 +149,9 @@ class _BarcodeWidget extends Widget { | @@ -149,8 +149,9 @@ class _BarcodeWidget extends Widget { | ||
| 149 | } | 149 | } |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | +/// Draw a barcode using String data | ||
| 152 | class BarcodeWidget extends StatelessWidget { | 153 | class BarcodeWidget extends StatelessWidget { |
| 153 | - /// Draw a barcode using String data | 154 | + /// Create a BarcodeWidget |
| 154 | factory BarcodeWidget({ | 155 | factory BarcodeWidget({ |
| 155 | @required String data, | 156 | @required String data, |
| 156 | @required Barcode barcode, | 157 | @required Barcode barcode, |
-
Please register or login to post a comment