Showing
25 changed files
with
189 additions
and
78 deletions
Makefile
0 → 100644
| 1 | + # Copyright (C) 2018, David PHAM-VAN <dev.nfet.net@gmail.com> | ||
| 2 | + # | ||
| 3 | + # This library is free software; you can redistribute it and/or | ||
| 4 | + # modify it under the terms of the GNU Lesser General | ||
| 5 | + # License as published by the Free Software Foundation; either | ||
| 6 | + # version 2.1 of the License, or (at your option) any later version. | ||
| 7 | + # | ||
| 8 | + # This library is distributed in the hope that it will be useful, | ||
| 9 | + # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 11 | + # Lesser General License for more details. | ||
| 12 | + # | ||
| 13 | + # You should have received a copy of the GNU Lesser General | ||
| 14 | + # License along with this library; if not, write to the Free Software | ||
| 15 | + # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 16 | + | ||
| 17 | + DART_SRC=$(shell find . -name '*.dart') | ||
| 18 | + CLNG_SRC=$(shell find . -name '*.java' -o -name '*.m' -o -name '*.h') | ||
| 19 | + | ||
| 20 | +all: pdf/open-sans.ttf format | ||
| 21 | + | ||
| 22 | +pdf/open-sans.ttf: | ||
| 23 | + curl -L "https://github.com/google/fonts/raw/master/apache/opensans/OpenSans-Regular.ttf" > $@ | ||
| 24 | + | ||
| 25 | +format: format-dart format-clang | ||
| 26 | + | ||
| 27 | +format-dart: $(DART_SRC) | ||
| 28 | + dartfmt -w $^ | ||
| 29 | + | ||
| 30 | +format-clang: $(CLNG_SRC) | ||
| 31 | + clang-format -style=Chromium -i $^ | ||
| 32 | + | ||
| 33 | +test: pdf/open-sans.ttf | ||
| 34 | + cd pdf; for TEST in $(shell cd pdf; find test -name '*.dart'); do dart $$TEST; done | ||
| 35 | + cd printing; flutter test | ||
| 36 | + | ||
| 37 | +clean: | ||
| 38 | + git clean -fdx | ||
| 39 | + | ||
| 40 | +.PHONY: test format format-dart format-clang clean |
| @@ -10,13 +10,13 @@ void main() { | @@ -10,13 +10,13 @@ void main() { | ||
| 10 | final top = page.pageFormat.height; | 10 | final top = page.pageFormat.height; |
| 11 | 11 | ||
| 12 | g.setColor(new PDFColor(0.0, 1.0, 1.0)); | 12 | g.setColor(new PDFColor(0.0, 1.0, 1.0)); |
| 13 | - g.drawRect(50.0 * PDFPageFormat.MM, top - 80.0 * PDFPageFormat.MM, 100.0 * PDFPageFormat.MM, | ||
| 14 | - 50.0 * PDFPageFormat.MM); | 13 | + g.drawRect(50.0 * PDFPageFormat.MM, top - 80.0 * PDFPageFormat.MM, |
| 14 | + 100.0 * PDFPageFormat.MM, 50.0 * PDFPageFormat.MM); | ||
| 15 | g.fillPath(); | 15 | g.fillPath(); |
| 16 | 16 | ||
| 17 | g.setColor(new PDFColor(0.3, 0.3, 0.3)); | 17 | g.setColor(new PDFColor(0.3, 0.3, 0.3)); |
| 18 | - g.drawString( | ||
| 19 | - font, 12.0, "Hello World!", 10.0 * PDFPageFormat.MM, top - 10.0 * PDFPageFormat.MM); | 18 | + g.drawString(font, 12.0, "Hello World!", 10.0 * PDFPageFormat.MM, |
| 19 | + top - 10.0 * PDFPageFormat.MM); | ||
| 20 | 20 | ||
| 21 | var file = new File('example.pdf'); | 21 | var file = new File('example.pdf'); |
| 22 | file.writeAsBytesSync(pdf.save()); | 22 | file.writeAsBytesSync(pdf.save()); |
| @@ -91,7 +91,8 @@ class PDFAnnot extends PDFObject { | @@ -91,7 +91,8 @@ class PDFAnnot extends PDFObject { | ||
| 91 | /// @param r Right coordinate | 91 | /// @param r Right coordinate |
| 92 | /// @param t Top coordinate | 92 | /// @param t Top coordinate |
| 93 | /// @param s Text for this annotation | 93 | /// @param s Text for this annotation |
| 94 | - factory PDFAnnot.text(PDFPage pdfPage, double l, double b, double r, double t, String s) => | 94 | + factory PDFAnnot.text( |
| 95 | + PDFPage pdfPage, double l, double b, double r, double t, String s) => | ||
| 95 | new PDFAnnot(pdfPage, type: "/Text", l: l, b: b, r: r, t: t, s: s); | 96 | new PDFAnnot(pdfPage, type: "/Text", l: l, b: b, r: r, t: t, s: s); |
| 96 | 97 | ||
| 97 | /// Creates a link annotation | 98 | /// Creates a link annotation |
| @@ -106,14 +107,23 @@ class PDFAnnot extends PDFObject { | @@ -106,14 +107,23 @@ class PDFAnnot extends PDFObject { | ||
| 106 | /// @param ft Top coordinate | 107 | /// @param ft Top coordinate |
| 107 | /// <br><br>Rectangle describing what part of the page to be displayed | 108 | /// <br><br>Rectangle describing what part of the page to be displayed |
| 108 | /// (must be in User Coordinates) | 109 | /// (must be in User Coordinates) |
| 109 | - factory PDFAnnot.link( | ||
| 110 | - PDFPage pdfPage, double l, double b, double r, double t, PDFObject dest, | 110 | + factory PDFAnnot.link(PDFPage pdfPage, double l, double b, double r, double t, |
| 111 | + PDFObject dest, | ||
| 111 | [double fl = FULL_PAGE, | 112 | [double fl = FULL_PAGE, |
| 112 | double fb = FULL_PAGE, | 113 | double fb = FULL_PAGE, |
| 113 | double fr = FULL_PAGE, | 114 | double fr = FULL_PAGE, |
| 114 | double ft = FULL_PAGE]) => | 115 | double ft = FULL_PAGE]) => |
| 115 | new PDFAnnot(pdfPage, | 116 | new PDFAnnot(pdfPage, |
| 116 | - type: "/Link", l: l, b: b, r: r, t: t, dest: dest, fl: fl, fb: fb, fr: fr, ft: ft); | 117 | + type: "/Link", |
| 118 | + l: l, | ||
| 119 | + b: b, | ||
| 120 | + r: r, | ||
| 121 | + t: t, | ||
| 122 | + dest: dest, | ||
| 123 | + fl: fl, | ||
| 124 | + fb: fb, | ||
| 125 | + fr: fr, | ||
| 126 | + ft: ft); | ||
| 117 | 127 | ||
| 118 | /// Sets the border for the annotation. By default, no border is defined. | 128 | /// Sets the border for the annotation. By default, no border is defined. |
| 119 | /// | 129 | /// |
| @@ -50,6 +50,7 @@ class PDFCatalog extends PDFObject { | @@ -50,6 +50,7 @@ class PDFCatalog extends PDFObject { | ||
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | // the /PageMode setting | 52 | // the /PageMode setting |
| 53 | - params["/PageMode"] = PDFStream.string(PDFDocument._PDF_PAGE_MODES[pageMode.index]); | 53 | + params["/PageMode"] = |
| 54 | + PDFStream.string(PDFDocument._PDF_PAGE_MODES[pageMode.index]); | ||
| 54 | } | 55 | } |
| 55 | } | 56 | } |
| @@ -29,8 +29,11 @@ class PDFColor { | @@ -29,8 +29,11 @@ class PDFColor { | ||
| 29 | PDFColor(this.r, this.g, this.b, [this.a = 1.0]); | 29 | PDFColor(this.r, this.g, this.b, [this.a = 1.0]); |
| 30 | 30 | ||
| 31 | factory PDFColor.fromInt(int color) { | 31 | factory PDFColor.fromInt(int color) { |
| 32 | - return new PDFColor((color >> 16 & 0xff) / 255.0, (color >> 8 & 0xff) / 255.0, | ||
| 33 | - (color & 0xff) / 255.0, (color >> 24 & 0xff) / 255.0); | 32 | + return new PDFColor( |
| 33 | + (color >> 16 & 0xff) / 255.0, | ||
| 34 | + (color >> 8 & 0xff) / 255.0, | ||
| 35 | + (color & 0xff) / 255.0, | ||
| 36 | + (color >> 24 & 0xff) / 255.0); | ||
| 34 | } | 37 | } |
| 35 | 38 | ||
| 36 | factory PDFColor.fromHex(String color) { | 39 | factory PDFColor.fromHex(String color) { |
| @@ -32,7 +32,8 @@ class PDFFont extends PDFObject { | @@ -32,7 +32,8 @@ class PDFFont extends PDFObject { | ||
| 32 | /// @param type The pdf type, ie /Type1 | 32 | /// @param type The pdf type, ie /Type1 |
| 33 | /// @param font The font name, ie Helvetica | 33 | /// @param font The font name, ie Helvetica |
| 34 | /// @param style The java.awt.Font style, ie: Font.PLAIN | 34 | /// @param style The java.awt.Font style, ie: Font.PLAIN |
| 35 | - PDFFont(PDFDocument pdfDocument, {this.subtype = "/Type1", this.baseFont = "/Helvetica"}) | 35 | + PDFFont(PDFDocument pdfDocument, |
| 36 | + {this.subtype = "/Type1", this.baseFont = "/Helvetica"}) | ||
| 36 | : super(pdfDocument, "/Font") { | 37 | : super(pdfDocument, "/Font") { |
| 37 | pdfDocument.fonts.add(this); | 38 | pdfDocument.fonts.add(this); |
| 38 | } | 39 | } |
| @@ -22,7 +22,8 @@ class PDFFontDescriptor extends PDFObject { | @@ -22,7 +22,8 @@ class PDFFontDescriptor extends PDFObject { | ||
| 22 | final PDFObjectStream file; | 22 | final PDFObjectStream file; |
| 23 | final PDFTTFFont ttfFont; | 23 | final PDFTTFFont ttfFont; |
| 24 | 24 | ||
| 25 | - PDFFontDescriptor(this.ttfFont, this.file) : super(ttfFont.pdfDocument, "/FontDescriptor"); | 25 | + PDFFontDescriptor(this.ttfFont, this.file) |
| 26 | + : super(ttfFont.pdfDocument, "/FontDescriptor"); | ||
| 26 | 27 | ||
| 27 | @override | 28 | @override |
| 28 | void prepare() { | 29 | void prepare() { |
| @@ -32,8 +33,12 @@ class PDFFontDescriptor extends PDFObject { | @@ -32,8 +33,12 @@ class PDFFontDescriptor extends PDFObject { | ||
| 32 | params["/FontFile2"] = file.ref(); | 33 | params["/FontFile2"] = file.ref(); |
| 33 | params["/Flags"] = PDFStream.intNum(32); | 34 | params["/Flags"] = PDFStream.intNum(32); |
| 34 | params["/FontBBox"] = new PDFStream() | 35 | params["/FontBBox"] = new PDFStream() |
| 35 | - ..putStringArray( | ||
| 36 | - [ttfFont.font.xMin, ttfFont.font.yMin, ttfFont.font.xMax, ttfFont.font.yMax]); | 36 | + ..putStringArray([ |
| 37 | + ttfFont.font.xMin, | ||
| 38 | + ttfFont.font.yMin, | ||
| 39 | + ttfFont.font.xMax, | ||
| 40 | + ttfFont.font.yMax | ||
| 41 | + ]); | ||
| 37 | params["/Ascent"] = PDFStream.intNum(ttfFont.font.ascent); | 42 | params["/Ascent"] = PDFStream.intNum(ttfFont.font.ascent); |
| 38 | params["/Descent"] = PDFStream.intNum(ttfFont.font.descent); | 43 | params["/Descent"] = PDFStream.intNum(ttfFont.font.descent); |
| 39 | params["/ItalicAngle"] = PDFStream.intNum(0); | 44 | params["/ItalicAngle"] = PDFStream.intNum(0); |
| @@ -133,10 +133,14 @@ class PDFGraphics { | @@ -133,10 +133,14 @@ class PDFGraphics { | ||
| 133 | // Starting point | 133 | // Starting point |
| 134 | moveTo(x, y - r2); | 134 | moveTo(x, y - r2); |
| 135 | 135 | ||
| 136 | - buf.putString("${x + m4 * r1} ${y - r2} ${x + r1} ${y - m4 * r2} ${x + r1} $y c\n"); | ||
| 137 | - buf.putString("${x + r1} ${y + m4 * r2} ${x + m4 * r1} ${y + r2} $x ${y + r2} c\n"); | ||
| 138 | - buf.putString("${x - m4 * r1} ${y + r2} ${x - r1} ${y + m4 * r2} ${x - r1} $y c\n"); | ||
| 139 | - buf.putString("${x - r1} ${y - m4 * r2} ${x - m4 * r1} ${y - r2} $x ${y - r2} c\n"); | 136 | + buf.putString( |
| 137 | + "${x + m4 * r1} ${y - r2} ${x + r1} ${y - m4 * r2} ${x + r1} $y c\n"); | ||
| 138 | + buf.putString( | ||
| 139 | + "${x + r1} ${y + m4 * r2} ${x + m4 * r1} ${y + r2} $x ${y + r2} c\n"); | ||
| 140 | + buf.putString( | ||
| 141 | + "${x - m4 * r1} ${y + r2} ${x - r1} ${y + m4 * r2} ${x - r1} $y c\n"); | ||
| 142 | + buf.putString( | ||
| 143 | + "${x - r1} ${y - m4 * r2} ${x - m4 * r1} ${y - r2} $x ${y - r2} c\n"); | ||
| 140 | } | 144 | } |
| 141 | 145 | ||
| 142 | /// We override Graphics.drawRect as it doesn't join the 4 lines. | 146 | /// We override Graphics.drawRect as it doesn't join the 4 lines. |
| @@ -174,7 +178,8 @@ class PDFGraphics { | @@ -174,7 +178,8 @@ class PDFGraphics { | ||
| 174 | /// | 178 | /// |
| 175 | /// @param c Color to use | 179 | /// @param c Color to use |
| 176 | void setColor(PDFColor color) { | 180 | void setColor(PDFColor color) { |
| 177 | - buf.putString("${color.r} ${color.g} ${color.b} rg ${color.r} ${color.g} ${color.b} RG\n"); | 181 | + buf.putString( |
| 182 | + "${color.r} ${color.g} ${color.b} rg ${color.r} ${color.g} ${color.b} RG\n"); | ||
| 178 | } | 183 | } |
| 179 | 184 | ||
| 180 | /// Set the transformation Matrix | 185 | /// Set the transformation Matrix |
| @@ -62,7 +62,11 @@ class PDFImage extends PDFXObject { | @@ -62,7 +62,11 @@ class PDFImage extends PDFXObject { | ||
| 62 | 62 | ||
| 63 | if (alphaChannel == false && alpha) { | 63 | if (alphaChannel == false && alpha) { |
| 64 | var _sMask = new PDFImage(pdfDocument, | 64 | var _sMask = new PDFImage(pdfDocument, |
| 65 | - image: image, width: width, height: height, alpha: alpha, alphaChannel: true); | 65 | + image: image, |
| 66 | + width: width, | ||
| 67 | + height: height, | ||
| 68 | + alpha: alpha, | ||
| 69 | + alphaChannel: true); | ||
| 66 | params["/SMask"] = PDFStream.string("${_sMask.objser} 0 R"); | 70 | params["/SMask"] = PDFStream.string("${_sMask.objser} 0 R"); |
| 67 | } | 71 | } |
| 68 | 72 |
| @@ -34,7 +34,8 @@ class PDFObject { | @@ -34,7 +34,8 @@ class PDFObject { | ||
| 34 | /// This is usually called by extensors to this class, and sets the | 34 | /// This is usually called by extensors to this class, and sets the |
| 35 | /// PDF Object Type | 35 | /// PDF Object Type |
| 36 | /// @param type the PDF Object Type | 36 | /// @param type the PDF Object Type |
| 37 | - PDFObject(this.pdfDocument, [String type]) : objser = pdfDocument._genSerial() { | 37 | + PDFObject(this.pdfDocument, [String type]) |
| 38 | + : objser = pdfDocument._genSerial() { | ||
| 38 | if (type != null) { | 39 | if (type != null) { |
| 39 | params["/Type"] = PDFStream.string(type); | 40 | params["/Type"] = PDFStream.string(type); |
| 40 | } | 41 | } |
| @@ -52,7 +52,8 @@ class PDFOutline extends PDFObject { | @@ -52,7 +52,8 @@ class PDFOutline extends PDFObject { | ||
| 52 | /// @param b bottom coordinate | 52 | /// @param b bottom coordinate |
| 53 | /// @param r right coordinate | 53 | /// @param r right coordinate |
| 54 | /// @param t top coordinate | 54 | /// @param t top coordinate |
| 55 | - PDFOutline(PDFDocument pdfDocument, {this.title, this.dest, this.l, this.b, this.r, this.t}) | 55 | + PDFOutline(PDFDocument pdfDocument, |
| 56 | + {this.title, this.dest, this.l, this.b, this.r, this.t}) | ||
| 56 | : super(pdfDocument, "/Outlines"); | 57 | : super(pdfDocument, "/Outlines"); |
| 57 | 58 | ||
| 58 | /// This method creates an outline, and attaches it to this one. | 59 | /// This method creates an outline, and attaches it to this one. |
| @@ -48,7 +48,8 @@ class PDFPage extends PDFObject { | @@ -48,7 +48,8 @@ class PDFPage extends PDFObject { | ||
| 48 | /// @see PageFormat#LANDSCAPE | 48 | /// @see PageFormat#LANDSCAPE |
| 49 | /// @see PageFormat#REVERSE_LANDSCAPE | 49 | /// @see PageFormat#REVERSE_LANDSCAPE |
| 50 | /// @param pageFormat PageFormat describing the page size | 50 | /// @param pageFormat PageFormat describing the page size |
| 51 | - PDFPage(PDFDocument pdfDocument, {this.pageFormat}) : super(pdfDocument, "/Page") { | 51 | + PDFPage(PDFDocument pdfDocument, {this.pageFormat}) |
| 52 | + : super(pdfDocument, "/Page") { | ||
| 52 | pdfDocument.pdfPageList.pages.add(this); | 53 | pdfDocument.pdfPageList.pages.add(this); |
| 53 | if (pageFormat == null) pageFormat = PDFPageFormat.A4; | 54 | if (pageFormat == null) pageFormat = PDFPageFormat.A4; |
| 54 | } | 55 | } |
| @@ -125,8 +126,8 @@ class PDFPage extends PDFObject { | @@ -125,8 +126,8 @@ class PDFPage extends PDFObject { | ||
| 125 | var xy2 = cxy(x + w, y); | 126 | var xy2 = cxy(x + w, y); |
| 126 | var xy3 = cxy(vx, vy + vh); | 127 | var xy3 = cxy(vx, vy + vh); |
| 127 | var xy4 = cxy(vx + vw, vy); | 128 | var xy4 = cxy(vx + vw, vy); |
| 128 | - PDFAnnot ob = | ||
| 129 | - new PDFAnnot.link(this, xy1.w, xy1.h, xy2.w, xy2.h, dest, xy3.w, xy3.h, xy4.w, xy4.h); | 129 | + PDFAnnot ob = new PDFAnnot.link( |
| 130 | + this, xy1.w, xy1.h, xy2.w, xy2.h, dest, xy3.w, xy3.h, xy4.w, xy4.h); | ||
| 130 | return ob; | 131 | return ob; |
| 131 | } | 132 | } |
| 132 | 133 | ||
| @@ -138,7 +139,8 @@ class PDFPage extends PDFObject { | @@ -138,7 +139,8 @@ class PDFPage extends PDFObject { | ||
| 138 | /// @param w Width of region | 139 | /// @param w Width of region |
| 139 | /// @param h Height coordinate of region | 140 | /// @param h Height coordinate of region |
| 140 | /// @return PDFOutline object created, for addSubOutline if required. | 141 | /// @return PDFOutline object created, for addSubOutline if required. |
| 141 | - PDFOutline addOutline(String title, {double x, double y, double w, double h}) { | 142 | + PDFOutline addOutline(String title, |
| 143 | + {double x, double y, double w, double h}) { | ||
| 142 | PDFPoint xy1 = cxy(x, y + h); | 144 | PDFPoint xy1 = cxy(x, y + h); |
| 143 | PDFPoint xy2 = cxy(x + w, y); | 145 | PDFPoint xy2 = cxy(x + w, y); |
| 144 | PDFOutline outline = new PDFOutline(pdfDocument, | 146 | PDFOutline outline = new PDFOutline(pdfDocument, |
| @@ -107,7 +107,8 @@ class PDFStream { | @@ -107,7 +107,8 @@ class PDFStream { | ||
| 107 | putString("[" + values.join(" ") + "]"); | 107 | putString("[" + values.join(" ") + "]"); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | - static PDFStream array(List<PDFStream> values) => new PDFStream()..putArray(values); | 110 | + static PDFStream array(List<PDFStream> values) => |
| 111 | + new PDFStream()..putArray(values); | ||
| 111 | 112 | ||
| 112 | void putDictionary(Map<String, PDFStream> values) { | 113 | void putDictionary(Map<String, PDFStream> values) { |
| 113 | putString("<< "); | 114 | putString("<< "); |
| @@ -86,8 +86,8 @@ class TTFParser { | @@ -86,8 +86,8 @@ class TTFParser { | ||
| 86 | int offset = bytes.getUint16(pos + 10); | 86 | int offset = bytes.getUint16(pos + 10); |
| 87 | pos += 12; | 87 | pos += 12; |
| 88 | if (platformID == 1 && nameID == 6) { | 88 | if (platformID == 1 && nameID == 6) { |
| 89 | - _fontName = utf8 | ||
| 90 | - .decode(bytes.buffer.asUint8List(basePosition + stringOffset + offset, length)); | 89 | + _fontName = utf8.decode(bytes.buffer |
| 90 | + .asUint8List(basePosition + stringOffset + offset, length)); | ||
| 91 | } | 91 | } |
| 92 | } | 92 | } |
| 93 | } | 93 | } |
| @@ -164,7 +164,8 @@ class TTFParser { | @@ -164,7 +164,8 @@ class TTFParser { | ||
| 164 | if (idRangeOffset == 0) { | 164 | if (idRangeOffset == 0) { |
| 165 | glyphIndex = (idDelta + c) % 65536; | 165 | glyphIndex = (idDelta + c) % 65536; |
| 166 | } else { | 166 | } else { |
| 167 | - final glyphIndexAddress = idRangeOffset + 2 * (c - startCode) + idRangeOffsetAddress; | 167 | + final glyphIndexAddress = |
| 168 | + idRangeOffset + 2 * (c - startCode) + idRangeOffsetAddress; | ||
| 168 | glyphIndex = bytes.getUint16(glyphIndexAddress); | 169 | glyphIndex = bytes.getUint16(glyphIndexAddress); |
| 169 | } | 170 | } |
| 170 | charToGlyphIndexMap[c] = glyphIndex; | 171 | charToGlyphIndexMap[c] = glyphIndex; |
| @@ -36,8 +36,9 @@ class PDFXref { | @@ -36,8 +36,9 @@ class PDFXref { | ||
| 36 | 36 | ||
| 37 | /// @return The xref in the format of the xref section in the PDF file | 37 | /// @return The xref in the format of the xref section in the PDF file |
| 38 | String ref() { | 38 | String ref() { |
| 39 | - String rs = | ||
| 40 | - offset.toString().padLeft(10, '0') + " " + generation.toString().padLeft(5, '0'); | 39 | + String rs = offset.toString().padLeft(10, '0') + |
| 40 | + " " + | ||
| 41 | + generation.toString().padLeft(5, '0'); | ||
| 41 | 42 | ||
| 42 | if (generation == 65535) return rs + " f "; | 43 | if (generation == 65535) return rs + " f "; |
| 43 | return rs + " n "; | 44 | return rs + " n "; |
| @@ -20,5 +20,4 @@ package net.nfet.flutter.printing; | @@ -20,5 +20,4 @@ package net.nfet.flutter.printing; | ||
| 20 | 20 | ||
| 21 | import android.support.v4.content.FileProvider; | 21 | import android.support.v4.content.FileProvider; |
| 22 | 22 | ||
| 23 | -public class PrintFileProvider extends FileProvider { | ||
| 24 | -} | 23 | +public class PrintFileProvider extends FileProvider {} |
| @@ -82,19 +82,19 @@ public class PrintingPlugin implements MethodCallHandler { | @@ -82,19 +82,19 @@ public class PrintingPlugin implements MethodCallHandler { | ||
| 82 | } | 82 | } |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | - | ||
| 86 | private void printPdf(final byte[] badgeData) { | 85 | private void printPdf(final byte[] badgeData) { |
| 87 | PrintDocumentAdapter pda = new PrintDocumentAdapter() { | 86 | PrintDocumentAdapter pda = new PrintDocumentAdapter() { |
| 88 | PrintedPdfDocument mPdfDocument; | 87 | PrintedPdfDocument mPdfDocument; |
| 89 | 88 | ||
| 90 | @Override | 89 | @Override |
| 91 | - public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor parcelFileDescriptor, CancellationSignal cancellationSignal, WriteResultCallback writeResultCallback) { | ||
| 92 | - | 90 | + public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor parcelFileDescriptor, |
| 91 | + CancellationSignal cancellationSignal, | ||
| 92 | + WriteResultCallback writeResultCallback) { | ||
| 93 | OutputStream output = null; | 93 | OutputStream output = null; |
| 94 | try { | 94 | try { |
| 95 | output = new FileOutputStream(parcelFileDescriptor.getFileDescriptor()); | 95 | output = new FileOutputStream(parcelFileDescriptor.getFileDescriptor()); |
| 96 | output.write(badgeData, 0, badgeData.length); | 96 | output.write(badgeData, 0, badgeData.length); |
| 97 | - writeResultCallback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); | 97 | + writeResultCallback.onWriteFinished(new PageRange[] {PageRange.ALL_PAGES}); |
| 98 | } catch (IOException e) { | 98 | } catch (IOException e) { |
| 99 | e.printStackTrace(); | 99 | e.printStackTrace(); |
| 100 | } finally { | 100 | } finally { |
| @@ -109,7 +109,9 @@ public class PrintingPlugin implements MethodCallHandler { | @@ -109,7 +109,9 @@ public class PrintingPlugin implements MethodCallHandler { | ||
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | @Override | 111 | @Override |
| 112 | - public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { | 112 | + public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, |
| 113 | + CancellationSignal cancellationSignal, LayoutResultCallback callback, | ||
| 114 | + Bundle extras) { | ||
| 113 | // Create a new PdfDocument with the requested page attributes | 115 | // Create a new PdfDocument with the requested page attributes |
| 114 | mPdfDocument = new PrintedPdfDocument(activity, newAttributes); | 116 | mPdfDocument = new PrintedPdfDocument(activity, newAttributes); |
| 115 | 117 | ||
| @@ -120,17 +122,18 @@ public class PrintingPlugin implements MethodCallHandler { | @@ -120,17 +122,18 @@ public class PrintingPlugin implements MethodCallHandler { | ||
| 120 | } | 122 | } |
| 121 | 123 | ||
| 122 | // Return print information to print framework | 124 | // Return print information to print framework |
| 123 | - PrintDocumentInfo info = new PrintDocumentInfo | ||
| 124 | - .Builder("badge.pdf") | 125 | + PrintDocumentInfo info = |
| 126 | + new PrintDocumentInfo.Builder("badge.pdf") | ||
| 125 | .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) | 127 | .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) |
| 126 | - .setPageCount(1).build(); | 128 | + .setPageCount(1) |
| 129 | + .build(); | ||
| 127 | // Content layout reflow is complete | 130 | // Content layout reflow is complete |
| 128 | callback.onLayoutFinished(info, true); | 131 | callback.onLayoutFinished(info, true); |
| 129 | } | 132 | } |
| 130 | 133 | ||
| 131 | @Override | 134 | @Override |
| 132 | public void onFinish() { | 135 | public void onFinish() { |
| 133 | - //noinspection ResultOfMethodCallIgnored | 136 | + // noinspection ResultOfMethodCallIgnored |
| 134 | } | 137 | } |
| 135 | }; | 138 | }; |
| 136 | String jobName = "Badge"; | 139 | String jobName = "Badge"; |
| @@ -139,8 +142,8 @@ public class PrintingPlugin implements MethodCallHandler { | @@ -139,8 +142,8 @@ public class PrintingPlugin implements MethodCallHandler { | ||
| 139 | 142 | ||
| 140 | private void sharePdf(byte[] data) { | 143 | private void sharePdf(byte[] data) { |
| 141 | try { | 144 | try { |
| 142 | - | ||
| 143 | - final File externalFilesDirectory = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); | 145 | + final File externalFilesDirectory = |
| 146 | + activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); | ||
| 144 | File shareFile = File.createTempFile("badge", ".pdf", externalFilesDirectory); | 147 | File shareFile = File.createTempFile("badge", ".pdf", externalFilesDirectory); |
| 145 | 148 | ||
| 146 | FileOutputStream stream = new FileOutputStream(shareFile); | 149 | FileOutputStream stream = new FileOutputStream(shareFile); |
| @@ -148,7 +151,8 @@ public class PrintingPlugin implements MethodCallHandler { | @@ -148,7 +151,8 @@ public class PrintingPlugin implements MethodCallHandler { | ||
| 148 | stream.close(); | 151 | stream.close(); |
| 149 | 152 | ||
| 150 | Uri apkURI = FileProvider.getUriForFile(activity, | 153 | Uri apkURI = FileProvider.getUriForFile(activity, |
| 151 | - activity.getApplicationContext().getPackageName() + ".flutter.printing", shareFile); | 154 | + activity.getApplicationContext().getPackageName() + ".flutter.printing", |
| 155 | + shareFile); | ||
| 152 | 156 | ||
| 153 | Intent shareIntent = new Intent(); | 157 | Intent shareIntent = new Intent(); |
| 154 | shareIntent.setAction(Intent.ACTION_SEND); | 158 | shareIntent.setAction(Intent.ACTION_SEND); |
| @@ -162,5 +166,4 @@ public class PrintingPlugin implements MethodCallHandler { | @@ -162,5 +166,4 @@ public class PrintingPlugin implements MethodCallHandler { | ||
| 162 | e.printStackTrace(); | 166 | e.printStackTrace(); |
| 163 | } | 167 | } |
| 164 | } | 168 | } |
| 165 | - | ||
| 166 | } | 169 | } |
| @@ -22,8 +22,8 @@ class MyApp extends StatelessWidget { | @@ -22,8 +22,8 @@ class MyApp extends StatelessWidget { | ||
| 22 | g.fillPath(); | 22 | g.fillPath(); |
| 23 | 23 | ||
| 24 | g.setColor(new PDFColor(0.3, 0.3, 0.3)); | 24 | g.setColor(new PDFColor(0.3, 0.3, 0.3)); |
| 25 | - g.drawString( | ||
| 26 | - font, 12.0, "Hello World!", 10.0 * PDFPageFormat.MM, top - 10.0 * PDFPageFormat.MM); | 25 | + g.drawString(font, 12.0, "Hello World!", 10.0 * PDFPageFormat.MM, |
| 26 | + top - 10.0 * PDFPageFormat.MM); | ||
| 27 | 27 | ||
| 28 | return pdf; | 28 | return pdf; |
| 29 | } | 29 | } |
| @@ -39,9 +39,12 @@ class MyApp extends StatelessWidget { | @@ -39,9 +39,12 @@ class MyApp extends StatelessWidget { | ||
| 39 | final pdf = _generateDocument(); | 39 | final pdf = _generateDocument(); |
| 40 | 40 | ||
| 41 | // Calculate the widget center for iPad sharing popup position | 41 | // Calculate the widget center for iPad sharing popup position |
| 42 | - final RenderBox referenceBox = shareWidget.currentContext.findRenderObject(); | ||
| 43 | - final topLeft = referenceBox.localToGlobal(referenceBox.paintBounds.topLeft); | ||
| 44 | - final bottomRight = referenceBox.localToGlobal(referenceBox.paintBounds.bottomRight); | 42 | + final RenderBox referenceBox = |
| 43 | + shareWidget.currentContext.findRenderObject(); | ||
| 44 | + final topLeft = | ||
| 45 | + referenceBox.localToGlobal(referenceBox.paintBounds.topLeft); | ||
| 46 | + final bottomRight = | ||
| 47 | + referenceBox.localToGlobal(referenceBox.paintBounds.bottomRight); | ||
| 45 | final bounds = new Rect.fromPoints(topLeft, bottomRight); | 48 | final bounds = new Rect.fromPoints(topLeft, bottomRight); |
| 46 | 49 | ||
| 47 | Printing.sharePdf(document: pdf, bounds: bounds); | 50 | Printing.sharePdf(document: pdf, bounds: bounds); |
| @@ -57,9 +60,12 @@ class MyApp extends StatelessWidget { | @@ -57,9 +60,12 @@ class MyApp extends StatelessWidget { | ||
| 57 | child: new Column( | 60 | child: new Column( |
| 58 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, | 61 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, |
| 59 | children: <Widget>[ | 62 | children: <Widget>[ |
| 60 | - new RaisedButton(child: new Text('Print Document'), onPressed: _printPdf), | ||
| 61 | new RaisedButton( | 63 | new RaisedButton( |
| 62 | - key: shareWidget, child: new Text('Share Document'), onPressed: _sharePdf), | 64 | + child: new Text('Print Document'), onPressed: _printPdf), |
| 65 | + new RaisedButton( | ||
| 66 | + key: shareWidget, | ||
| 67 | + child: new Text('Share Document'), | ||
| 68 | + onPressed: _sharePdf), | ||
| 63 | ], | 69 | ], |
| 64 | ), | 70 | ), |
| 65 | ), | 71 | ), |
| @@ -18,5 +18,6 @@ | @@ -18,5 +18,6 @@ | ||
| 18 | 18 | ||
| 19 | #import <Flutter/Flutter.h> | 19 | #import <Flutter/Flutter.h> |
| 20 | 20 | ||
| 21 | -@interface PrintingPlugin : NSObject<FlutterPlugin, UIPrintInteractionControllerDelegate> | 21 | +@interface PrintingPlugin |
| 22 | + : NSObject <FlutterPlugin, UIPrintInteractionControllerDelegate> | ||
| 22 | @end | 23 | @end |
| @@ -20,8 +20,8 @@ | @@ -20,8 +20,8 @@ | ||
| 20 | 20 | ||
| 21 | @implementation PrintingPlugin | 21 | @implementation PrintingPlugin |
| 22 | + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar { | 22 | + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar { |
| 23 | - FlutterMethodChannel* channel = [FlutterMethodChannel | ||
| 24 | - methodChannelWithName:@"printing" | 23 | + FlutterMethodChannel* channel = |
| 24 | + [FlutterMethodChannel methodChannelWithName:@"printing" | ||
| 25 | binaryMessenger:[registrar messenger]]; | 25 | binaryMessenger:[registrar messenger]]; |
| 26 | PrintingPlugin* instance = [[PrintingPlugin alloc] init]; | 26 | PrintingPlugin* instance = [[PrintingPlugin alloc] init]; |
| 27 | [registrar addMethodCallDelegate:instance channel:channel]; | 27 | [registrar addMethodCallDelegate:instance channel:channel]; |
| @@ -32,8 +32,7 @@ | @@ -32,8 +32,7 @@ | ||
| 32 | [self printPdf:[call.arguments objectForKey:@"doc"]]; | 32 | [self printPdf:[call.arguments objectForKey:@"doc"]]; |
| 33 | result(@1); | 33 | result(@1); |
| 34 | } else if ([@"sharePdf" isEqualToString:call.method]) { | 34 | } else if ([@"sharePdf" isEqualToString:call.method]) { |
| 35 | - [self | ||
| 36 | - sharePdf:[call.arguments objectForKey:@"doc"] | 35 | + [self sharePdf:[call.arguments objectForKey:@"doc"] |
| 37 | withSourceRect:CGRectMake( | 36 | withSourceRect:CGRectMake( |
| 38 | [[call.arguments objectForKey:@"x"] floatValue], | 37 | [[call.arguments objectForKey:@"x"] floatValue], |
| 39 | [[call.arguments objectForKey:@"y"] floatValue], | 38 | [[call.arguments objectForKey:@"y"] floatValue], |
| @@ -45,7 +44,7 @@ | @@ -45,7 +44,7 @@ | ||
| 45 | } | 44 | } |
| 46 | } | 45 | } |
| 47 | 46 | ||
| 48 | -- (void)printPdf:(nonnull FlutterStandardTypedData *)data { | 47 | +- (void)printPdf:(nonnull FlutterStandardTypedData*)data { |
| 49 | BOOL printing = [UIPrintInteractionController isPrintingAvailable]; | 48 | BOOL printing = [UIPrintInteractionController isPrintingAvailable]; |
| 50 | if (!printing) { | 49 | if (!printing) { |
| 51 | NSLog(@"printing not available"); | 50 | NSLog(@"printing not available"); |
| @@ -53,23 +52,30 @@ | @@ -53,23 +52,30 @@ | ||
| 53 | } | 52 | } |
| 54 | 53 | ||
| 55 | BOOL dataOK = [UIPrintInteractionController canPrintData:[data data]]; | 54 | BOOL dataOK = [UIPrintInteractionController canPrintData:[data data]]; |
| 56 | - if (!dataOK) NSLog(@"data not ok to be printed"); | 55 | + if (!dataOK) |
| 56 | + NSLog(@"data not ok to be printed"); | ||
| 57 | 57 | ||
| 58 | - UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; | 58 | + UIPrintInteractionController* controller = |
| 59 | + [UIPrintInteractionController sharedPrintController]; | ||
| 59 | [controller setDelegate:self]; | 60 | [controller setDelegate:self]; |
| 60 | [controller setPrintingItem:[data data]]; | 61 | [controller setPrintingItem:[data data]]; |
| 61 | 62 | ||
| 62 | - UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { | ||
| 63 | - if(!completed && error){ | ||
| 64 | - NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, (unsigned int)error.code); | 63 | + UIPrintInteractionCompletionHandler completionHandler = |
| 64 | + ^(UIPrintInteractionController* printController, BOOL completed, | ||
| 65 | + NSError* error) { | ||
| 66 | + if (!completed && error) { | ||
| 67 | + NSLog(@"FAILED! due to error in domain %@ with error code %u", | ||
| 68 | + error.domain, (unsigned int)error.code); | ||
| 65 | } | 69 | } |
| 66 | }; | 70 | }; |
| 67 | 71 | ||
| 68 | [controller presentAnimated:YES completionHandler:completionHandler]; | 72 | [controller presentAnimated:YES completionHandler:completionHandler]; |
| 69 | } | 73 | } |
| 70 | 74 | ||
| 71 | -- (void)sharePdf:(nonnull FlutterStandardTypedData *)data withSourceRect:(CGRect)rect { | ||
| 72 | - NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; | 75 | +- (void)sharePdf:(nonnull FlutterStandardTypedData*)data |
| 76 | + withSourceRect:(CGRect)rect { | ||
| 77 | + NSURL* tmpDirURL = | ||
| 78 | + [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; | ||
| 73 | 79 | ||
| 74 | CFUUIDRef uuid = CFUUIDCreate(NULL); | 80 | CFUUIDRef uuid = CFUUIDCreate(NULL); |
| 75 | assert(uuid != NULL); | 81 | assert(uuid != NULL); |
| @@ -77,27 +83,38 @@ | @@ -77,27 +83,38 @@ | ||
| 77 | CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid); | 83 | CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid); |
| 78 | assert(uuidStr != NULL); | 84 | assert(uuidStr != NULL); |
| 79 | 85 | ||
| 80 | - NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:[NSString stringWithFormat:@"pdf-%@", uuidStr]] URLByAppendingPathExtension:@"pdf"]; | 86 | + NSURL* fileURL = [[tmpDirURL |
| 87 | + URLByAppendingPathComponent:[NSString | ||
| 88 | + stringWithFormat:@"pdf-%@", uuidStr]] | ||
| 89 | + URLByAppendingPathExtension:@"pdf"]; | ||
| 81 | assert(fileURL != NULL); | 90 | assert(fileURL != NULL); |
| 82 | 91 | ||
| 83 | CFRelease(uuidStr); | 92 | CFRelease(uuidStr); |
| 84 | CFRelease(uuid); | 93 | CFRelease(uuid); |
| 85 | 94 | ||
| 86 | - NSString *path = [fileURL path]; | 95 | + NSString* path = [fileURL path]; |
| 87 | 96 | ||
| 88 | - NSError *error; | ||
| 89 | - if (![[data data] writeToFile:path options:NSDataWritingAtomic error:&error]) { | 97 | + NSError* error; |
| 98 | + if (! | ||
| 99 | + [[data data] writeToFile:path options:NSDataWritingAtomic error:&error]) { | ||
| 90 | NSLog(@"sharePdf error: %@", [error localizedDescription]); | 100 | NSLog(@"sharePdf error: %@", [error localizedDescription]); |
| 91 | return; | 101 | return; |
| 92 | } | 102 | } |
| 93 | 103 | ||
| 94 | - UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[fileURL] applicationActivities:nil]; | 104 | + UIActivityViewController* activityViewController = |
| 105 | + [[UIActivityViewController alloc] initWithActivityItems:@[ fileURL ] | ||
| 106 | + applicationActivities:nil]; | ||
| 95 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { | 107 | if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
| 96 | - UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController; | ||
| 97 | - activityViewController.popoverPresentationController.sourceView = controller.view; | 108 | + UIViewController* controller = |
| 109 | + [UIApplication sharedApplication].keyWindow.rootViewController; | ||
| 110 | + activityViewController.popoverPresentationController.sourceView = | ||
| 111 | + controller.view; | ||
| 98 | activityViewController.popoverPresentationController.sourceRect = rect; | 112 | activityViewController.popoverPresentationController.sourceRect = rect; |
| 99 | } | 113 | } |
| 100 | - [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityViewController animated:YES completion:nil]; | 114 | + [[UIApplication sharedApplication].keyWindow.rootViewController |
| 115 | + presentViewController:activityViewController | ||
| 116 | + animated:YES | ||
| 117 | + completion:nil]; | ||
| 101 | } | 118 | } |
| 102 | 119 | ||
| 103 | @end | 120 | @end |
| @@ -38,7 +38,8 @@ class Printing { | @@ -38,7 +38,8 @@ class Printing { | ||
| 38 | await _channel.invokeMethod('printPdf', params); | 38 | await _channel.invokeMethod('printPdf', params); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | - static Future<Null> sharePdf({PDFDocument document, List<int> bytes, Rect bounds}) async { | 41 | + static Future<Null> sharePdf( |
| 42 | + {PDFDocument document, List<int> bytes, Rect bounds}) async { | ||
| 42 | assert(document != null || bytes != null); | 43 | assert(document != null || bytes != null); |
| 43 | assert(!(document == null && bytes == null)); | 44 | assert(!(document == null && bytes == null)); |
| 44 | 45 |
| @@ -2,7 +2,7 @@ name: printing | @@ -2,7 +2,7 @@ name: printing | ||
| 2 | author: David PHAM-VAN <dev.nfet.net@gmail.com> | 2 | author: David PHAM-VAN <dev.nfet.net@gmail.com> |
| 3 | description: Plugin that allows Flutter apps to generate and print documents to android or ios compatible printers | 3 | description: Plugin that allows Flutter apps to generate and print documents to android or ios compatible printers |
| 4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/printing | 4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/printing |
| 5 | -version: 1.0.2 | 5 | +version: 1.0.3 |
| 6 | 6 | ||
| 7 | environment: | 7 | environment: |
| 8 | sdk: ">=1.19.0 <3.0.0" | 8 | sdk: ">=1.19.0 <3.0.0" |
-
Please register or login to post a comment