Showing
6 changed files
with
40 additions
and
15 deletions
@@ -65,6 +65,7 @@ abstract class PrintingPlatform extends PlatformInterface { | @@ -65,6 +65,7 @@ abstract class PrintingPlatform extends PlatformInterface { | ||
65 | String name, | 65 | String name, |
66 | PdfPageFormat format, | 66 | PdfPageFormat format, |
67 | bool dynamicLayout, | 67 | bool dynamicLayout, |
68 | + bool usePrinterSettings, | ||
68 | ); | 69 | ); |
69 | 70 | ||
70 | /// Enumerate the available printers on the system. | 71 | /// Enumerate the available printers on the system. |
@@ -171,6 +171,7 @@ class MethodChannelPrinting extends PrintingPlatform { | @@ -171,6 +171,7 @@ class MethodChannelPrinting extends PrintingPlatform { | ||
171 | String name, | 171 | String name, |
172 | PdfPageFormat format, | 172 | PdfPageFormat format, |
173 | bool dynamicLayout, | 173 | bool dynamicLayout, |
174 | + bool usePrinterSettings, | ||
174 | ) async { | 175 | ) async { |
175 | final job = _printJobs.add( | 176 | final job = _printJobs.add( |
176 | onCompleted: Completer<bool>(), | 177 | onCompleted: Completer<bool>(), |
@@ -188,6 +189,7 @@ class MethodChannelPrinting extends PrintingPlatform { | @@ -188,6 +189,7 @@ class MethodChannelPrinting extends PrintingPlatform { | ||
188 | 'marginRight': format.marginRight, | 189 | 'marginRight': format.marginRight, |
189 | 'marginBottom': format.marginBottom, | 190 | 'marginBottom': format.marginBottom, |
190 | 'dynamic': dynamicLayout, | 191 | 'dynamic': dynamicLayout, |
192 | + 'usePrinterSettings': usePrinterSettings, | ||
191 | }; | 193 | }; |
192 | 194 | ||
193 | await _channel.invokeMethod<int>('printPdf', params); | 195 | await _channel.invokeMethod<int>('printPdf', params); |
@@ -35,11 +35,16 @@ mixin Printing { | @@ -35,11 +35,16 @@ mixin Printing { | ||
35 | /// returns a future with a `bool` set to true if the document is printed | 35 | /// returns a future with a `bool` set to true if the document is printed |
36 | /// and false if it is canceled. | 36 | /// and false if it is canceled. |
37 | /// throws an exception in case of error | 37 | /// throws an exception in case of error |
38 | + /// | ||
39 | + /// Set [usePrinterSettings] to true to use the configuration defined by | ||
40 | + /// the printer. May not work for all the printers and can depend on the | ||
41 | + /// drivers. (Supported platforms: Windows) | ||
38 | static Future<bool> layoutPdf({ | 42 | static Future<bool> layoutPdf({ |
39 | required LayoutCallback onLayout, | 43 | required LayoutCallback onLayout, |
40 | String name = 'Document', | 44 | String name = 'Document', |
41 | PdfPageFormat format = PdfPageFormat.standard, | 45 | PdfPageFormat format = PdfPageFormat.standard, |
42 | bool dynamicLayout = true, | 46 | bool dynamicLayout = true, |
47 | + bool usePrinterSettings = false, | ||
43 | }) { | 48 | }) { |
44 | return PrintingPlatform.instance.layoutPdf( | 49 | return PrintingPlatform.instance.layoutPdf( |
45 | null, | 50 | null, |
@@ -47,6 +52,7 @@ mixin Printing { | @@ -47,6 +52,7 @@ mixin Printing { | ||
47 | name, | 52 | name, |
48 | format, | 53 | format, |
49 | dynamicLayout, | 54 | dynamicLayout, |
55 | + usePrinterSettings, | ||
50 | ); | 56 | ); |
51 | } | 57 | } |
52 | 58 | ||
@@ -118,12 +124,17 @@ mixin Printing { | @@ -118,12 +124,17 @@ mixin Printing { | ||
118 | /// | 124 | /// |
119 | /// This is not supported on all platforms. Check the result of [info] to | 125 | /// This is not supported on all platforms. Check the result of [info] to |
120 | /// find at runtime if this feature is available or not. | 126 | /// find at runtime if this feature is available or not. |
127 | + /// | ||
128 | + /// Set [usePrinterSettings] to true to use the configuration defined by | ||
129 | + /// the printer. May not work for all the printers and can depend on the | ||
130 | + /// drivers. (Supported platforms: Windows) | ||
121 | static FutureOr<bool> directPrintPdf({ | 131 | static FutureOr<bool> directPrintPdf({ |
122 | required Printer printer, | 132 | required Printer printer, |
123 | required LayoutCallback onLayout, | 133 | required LayoutCallback onLayout, |
124 | String name = 'Document', | 134 | String name = 'Document', |
125 | PdfPageFormat format = PdfPageFormat.standard, | 135 | PdfPageFormat format = PdfPageFormat.standard, |
126 | bool dynamicLayout = true, | 136 | bool dynamicLayout = true, |
137 | + bool usePrinterSettings = false, | ||
127 | }) { | 138 | }) { |
128 | return PrintingPlatform.instance.layoutPdf( | 139 | return PrintingPlatform.instance.layoutPdf( |
129 | printer, | 140 | printer, |
@@ -131,6 +142,7 @@ mixin Printing { | @@ -131,6 +142,7 @@ mixin Printing { | ||
131 | name, | 142 | name, |
132 | format, | 143 | format, |
133 | dynamicLayout, | 144 | dynamicLayout, |
145 | + usePrinterSettings, | ||
134 | ); | 146 | ); |
135 | } | 147 | } |
136 | 148 |
@@ -76,23 +76,30 @@ PrintJob::PrintJob(Printing* printing, int index) | @@ -76,23 +76,30 @@ PrintJob::PrintJob(Printing* printing, int index) | ||
76 | bool PrintJob::printPdf(std::string name, | 76 | bool PrintJob::printPdf(std::string name, |
77 | std::string printer, | 77 | std::string printer, |
78 | double width, | 78 | double width, |
79 | - double height) { | 79 | + double height, |
80 | + bool usePrinterSettings) { | ||
80 | documentName = name; | 81 | documentName = name; |
81 | 82 | ||
82 | - auto dm = static_cast<DEVMODE*>(GlobalAlloc(0, sizeof(DEVMODE))); | ||
83 | - ZeroMemory(dm, sizeof(DEVMODE)); | ||
84 | - dm->dmSize = sizeof(DEVMODE); | ||
85 | - dm->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH; | ||
86 | - dm->dmPaperSize = 0; | ||
87 | - if (width > height) { | ||
88 | - dm->dmOrientation = DMORIENT_LANDSCAPE; | ||
89 | - dm->dmPaperWidth = static_cast<short>(round(height * 254 / 72)); | ||
90 | - dm->dmPaperLength = static_cast<short>(round(width * 254 / 72)); | 83 | + auto dm; |
84 | + if (usePrinterSettings){ | ||
85 | + dm = NULL; // to use default driver config | ||
91 | } else { | 86 | } else { |
92 | - dm->dmOrientation = DMORIENT_PORTRAIT; | ||
93 | - dm->dmPaperWidth = static_cast<short>(round(width * 254 / 72)); | ||
94 | - dm->dmPaperLength = static_cast<short>(round(height * 254 / 72)); | 87 | + dm = static_cast<DEVMODE*>(GlobalAlloc(0, sizeof(DEVMODE))); |
88 | + ZeroMemory(dm, sizeof(DEVMODE)); | ||
89 | + dm->dmSize = sizeof(DEVMODE); | ||
90 | + dm->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_PAPERLENGTH | DM_PAPERWIDTH; | ||
91 | + dm->dmPaperSize = 0; | ||
92 | + if (width > height) { | ||
93 | + dm->dmOrientation = DMORIENT_LANDSCAPE; | ||
94 | + dm->dmPaperWidth = static_cast<short>(round(height * 254 / 72)); | ||
95 | + dm->dmPaperLength = static_cast<short>(round(width * 254 / 72)); | ||
96 | + } else { | ||
97 | + dm->dmOrientation = DMORIENT_PORTRAIT; | ||
98 | + dm->dmPaperWidth = static_cast<short>(round(width * 254 / 72)); | ||
99 | + dm->dmPaperLength = static_cast<short>(round(height * 254 / 72)); | ||
100 | + } | ||
95 | } | 101 | } |
102 | + | ||
96 | 103 | ||
97 | if (printer.empty()) { | 104 | if (printer.empty()) { |
98 | PRINTDLG pd; | 105 | PRINTDLG pd; |
@@ -74,7 +74,8 @@ class PrintJob { | @@ -74,7 +74,8 @@ class PrintJob { | ||
74 | bool printPdf(std::string name, | 74 | bool printPdf(std::string name, |
75 | std::string printer, | 75 | std::string printer, |
76 | double width, | 76 | double width, |
77 | - double height); | 77 | + double height, |
78 | + bool usePrinterSettings); | ||
78 | 79 | ||
79 | void writeJob(std::vector<uint8_t> data); | 80 | void writeJob(std::vector<uint8_t> data); |
80 | 81 |
@@ -78,10 +78,12 @@ class PrintingPlugin : public flutter::Plugin { | @@ -78,10 +78,12 @@ class PrintingPlugin : public flutter::Plugin { | ||
78 | arguments->find(flutter::EncodableValue("width"))->second); | 78 | arguments->find(flutter::EncodableValue("width"))->second); |
79 | auto height = std::get<double>( | 79 | auto height = std::get<double>( |
80 | arguments->find(flutter::EncodableValue("height"))->second); | 80 | arguments->find(flutter::EncodableValue("height"))->second); |
81 | + auto usePrinterSettings = std::get<bool>( | ||
82 | + arguments->find(flutter::EncodableValue("usePrinterSettings"))->second); | ||
81 | auto vJob = arguments->find(flutter::EncodableValue("job")); | 83 | auto vJob = arguments->find(flutter::EncodableValue("job")); |
82 | auto jobNum = vJob != arguments->end() ? std::get<int>(vJob->second) : -1; | 84 | auto jobNum = vJob != arguments->end() ? std::get<int>(vJob->second) : -1; |
83 | auto job = new PrintJob{&printing, jobNum}; | 85 | auto job = new PrintJob{&printing, jobNum}; |
84 | - auto res = job->printPdf(name, printer, width, height); | 86 | + auto res = job->printPdf(name, printer, width, height, usePrinterSettings); |
85 | if (!res) { | 87 | if (!res) { |
86 | delete job; | 88 | delete job; |
87 | } | 89 | } |
-
Please register or login to post a comment