| Total Complexity | 124 |
| Total Lines | 1322 |
| Duplicated Lines | 0 % |
| Changes | 37 | ||
| Bugs | 0 | Features | 2 |
Complex classes like Page often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Page, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 32 | class Page extends \YetiForcePDF\Objects\Basic\DictionaryObject |
||
| 33 | { |
||
| 34 | /** |
||
| 35 | * @var int |
||
| 36 | */ |
||
| 37 | protected $group = 0; |
||
| 38 | /** |
||
| 39 | * {@inheritdoc} |
||
| 40 | */ |
||
| 41 | protected $dictionaryType = 'Page'; |
||
| 42 | /** |
||
| 43 | * Object name. |
||
| 44 | * |
||
| 45 | * @var string |
||
| 46 | */ |
||
| 47 | protected $name = 'Page'; |
||
| 48 | |||
| 49 | /** |
||
| 50 | * @var int page number |
||
| 51 | */ |
||
| 52 | protected $pageNumber = 1; |
||
| 53 | /** |
||
| 54 | * @var int page count |
||
| 55 | */ |
||
| 56 | protected $pageCount = 1; |
||
| 57 | /** |
||
| 58 | * Page resources. |
||
| 59 | * |
||
| 60 | * @var array |
||
| 61 | */ |
||
| 62 | protected $resources = []; |
||
| 63 | /** |
||
| 64 | * Page content streams. |
||
| 65 | * |
||
| 66 | * @var StreamObject |
||
| 67 | */ |
||
| 68 | protected $contentStream; |
||
| 69 | /** |
||
| 70 | * Portrait page orientation. |
||
| 71 | */ |
||
| 72 | const ORIENTATION_PORTRAIT = 'P'; |
||
| 73 | /** |
||
| 74 | * Landscape page orientation. |
||
| 75 | */ |
||
| 76 | const ORIENTATION_LANDSCAPE = 'L'; |
||
| 77 | /** |
||
| 78 | * After page breaking box was cut below. |
||
| 79 | */ |
||
| 80 | const CUT_BELOW = 1; |
||
| 81 | /** |
||
| 82 | * After page breaking box was cut above. |
||
| 83 | */ |
||
| 84 | const CUT_ABOVE = 2; |
||
| 85 | /** |
||
| 86 | * Current page format. |
||
| 87 | * |
||
| 88 | * @var string |
||
| 89 | */ |
||
| 90 | protected $format; |
||
| 91 | /** |
||
| 92 | * Current page orientation. |
||
| 93 | * |
||
| 94 | * @var string |
||
| 95 | */ |
||
| 96 | protected $orientation; |
||
| 97 | /** |
||
| 98 | * User unit - to calculate page dpi. |
||
| 99 | * |
||
| 100 | * @var float |
||
| 101 | */ |
||
| 102 | protected $userUnit = 1.0; |
||
| 103 | /** |
||
| 104 | * Page margins. |
||
| 105 | * |
||
| 106 | * @var array |
||
| 107 | */ |
||
| 108 | protected $margins; |
||
| 109 | /** |
||
| 110 | * Page dimensions. |
||
| 111 | * |
||
| 112 | * @var BoxDimensions |
||
| 113 | */ |
||
| 114 | protected $dimensions; |
||
| 115 | /** |
||
| 116 | * Page outer dimensions. |
||
| 117 | * |
||
| 118 | * @var BoxDimensions |
||
| 119 | */ |
||
| 120 | protected $outerDimensions; |
||
| 121 | /** |
||
| 122 | * @var Coordinates |
||
| 123 | */ |
||
| 124 | protected $coordinates; |
||
| 125 | /** |
||
| 126 | * Don't group this 'group' names. |
||
| 127 | * |
||
| 128 | * @var string[] |
||
| 129 | */ |
||
| 130 | protected $doNotGroup = []; |
||
| 131 | /** |
||
| 132 | * @var Box main box with content |
||
| 133 | */ |
||
| 134 | protected $box; |
||
| 135 | |||
| 136 | public static $pageFormats = [ |
||
| 137 | // ISO 216 A Series + 2 SIS 014711 extensions |
||
| 138 | 'A0' => [2383.937, 3370.394], // = ( 841 x 1189 ) mm = ( 33.11 x 46.81 ) in |
||
| 139 | 'A1' => [1683.780, 2383.937], // = ( 594 x 841 ) mm = ( 23.39 x 33.11 ) in |
||
| 140 | 'A2' => [1190.551, 1683.780], // = ( 420 x 594 ) mm = ( 16.54 x 23.39 ) in |
||
| 141 | 'A3' => [841.890, 1190.551], // = ( 297 x 420 ) mm = ( 11.69 x 16.54 ) in |
||
| 142 | 'A4' => [595.276, 841.890], // = ( 210 x 297 ) mm = ( 8.27 x 11.69 ) in |
||
| 143 | 'A5' => [419.528, 595.276], // = ( 148 x 210 ) mm = ( 5.83 x 8.27 ) in |
||
| 144 | 'A6' => [297.638, 419.528], // = ( 105 x 148 ) mm = ( 4.13 x 5.83 ) in |
||
| 145 | 'A7' => [209.764, 297.638], // = ( 74 x 105 ) mm = ( 2.91 x 4.13 ) in |
||
| 146 | 'A8' => [147.402, 209.764], // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in |
||
| 147 | 'A9' => [104.882, 147.402], // = ( 37 x 52 ) mm = ( 1.46 x 2.05 ) in |
||
| 148 | 'A10' => [73.701, 104.882], // = ( 26 x 37 ) mm = ( 1.02 x 1.46 ) in |
||
| 149 | 'A11' => [51.024, 73.701], // = ( 18 x 26 ) mm = ( 0.71 x 1.02 ) in |
||
| 150 | 'A12' => [36.850, 51.024], // = ( 13 x 18 ) mm = ( 0.51 x 0.71 ) in |
||
| 151 | // ISO 216 B Series + 2 SIS 014711 extensions |
||
| 152 | 'B0' => [2834.646, 4008.189], // = ( 1000 x 1414 ) mm = ( 39.37 x 55.67 ) in |
||
| 153 | 'B1' => [2004.094, 2834.646], // = ( 707 x 1000 ) mm = ( 27.83 x 39.37 ) in |
||
| 154 | 'B2' => [1417.323, 2004.094], // = ( 500 x 707 ) mm = ( 19.69 x 27.83 ) in |
||
| 155 | 'B3' => [1000.630, 1417.323], // = ( 353 x 500 ) mm = ( 13.90 x 19.69 ) in |
||
| 156 | 'B4' => [708.661, 1000.630], // = ( 250 x 353 ) mm = ( 9.84 x 13.90 ) in |
||
| 157 | 'B5' => [498.898, 708.661], // = ( 176 x 250 ) mm = ( 6.93 x 9.84 ) in |
||
| 158 | 'B6' => [354.331, 498.898], // = ( 125 x 176 ) mm = ( 4.92 x 6.93 ) in |
||
| 159 | 'B7' => [249.449, 354.331], // = ( 88 x 125 ) mm = ( 3.46 x 4.92 ) in |
||
| 160 | 'B8' => [175.748, 249.449], // = ( 62 x 88 ) mm = ( 2.44 x 3.46 ) in |
||
| 161 | 'B9' => [124.724, 175.748], // = ( 44 x 62 ) mm = ( 1.73 x 2.44 ) in |
||
| 162 | 'B10' => [87.874, 124.724], // = ( 31 x 44 ) mm = ( 1.22 x 1.73 ) in |
||
| 163 | 'B11' => [62.362, 87.874], // = ( 22 x 31 ) mm = ( 0.87 x 1.22 ) in |
||
| 164 | 'B12' => [42.520, 62.362], // = ( 15 x 22 ) mm = ( 0.59 x 0.87 ) in |
||
| 165 | // ISO 216 C Series + 2 SIS 014711 extensions + 5 EXTENSION |
||
| 166 | 'C0' => [2599.370, 3676.535], // = ( 917 x 1297 ) mm = ( 36.10 x 51.06 ) in |
||
| 167 | 'C1' => [1836.850, 2599.370], // = ( 648 x 917 ) mm = ( 25.51 x 36.10 ) in |
||
| 168 | 'C2' => [1298.268, 1836.850], // = ( 458 x 648 ) mm = ( 18.03 x 25.51 ) in |
||
| 169 | 'C3' => [918.425, 1298.268], // = ( 324 x 458 ) mm = ( 12.76 x 18.03 ) in |
||
| 170 | 'C4' => [649.134, 918.425], // = ( 229 x 324 ) mm = ( 9.02 x 12.76 ) in |
||
| 171 | 'C5' => [459.213, 649.134], // = ( 162 x 229 ) mm = ( 6.38 x 9.02 ) in |
||
| 172 | 'C6' => [323.150, 459.213], // = ( 114 x 162 ) mm = ( 4.49 x 6.38 ) in |
||
| 173 | 'C7' => [229.606, 323.150], // = ( 81 x 114 ) mm = ( 3.19 x 4.49 ) in |
||
| 174 | 'C8' => [161.575, 229.606], // = ( 57 x 81 ) mm = ( 2.24 x 3.19 ) in |
||
| 175 | 'C9' => [113.386, 161.575], // = ( 40 x 57 ) mm = ( 1.57 x 2.24 ) in |
||
| 176 | 'C10' => [79.370, 113.386], // = ( 28 x 40 ) mm = ( 1.10 x 1.57 ) in |
||
| 177 | 'C11' => [56.693, 79.370], // = ( 20 x 28 ) mm = ( 0.79 x 1.10 ) in |
||
| 178 | 'C12' => [39.685, 56.693], // = ( 14 x 20 ) mm = ( 0.55 x 0.79 ) in |
||
| 179 | 'C76' => [229.606, 459.213], // = ( 81 x 162 ) mm = ( 3.19 x 6.38 ) in |
||
| 180 | 'DL' => [311.811, 623.622], // = ( 110 x 220 ) mm = ( 4.33 x 8.66 ) in |
||
| 181 | 'DLE' => [323.150, 637.795], // = ( 114 x 225 ) mm = ( 4.49 x 8.86 ) in |
||
| 182 | 'DLX' => [340.158, 666.142], // = ( 120 x 235 ) mm = ( 4.72 x 9.25 ) in |
||
| 183 | 'DLP' => [280.630, 595.276], // = ( 99 x 210 ) mm = ( 3.90 x 8.27 ) in (1/3 A4) |
||
| 184 | // SIS 014711 E Series |
||
| 185 | 'E0' => [2491.654, 3517.795], // = ( 879 x 1241 ) mm = ( 34.61 x 48.86 ) in |
||
| 186 | 'E1' => [1757.480, 2491.654], // = ( 620 x 879 ) mm = ( 24.41 x 34.61 ) in |
||
| 187 | 'E2' => [1247.244, 1757.480], // = ( 440 x 620 ) mm = ( 17.32 x 24.41 ) in |
||
| 188 | 'E3' => [878.740, 1247.244], // = ( 310 x 440 ) mm = ( 12.20 x 17.32 ) in |
||
| 189 | 'E4' => [623.622, 878.740], // = ( 220 x 310 ) mm = ( 8.66 x 12.20 ) in |
||
| 190 | 'E5' => [439.370, 623.622], // = ( 155 x 220 ) mm = ( 6.10 x 8.66 ) in |
||
| 191 | 'E6' => [311.811, 439.370], // = ( 110 x 155 ) mm = ( 4.33 x 6.10 ) in |
||
| 192 | 'E7' => [221.102, 311.811], // = ( 78 x 110 ) mm = ( 3.07 x 4.33 ) in |
||
| 193 | 'E8' => [155.906, 221.102], // = ( 55 x 78 ) mm = ( 2.17 x 3.07 ) in |
||
| 194 | 'E9' => [110.551, 155.906], // = ( 39 x 55 ) mm = ( 1.54 x 2.17 ) in |
||
| 195 | 'E10' => [76.535, 110.551], // = ( 27 x 39 ) mm = ( 1.06 x 1.54 ) in |
||
| 196 | 'E11' => [53.858, 76.535], // = ( 19 x 27 ) mm = ( 0.75 x 1.06 ) in |
||
| 197 | 'E12' => [36.850, 53.858], // = ( 13 x 19 ) mm = ( 0.51 x 0.75 ) in |
||
| 198 | // SIS 014711 G Series |
||
| 199 | 'G0' => [2715.591, 3838.110], // = ( 958 x 1354 ) mm = ( 37.72 x 53.31 ) in |
||
| 200 | 'G1' => [1919.055, 2715.591], // = ( 677 x 958 ) mm = ( 26.65 x 37.72 ) in |
||
| 201 | 'G2' => [1357.795, 1919.055], // = ( 479 x 677 ) mm = ( 18.86 x 26.65 ) in |
||
| 202 | 'G3' => [958.110, 1357.795], // = ( 338 x 479 ) mm = ( 13.31 x 18.86 ) in |
||
| 203 | 'G4' => [677.480, 958.110], // = ( 239 x 338 ) mm = ( 9.41 x 13.31 ) in |
||
| 204 | 'G5' => [479.055, 677.480], // = ( 169 x 239 ) mm = ( 6.65 x 9.41 ) in |
||
| 205 | 'G6' => [337.323, 479.055], // = ( 119 x 169 ) mm = ( 4.69 x 6.65 ) in |
||
| 206 | 'G7' => [238.110, 337.323], // = ( 84 x 119 ) mm = ( 3.31 x 4.69 ) in |
||
| 207 | 'G8' => [167.244, 238.110], // = ( 59 x 84 ) mm = ( 2.32 x 3.31 ) in |
||
| 208 | 'G9' => [119.055, 167.244], // = ( 42 x 59 ) mm = ( 1.65 x 2.32 ) in |
||
| 209 | 'G10' => [82.205, 119.055], // = ( 29 x 42 ) mm = ( 1.14 x 1.65 ) in |
||
| 210 | 'G11' => [59.528, 82.205], // = ( 21 x 29 ) mm = ( 0.83 x 1.14 ) in |
||
| 211 | 'G12' => [39.685, 59.528], // = ( 14 x 21 ) mm = ( 0.55 x 0.83 ) in |
||
| 212 | // ISO Press |
||
| 213 | 'RA0' => [2437.795, 3458.268], // = ( 860 x 1220 ) mm = ( 33.86 x 48.03 ) in |
||
| 214 | 'RA1' => [1729.134, 2437.795], // = ( 610 x 860 ) mm = ( 24.02 x 33.86 ) in |
||
| 215 | 'RA2' => [1218.898, 1729.134], // = ( 430 x 610 ) mm = ( 16.93 x 24.02 ) in |
||
| 216 | 'RA3' => [864.567, 1218.898], // = ( 305 x 430 ) mm = ( 12.01 x 16.93 ) in |
||
| 217 | 'RA4' => [609.449, 864.567], // = ( 215 x 305 ) mm = ( 8.46 x 12.01 ) in |
||
| 218 | 'SRA0' => [2551.181, 3628.346], // = ( 900 x 1280 ) mm = ( 35.43 x 50.39 ) in |
||
| 219 | 'SRA1' => [1814.173, 2551.181], // = ( 640 x 900 ) mm = ( 25.20 x 35.43 ) in |
||
| 220 | 'SRA2' => [1275.591, 1814.173], // = ( 450 x 640 ) mm = ( 17.72 x 25.20 ) in |
||
| 221 | 'SRA3' => [907.087, 1275.591], // = ( 320 x 450 ) mm = ( 12.60 x 17.72 ) in |
||
| 222 | 'SRA4' => [637.795, 907.087], // = ( 225 x 320 ) mm = ( 8.86 x 12.60 ) in |
||
| 223 | // German DIN 476 |
||
| 224 | '4A0' => [4767.874, 6740.787], // = ( 1682 x 2378 ) mm = ( 66.22 x 93.62 ) in |
||
| 225 | '2A0' => [3370.394, 4767.874], // = ( 1189 x 1682 ) mm = ( 46.81 x 66.22 ) in |
||
| 226 | // Variations on the ISO Standard |
||
| 227 | 'A2_EXTRA' => [1261.417, 1754.646], // = ( 445 x 619 ) mm = ( 17.52 x 24.37 ) in |
||
| 228 | 'A3+' => [932.598, 1369.134], // = ( 329 x 483 ) mm = ( 12.95 x 19.02 ) in |
||
| 229 | 'A3_EXTRA' => [912.756, 1261.417], // = ( 322 x 445 ) mm = ( 12.68 x 17.52 ) in |
||
| 230 | 'A3_SUPER' => [864.567, 1440.000], // = ( 305 x 508 ) mm = ( 12.01 x 20.00 ) in |
||
| 231 | 'SUPER_A3' => [864.567, 1380.472], // = ( 305 x 487 ) mm = ( 12.01 x 19.17 ) in |
||
| 232 | 'A4_EXTRA' => [666.142, 912.756], // = ( 235 x 322 ) mm = ( 9.25 x 12.68 ) in |
||
| 233 | 'A4_SUPER' => [649.134, 912.756], // = ( 229 x 322 ) mm = ( 9.02 x 12.68 ) in |
||
| 234 | 'SUPER_A4' => [643.465, 1009.134], // = ( 227 x 356 ) mm = ( 8.94 x 14.02 ) in |
||
| 235 | 'A4_LONG' => [595.276, 986.457], // = ( 210 x 348 ) mm = ( 8.27 x 13.70 ) in |
||
| 236 | 'F4' => [595.276, 935.433], // = ( 210 x 330 ) mm = ( 8.27 x 12.99 ) in |
||
| 237 | 'SO_B5_EXTRA' => [572.598, 782.362], // = ( 202 x 276 ) mm = ( 7.95 x 10.87 ) in |
||
| 238 | 'A5_EXTRA' => [490.394, 666.142], // = ( 173 x 235 ) mm = ( 6.81 x 9.25 ) in |
||
| 239 | // ANSI Series |
||
| 240 | 'ANSI_E' => [2448.000, 3168.000], // = ( 864 x 1118 ) mm = ( 34.00 x 44.00 ) in |
||
| 241 | 'ANSI_D' => [1584.000, 2448.000], // = ( 559 x 864 ) mm = ( 22.00 x 34.00 ) in |
||
| 242 | 'ANSI_C' => [1224.000, 1584.000], // = ( 432 x 559 ) mm = ( 17.00 x 22.00 ) in |
||
| 243 | 'ANSI_B' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in |
||
| 244 | 'ANSI_A' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in |
||
| 245 | // Traditional 'Loose' North American Paper Sizes |
||
| 246 | 'USLEDGER' => [1224.000, 792.000], // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in |
||
| 247 | 'LEDGER' => [1224.000, 792.000], // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in |
||
| 248 | 'ORGANIZERK' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in |
||
| 249 | 'BIBLE' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in |
||
| 250 | 'USTABLOID' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in |
||
| 251 | 'TABLOID' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in |
||
| 252 | 'ORGANIZERM' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in |
||
| 253 | 'USLETTER' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in |
||
| 254 | 'LETTER' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in |
||
| 255 | 'USLEGAL' => [612.000, 1008.000], // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in |
||
| 256 | 'LEGAL' => [612.000, 1008.000], // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in |
||
| 257 | 'GOVERNMENTLETTER' => [576.000, 756.000], // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in |
||
| 258 | 'GLETTER' => [576.000, 756.000], // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in |
||
| 259 | 'JUNIORLEGAL' => [576.000, 360.000], // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in |
||
| 260 | 'JLEGAL' => [576.000, 360.000], // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in |
||
| 261 | // Other North American Paper Sizes |
||
| 262 | 'QUADDEMY' => [2520.000, 3240.000], // = ( 889 x 1143 ) mm = ( 35.00 x 45.00 ) in |
||
| 263 | 'SUPER_B' => [936.000, 1368.000], // = ( 330 x 483 ) mm = ( 13.00 x 19.00 ) in |
||
| 264 | 'QUARTO' => [648.000, 792.000], // = ( 229 x 279 ) mm = ( 9.00 x 11.00 ) in |
||
| 265 | 'GOVERNMENTLEGAL' => [612.000, 936.000], // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in |
||
| 266 | 'FOLIO' => [612.000, 936.000], // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in |
||
| 267 | 'MONARCH' => [522.000, 756.000], // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in |
||
| 268 | 'EXECUTIVE' => [522.000, 756.000], // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in |
||
| 269 | 'ORGANIZERL' => [396.000, 612.000], // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in |
||
| 270 | 'STATEMENT' => [396.000, 612.000], // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in |
||
| 271 | 'MEMO' => [396.000, 612.000], // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in |
||
| 272 | 'FOOLSCAP' => [595.440, 936.000], // = ( 210 x 330 ) mm = ( 8.27 x 13.00 ) in |
||
| 273 | 'COMPACT' => [306.000, 486.000], // = ( 108 x 171 ) mm = ( 4.25 x 6.75 ) in |
||
| 274 | 'ORGANIZERJ' => [198.000, 360.000], // = ( 70 x 127 ) mm = ( 2.75 x 5.00 ) in |
||
| 275 | // Canadian standard CAN 2-9.60M |
||
| 276 | 'P1' => [1587.402, 2437.795], // = ( 560 x 860 ) mm = ( 22.05 x 33.86 ) in |
||
| 277 | 'P2' => [1218.898, 1587.402], // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in |
||
| 278 | 'P3' => [793.701, 1218.898], // = ( 280 x 430 ) mm = ( 11.02 x 16.93 ) in |
||
| 279 | 'P4' => [609.449, 793.701], // = ( 215 x 280 ) mm = ( 8.46 x 11.02 ) in |
||
| 280 | 'P5' => [396.850, 609.449], // = ( 140 x 215 ) mm = ( 5.51 x 8.46 ) in |
||
| 281 | 'P6' => [303.307, 396.850], // = ( 107 x 140 ) mm = ( 4.21 x 5.51 ) in |
||
| 282 | // North American Architectural Sizes |
||
| 283 | 'ARCH_E' => [2592.000, 3456.000], // = ( 914 x 1219 ) mm = ( 36.00 x 48.00 ) in |
||
| 284 | 'ARCH_E1' => [2160.000, 3024.000], // = ( 762 x 1067 ) mm = ( 30.00 x 42.00 ) in |
||
| 285 | 'ARCH_D' => [1728.000, 2592.000], // = ( 610 x 914 ) mm = ( 24.00 x 36.00 ) in |
||
| 286 | 'BROADSHEET' => [1296.000, 1728.000], // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in |
||
| 287 | 'ARCH_C' => [1296.000, 1728.000], // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in |
||
| 288 | 'ARCH_B' => [864.000, 1296.000], // = ( 305 x 457 ) mm = ( 12.00 x 18.00 ) in |
||
| 289 | 'ARCH_A' => [648.000, 864.000], // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in |
||
| 290 | // -- North American Envelope Sizes |
||
| 291 | // - Announcement Envelopes |
||
| 292 | 'ANNENV_A2' => [314.640, 414.000], // = ( 111 x 146 ) mm = ( 4.37 x 5.75 ) in |
||
| 293 | 'ANNENV_A6' => [342.000, 468.000], // = ( 121 x 165 ) mm = ( 4.75 x 6.50 ) in |
||
| 294 | 'ANNENV_A7' => [378.000, 522.000], // = ( 133 x 184 ) mm = ( 5.25 x 7.25 ) in |
||
| 295 | 'ANNENV_A8' => [396.000, 584.640], // = ( 140 x 206 ) mm = ( 5.50 x 8.12 ) in |
||
| 296 | 'ANNENV_A10' => [450.000, 692.640], // = ( 159 x 244 ) mm = ( 6.25 x 9.62 ) in |
||
| 297 | 'ANNENV_SLIM' => [278.640, 638.640], // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in |
||
| 298 | // - Commercial Envelopes |
||
| 299 | 'COMMENV_N6_1/4' => [252.000, 432.000], // = ( 89 x 152 ) mm = ( 3.50 x 6.00 ) in |
||
| 300 | 'COMMENV_N6_3/4' => [260.640, 468.000], // = ( 92 x 165 ) mm = ( 3.62 x 6.50 ) in |
||
| 301 | 'COMMENV_N8' => [278.640, 540.000], // = ( 98 x 191 ) mm = ( 3.87 x 7.50 ) in |
||
| 302 | 'COMMENV_N9' => [278.640, 638.640], // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in |
||
| 303 | 'COMMENV_N10' => [296.640, 684.000], // = ( 105 x 241 ) mm = ( 4.12 x 9.50 ) in |
||
| 304 | 'COMMENV_N11' => [324.000, 746.640], // = ( 114 x 263 ) mm = ( 4.50 x 10.37 ) in |
||
| 305 | 'COMMENV_N12' => [342.000, 792.000], // = ( 121 x 279 ) mm = ( 4.75 x 11.00 ) in |
||
| 306 | 'COMMENV_N14' => [360.000, 828.000], // = ( 127 x 292 ) mm = ( 5.00 x 11.50 ) in |
||
| 307 | // - Catalogue Envelopes |
||
| 308 | 'CATENV_N1' => [432.000, 648.000], // = ( 152 x 229 ) mm = ( 6.00 x 9.00 ) in |
||
| 309 | 'CATENV_N1_3/4' => [468.000, 684.000], // = ( 165 x 241 ) mm = ( 6.50 x 9.50 ) in |
||
| 310 | 'CATENV_N2' => [468.000, 720.000], // = ( 165 x 254 ) mm = ( 6.50 x 10.00 ) in |
||
| 311 | 'CATENV_N3' => [504.000, 720.000], // = ( 178 x 254 ) mm = ( 7.00 x 10.00 ) in |
||
| 312 | 'CATENV_N6' => [540.000, 756.000], // = ( 191 x 267 ) mm = ( 7.50 x 10.50 ) in |
||
| 313 | 'CATENV_N7' => [576.000, 792.000], // = ( 203 x 279 ) mm = ( 8.00 x 11.00 ) in |
||
| 314 | 'CATENV_N8' => [594.000, 810.000], // = ( 210 x 286 ) mm = ( 8.25 x 11.25 ) in |
||
| 315 | 'CATENV_N9_1/2' => [612.000, 756.000], // = ( 216 x 267 ) mm = ( 8.50 x 10.50 ) in |
||
| 316 | 'CATENV_N9_3/4' => [630.000, 810.000], // = ( 222 x 286 ) mm = ( 8.75 x 11.25 ) in |
||
| 317 | 'CATENV_N10_1/2' => [648.000, 864.000], // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in |
||
| 318 | 'CATENV_N12_1/2' => [684.000, 900.000], // = ( 241 x 318 ) mm = ( 9.50 x 12.50 ) in |
||
| 319 | 'CATENV_N13_1/2' => [720.000, 936.000], // = ( 254 x 330 ) mm = ( 10.00 x 13.00 ) in |
||
| 320 | 'CATENV_N14_1/4' => [810.000, 882.000], // = ( 286 x 311 ) mm = ( 11.25 x 12.25 ) in |
||
| 321 | 'CATENV_N14_1/2' => [828.000, 1044.000], // = ( 292 x 368 ) mm = ( 11.50 x 14.50 ) in |
||
| 322 | // Japanese (JIS P 0138-61) Standard B-Series |
||
| 323 | 'JIS_B0' => [2919.685, 4127.244], // = ( 1030 x 1456 ) mm = ( 40.55 x 57.32 ) in |
||
| 324 | 'JIS_B1' => [2063.622, 2919.685], // = ( 728 x 1030 ) mm = ( 28.66 x 40.55 ) in |
||
| 325 | 'JIS_B2' => [1459.843, 2063.622], // = ( 515 x 728 ) mm = ( 20.28 x 28.66 ) in |
||
| 326 | 'JIS_B3' => [1031.811, 1459.843], // = ( 364 x 515 ) mm = ( 14.33 x 20.28 ) in |
||
| 327 | 'JIS_B4' => [728.504, 1031.811], // = ( 257 x 364 ) mm = ( 10.12 x 14.33 ) in |
||
| 328 | 'JIS_B5' => [515.906, 728.504], // = ( 182 x 257 ) mm = ( 7.17 x 10.12 ) in |
||
| 329 | 'JIS_B6' => [362.835, 515.906], // = ( 128 x 182 ) mm = ( 5.04 x 7.17 ) in |
||
| 330 | 'JIS_B7' => [257.953, 362.835], // = ( 91 x 128 ) mm = ( 3.58 x 5.04 ) in |
||
| 331 | 'JIS_B8' => [181.417, 257.953], // = ( 64 x 91 ) mm = ( 2.52 x 3.58 ) in |
||
| 332 | 'JIS_B9' => [127.559, 181.417], // = ( 45 x 64 ) mm = ( 1.77 x 2.52 ) in |
||
| 333 | 'JIS_B10' => [90.709, 127.559], // = ( 32 x 45 ) mm = ( 1.26 x 1.77 ) in |
||
| 334 | 'JIS_B11' => [62.362, 90.709], // = ( 22 x 32 ) mm = ( 0.87 x 1.26 ) in |
||
| 335 | 'JIS_B12' => [45.354, 62.362], // = ( 16 x 22 ) mm = ( 0.63 x 0.87 ) in |
||
| 336 | // PA Series |
||
| 337 | 'PA0' => [2381.102, 3174.803], // = ( 840 x 1120 ) mm = ( 33.07 x 44.09 ) in |
||
| 338 | 'PA1' => [1587.402, 2381.102], // = ( 560 x 840 ) mm = ( 22.05 x 33.07 ) in |
||
| 339 | 'PA2' => [1190.551, 1587.402], // = ( 420 x 560 ) mm = ( 16.54 x 22.05 ) in |
||
| 340 | 'PA3' => [793.701, 1190.551], // = ( 280 x 420 ) mm = ( 11.02 x 16.54 ) in |
||
| 341 | 'PA4' => [595.276, 793.701], // = ( 210 x 280 ) mm = ( 8.27 x 11.02 ) in |
||
| 342 | 'PA5' => [396.850, 595.276], // = ( 140 x 210 ) mm = ( 5.51 x 8.27 ) in |
||
| 343 | 'PA6' => [297.638, 396.850], // = ( 105 x 140 ) mm = ( 4.13 x 5.51 ) in |
||
| 344 | 'PA7' => [198.425, 297.638], // = ( 70 x 105 ) mm = ( 2.76 x 4.13 ) in |
||
| 345 | 'PA8' => [147.402, 198.425], // = ( 52 x 70 ) mm = ( 2.05 x 2.76 ) in |
||
| 346 | 'PA9' => [99.213, 147.402], // = ( 35 x 52 ) mm = ( 1.38 x 2.05 ) in |
||
| 347 | 'PA10' => [73.701, 99.213], // = ( 26 x 35 ) mm = ( 1.02 x 1.38 ) in |
||
| 348 | // Standard Photographic Print Sizes |
||
| 349 | 'PASSPORT_PHOTO' => [99.213, 127.559], // = ( 35 x 45 ) mm = ( 1.38 x 1.77 ) in |
||
| 350 | 'E' => [233.858, 340.157], // = ( 82 x 120 ) mm = ( 3.25 x 4.72 ) in |
||
| 351 | 'L' => [252.283, 360.000], // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in |
||
| 352 | '3R' => [252.283, 360.000], // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in |
||
| 353 | 'KG' => [289.134, 430.866], // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in |
||
| 354 | '4R' => [289.134, 430.866], // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in |
||
| 355 | '4D' => [340.157, 430.866], // = ( 120 x 152 ) mm = ( 4.72 x 5.98 ) in |
||
| 356 | '2L' => [360.000, 504.567], // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in |
||
| 357 | '5R' => [360.000, 504.567], // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in |
||
| 358 | '8P' => [430.866, 575.433], // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in |
||
| 359 | '6R' => [430.866, 575.433], // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in |
||
| 360 | '6P' => [575.433, 720.000], // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in |
||
| 361 | '8R' => [575.433, 720.000], // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in |
||
| 362 | '6PW' => [575.433, 864.567], // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in |
||
| 363 | 'S8R' => [575.433, 864.567], // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in |
||
| 364 | '4P' => [720.000, 864.567], // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in |
||
| 365 | '10R' => [720.000, 864.567], // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in |
||
| 366 | '4PW' => [720.000, 1080.000], // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in |
||
| 367 | 'S10R' => [720.000, 1080.000], // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in |
||
| 368 | '11R' => [790.866, 1009.134], // = ( 279 x 356 ) mm = ( 10.98 x 14.02 ) in |
||
| 369 | 'S11R' => [790.866, 1224.567], // = ( 279 x 432 ) mm = ( 10.98 x 17.01 ) in |
||
| 370 | '12R' => [864.567, 1080.000], // = ( 305 x 381 ) mm = ( 12.01 x 15.00 ) in |
||
| 371 | 'S12R' => [864.567, 1292.598], // = ( 305 x 456 ) mm = ( 12.01 x 17.95 ) in |
||
| 372 | // Common Newspaper Sizes |
||
| 373 | 'NEWSPAPER_BROADSHEET' => [2125.984, 1700.787], // = ( 750 x 600 ) mm = ( 29.53 x 23.62 ) in |
||
| 374 | 'NEWSPAPER_BERLINER' => [1332.283, 892.913], // = ( 470 x 315 ) mm = ( 18.50 x 12.40 ) in |
||
| 375 | 'NEWSPAPER_TABLOID' => [1218.898, 793.701], // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in |
||
| 376 | 'NEWSPAPER_COMPACT' => [1218.898, 793.701], // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in |
||
| 377 | // Business Cards |
||
| 378 | 'CREDIT_CARD' => [153.014, 242.646], // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in |
||
| 379 | 'BUSINESS_CARD' => [153.014, 242.646], // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in |
||
| 380 | 'BUSINESS_CARD_ISO7810' => [153.014, 242.646], // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in |
||
| 381 | 'BUSINESS_CARD_ISO216' => [147.402, 209.764], // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in |
||
| 382 | 'BUSINESS_CARD_IT' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in |
||
| 383 | 'BUSINESS_CARD_UK' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in |
||
| 384 | 'BUSINESS_CARD_FR' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in |
||
| 385 | 'BUSINESS_CARD_DE' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in |
||
| 386 | 'BUSINESS_CARD_ES' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in |
||
| 387 | 'BUSINESS_CARD_CA' => [144.567, 252.283], // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in |
||
| 388 | 'BUSINESS_CARD_US' => [144.567, 252.283], // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in |
||
| 389 | 'BUSINESS_CARD_JP' => [155.906, 257.953], // = ( 55 x 91 ) mm = ( 2.17 x 3.58 ) in |
||
| 390 | 'BUSINESS_CARD_HK' => [153.071, 255.118], // = ( 54 x 90 ) mm = ( 2.13 x 3.54 ) in |
||
| 391 | 'BUSINESS_CARD_AU' => [155.906, 255.118], // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in |
||
| 392 | 'BUSINESS_CARD_DK' => [155.906, 255.118], // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in |
||
| 393 | 'BUSINESS_CARD_SE' => [155.906, 255.118], // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in |
||
| 394 | 'BUSINESS_CARD_RU' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in |
||
| 395 | 'BUSINESS_CARD_CZ' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in |
||
| 396 | 'BUSINESS_CARD_FI' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in |
||
| 397 | 'BUSINESS_CARD_HU' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in |
||
| 398 | 'BUSINESS_CARD_IL' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in |
||
| 399 | // Billboards |
||
| 400 | '4SHEET' => [2880.000, 4320.000], // = ( 1016 x 1524 ) mm = ( 40.00 x 60.00 ) in |
||
| 401 | '6SHEET' => [3401.575, 5102.362], // = ( 1200 x 1800 ) mm = ( 47.24 x 70.87 ) in |
||
| 402 | '12SHEET' => [8640.000, 4320.000], // = ( 3048 x 1524 ) mm = (120.00 x 60.00 ) in |
||
| 403 | '16SHEET' => [5760.000, 8640.000], // = ( 2032 x 3048 ) mm = ( 80.00 x 120.00) in |
||
| 404 | '32SHEET' => [11520.000, 8640.000], // = ( 4064 x 3048 ) mm = (160.00 x 120.00) in |
||
| 405 | '48SHEET' => [17280.000, 8640.000], // = ( 6096 x 3048 ) mm = (240.00 x 120.00) in |
||
| 406 | '64SHEET' => [23040.000, 8640.000], // = ( 8128 x 3048 ) mm = (320.00 x 120.00) in |
||
| 407 | '96SHEET' => [34560.000, 8640.000], // = (12192 x 3048 ) mm = (480.00 x 120.00) in |
||
| 408 | // -- Old European Sizes |
||
| 409 | // - Old Imperial English Sizes |
||
| 410 | 'EN_EMPEROR' => [3456.000, 5184.000], // = ( 1219 x 1829 ) mm = ( 48.00 x 72.00 ) in |
||
| 411 | 'EN_ANTIQUARIAN' => [2232.000, 3816.000], // = ( 787 x 1346 ) mm = ( 31.00 x 53.00 ) in |
||
| 412 | 'EN_GRAND_EAGLE' => [2070.000, 3024.000], // = ( 730 x 1067 ) mm = ( 28.75 x 42.00 ) in |
||
| 413 | 'EN_DOUBLE_ELEPHANT' => [1926.000, 2880.000], // = ( 679 x 1016 ) mm = ( 26.75 x 40.00 ) in |
||
| 414 | 'EN_ATLAS' => [1872.000, 2448.000], // = ( 660 x 864 ) mm = ( 26.00 x 34.00 ) in |
||
| 415 | 'EN_COLOMBIER' => [1692.000, 2484.000], // = ( 597 x 876 ) mm = ( 23.50 x 34.50 ) in |
||
| 416 | 'EN_ELEPHANT' => [1656.000, 2016.000], // = ( 584 x 711 ) mm = ( 23.00 x 28.00 ) in |
||
| 417 | 'EN_DOUBLE_DEMY' => [1620.000, 2556.000], // = ( 572 x 902 ) mm = ( 22.50 x 35.50 ) in |
||
| 418 | 'EN_IMPERIAL' => [1584.000, 2160.000], // = ( 559 x 762 ) mm = ( 22.00 x 30.00 ) in |
||
| 419 | 'EN_PRINCESS' => [1548.000, 2016.000], // = ( 546 x 711 ) mm = ( 21.50 x 28.00 ) in |
||
| 420 | 'EN_CARTRIDGE' => [1512.000, 1872.000], // = ( 533 x 660 ) mm = ( 21.00 x 26.00 ) in |
||
| 421 | 'EN_DOUBLE_LARGE_POST' => [1512.000, 2376.000], // = ( 533 x 838 ) mm = ( 21.00 x 33.00 ) in |
||
| 422 | 'EN_ROYAL' => [1440.000, 1800.000], // = ( 508 x 635 ) mm = ( 20.00 x 25.00 ) in |
||
| 423 | 'EN_SHEET' => [1404.000, 1692.000], // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in |
||
| 424 | 'EN_HALF_POST' => [1404.000, 1692.000], // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in |
||
| 425 | 'EN_SUPER_ROYAL' => [1368.000, 1944.000], // = ( 483 x 686 ) mm = ( 19.00 x 27.00 ) in |
||
| 426 | 'EN_DOUBLE_POST' => [1368.000, 2196.000], // = ( 483 x 775 ) mm = ( 19.00 x 30.50 ) in |
||
| 427 | 'EN_MEDIUM' => [1260.000, 1656.000], // = ( 445 x 584 ) mm = ( 17.50 x 23.00 ) in |
||
| 428 | 'EN_DEMY' => [1260.000, 1620.000], // = ( 445 x 572 ) mm = ( 17.50 x 22.50 ) in |
||
| 429 | 'EN_LARGE_POST' => [1188.000, 1512.000], // = ( 419 x 533 ) mm = ( 16.50 x 21.00 ) in |
||
| 430 | 'EN_COPY_DRAUGHT' => [1152.000, 1440.000], // = ( 406 x 508 ) mm = ( 16.00 x 20.00 ) in |
||
| 431 | 'EN_POST' => [1116.000, 1386.000], // = ( 394 x 489 ) mm = ( 15.50 x 19.25 ) in |
||
| 432 | 'EN_CROWN' => [1080.000, 1440.000], // = ( 381 x 508 ) mm = ( 15.00 x 20.00 ) in |
||
| 433 | 'EN_PINCHED_POST' => [1062.000, 1332.000], // = ( 375 x 470 ) mm = ( 14.75 x 18.50 ) in |
||
| 434 | 'EN_BRIEF' => [972.000, 1152.000], // = ( 343 x 406 ) mm = ( 13.50 x 16.00 ) in |
||
| 435 | 'EN_FOOLSCAP' => [972.000, 1224.000], // = ( 343 x 432 ) mm = ( 13.50 x 17.00 ) in |
||
| 436 | 'EN_SMALL_FOOLSCAP' => [954.000, 1188.000], // = ( 337 x 419 ) mm = ( 13.25 x 16.50 ) in |
||
| 437 | 'EN_POTT' => [900.000, 1080.000], // = ( 318 x 381 ) mm = ( 12.50 x 15.00 ) in |
||
| 438 | // - Old Imperial Belgian Sizes |
||
| 439 | 'BE_GRAND_AIGLE' => [1984.252, 2948.031], // = ( 700 x 1040 ) mm = ( 27.56 x 40.94 ) in |
||
| 440 | 'BE_COLOMBIER' => [1757.480, 2409.449], // = ( 620 x 850 ) mm = ( 24.41 x 33.46 ) in |
||
| 441 | 'BE_DOUBLE_CARRE' => [1757.480, 2607.874], // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in |
||
| 442 | 'BE_ELEPHANT' => [1746.142, 2182.677], // = ( 616 x 770 ) mm = ( 24.25 x 30.31 ) in |
||
| 443 | 'BE_PETIT_AIGLE' => [1700.787, 2381.102], // = ( 600 x 840 ) mm = ( 23.62 x 33.07 ) in |
||
| 444 | 'BE_GRAND_JESUS' => [1559.055, 2069.291], // = ( 550 x 730 ) mm = ( 21.65 x 28.74 ) in |
||
| 445 | 'BE_JESUS' => [1530.709, 2069.291], // = ( 540 x 730 ) mm = ( 21.26 x 28.74 ) in |
||
| 446 | 'BE_RAISIN' => [1417.323, 1842.520], // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in |
||
| 447 | 'BE_GRAND_MEDIAN' => [1303.937, 1714.961], // = ( 460 x 605 ) mm = ( 18.11 x 23.82 ) in |
||
| 448 | 'BE_DOUBLE_POSTE' => [1233.071, 1601.575], // = ( 435 x 565 ) mm = ( 17.13 x 22.24 ) in |
||
| 449 | 'BE_COQUILLE' => [1218.898, 1587.402], // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in |
||
| 450 | 'BE_PETIT_MEDIAN' => [1176.378, 1502.362], // = ( 415 x 530 ) mm = ( 16.34 x 20.87 ) in |
||
| 451 | 'BE_RUCHE' => [1020.472, 1303.937], // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in |
||
| 452 | 'BE_PROPATRIA' => [977.953, 1218.898], // = ( 345 x 430 ) mm = ( 13.58 x 16.93 ) in |
||
| 453 | 'BE_LYS' => [898.583, 1125.354], // = ( 317 x 397 ) mm = ( 12.48 x 15.63 ) in |
||
| 454 | 'BE_POT' => [870.236, 1088.504], // = ( 307 x 384 ) mm = ( 12.09 x 15.12 ) in |
||
| 455 | 'BE_ROSETTE' => [765.354, 983.622], // = ( 270 x 347 ) mm = ( 10.63 x 13.66 ) in |
||
| 456 | // - Old Imperial French Sizes |
||
| 457 | 'FR_UNIVERS' => [2834.646, 3685.039], // = ( 1000 x 1300 ) mm = ( 39.37 x 51.18 ) in |
||
| 458 | 'FR_DOUBLE_COLOMBIER' => [2551.181, 3571.654], // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in |
||
| 459 | 'FR_GRANDE_MONDE' => [2551.181, 3571.654], // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in |
||
| 460 | 'FR_DOUBLE_SOLEIL' => [2267.717, 3401.575], // = ( 800 x 1200 ) mm = ( 31.50 x 47.24 ) in |
||
| 461 | 'FR_DOUBLE_JESUS' => [2154.331, 3174.803], // = ( 760 x 1120 ) mm = ( 29.92 x 44.09 ) in |
||
| 462 | 'FR_GRAND_AIGLE' => [2125.984, 3004.724], // = ( 750 x 1060 ) mm = ( 29.53 x 41.73 ) in |
||
| 463 | 'FR_PETIT_AIGLE' => [1984.252, 2664.567], // = ( 700 x 940 ) mm = ( 27.56 x 37.01 ) in |
||
| 464 | 'FR_DOUBLE_RAISIN' => [1842.520, 2834.646], // = ( 650 x 1000 ) mm = ( 25.59 x 39.37 ) in |
||
| 465 | 'FR_JOURNAL' => [1842.520, 2664.567], // = ( 650 x 940 ) mm = ( 25.59 x 37.01 ) in |
||
| 466 | 'FR_COLOMBIER_AFFICHE' => [1785.827, 2551.181], // = ( 630 x 900 ) mm = ( 24.80 x 35.43 ) in |
||
| 467 | 'FR_DOUBLE_CAVALIER' => [1757.480, 2607.874], // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in |
||
| 468 | 'FR_CLOCHE' => [1700.787, 2267.717], // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in |
||
| 469 | 'FR_SOLEIL' => [1700.787, 2267.717], // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in |
||
| 470 | 'FR_DOUBLE_CARRE' => [1587.402, 2551.181], // = ( 560 x 900 ) mm = ( 22.05 x 35.43 ) in |
||
| 471 | 'FR_DOUBLE_COQUILLE' => [1587.402, 2494.488], // = ( 560 x 880 ) mm = ( 22.05 x 34.65 ) in |
||
| 472 | 'FR_JESUS' => [1587.402, 2154.331], // = ( 560 x 760 ) mm = ( 22.05 x 29.92 ) in |
||
| 473 | 'FR_RAISIN' => [1417.323, 1842.520], // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in |
||
| 474 | 'FR_CAVALIER' => [1303.937, 1757.480], // = ( 460 x 620 ) mm = ( 18.11 x 24.41 ) in |
||
| 475 | 'FR_DOUBLE_COURONNE' => [1303.937, 2040.945], // = ( 460 x 720 ) mm = ( 18.11 x 28.35 ) in |
||
| 476 | 'FR_CARRE' => [1275.591, 1587.402], // = ( 450 x 560 ) mm = ( 17.72 x 22.05 ) in |
||
| 477 | 'FR_COQUILLE' => [1247.244, 1587.402], // = ( 440 x 560 ) mm = ( 17.32 x 22.05 ) in |
||
| 478 | 'FR_DOUBLE_TELLIERE' => [1247.244, 1927.559], // = ( 440 x 680 ) mm = ( 17.32 x 26.77 ) in |
||
| 479 | 'FR_DOUBLE_CLOCHE' => [1133.858, 1700.787], // = ( 400 x 600 ) mm = ( 15.75 x 23.62 ) in |
||
| 480 | 'FR_DOUBLE_POT' => [1133.858, 1757.480], // = ( 400 x 620 ) mm = ( 15.75 x 24.41 ) in |
||
| 481 | 'FR_ECU' => [1133.858, 1474.016], // = ( 400 x 520 ) mm = ( 15.75 x 20.47 ) in |
||
| 482 | 'FR_COURONNE' => [1020.472, 1303.937], // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in |
||
| 483 | 'FR_TELLIERE' => [963.780, 1247.244], // = ( 340 x 440 ) mm = ( 13.39 x 17.32 ) in |
||
| 484 | 'FR_POT' => [878.740, 1133.858], // = ( 310 x 400 ) mm = ( 12.20 x 15.75 ) in |
||
| 485 | ]; |
||
| 486 | |||
| 487 | /** |
||
| 488 | * Initialisation. |
||
| 489 | * |
||
| 490 | * @return $this |
||
| 491 | */ |
||
| 492 | public function init() |
||
| 493 | { |
||
| 494 | parent::init(); |
||
| 495 | $this->contentStream = (new \YetiForcePDF\Objects\Basic\StreamObject()) |
||
| 496 | ->setDocument($this->document) |
||
| 497 | ->init(); |
||
| 498 | if (!$this->margins) { |
||
|
|
|||
| 499 | $this->margins = $this->document->getDefaultMargins(); |
||
| 500 | } |
||
| 501 | if (!$this->format) { |
||
| 502 | $this->setFormat($this->document->getDefaultFormat()); |
||
| 503 | } |
||
| 504 | if (!$this->orientation) { |
||
| 505 | $this->setOrientation($this->document->getDefaultOrientation()); |
||
| 506 | } |
||
| 507 | $this->document->getPagesObject()->addChild($this); |
||
| 508 | $this->synchronizeFonts(); |
||
| 509 | return $this; |
||
| 510 | } |
||
| 511 | |||
| 512 | /** |
||
| 513 | * Set page group. |
||
| 514 | * |
||
| 515 | * @param int $group |
||
| 516 | * |
||
| 517 | * @return $this |
||
| 518 | */ |
||
| 519 | public function setGroup(int $group) |
||
| 520 | { |
||
| 521 | $this->group = $group; |
||
| 522 | return $this; |
||
| 523 | } |
||
| 524 | |||
| 525 | /** |
||
| 526 | * Get page group. |
||
| 527 | * |
||
| 528 | * @return int |
||
| 529 | */ |
||
| 530 | public function getGroup() |
||
| 531 | { |
||
| 532 | return $this->group; |
||
| 533 | } |
||
| 534 | |||
| 535 | /** |
||
| 536 | * Set page format. |
||
| 537 | * |
||
| 538 | * @param string $format |
||
| 539 | * |
||
| 540 | * @return $this |
||
| 541 | */ |
||
| 542 | public function setFormat(string $format) |
||
| 543 | { |
||
| 544 | $this->format = $format; |
||
| 545 | $dimensions = self::$pageFormats[$this->format]; |
||
| 546 | if ('L' === $this->orientation) { |
||
| 547 | $dimensions = array_reverse($dimensions); |
||
| 548 | } |
||
| 549 | $this->dimensions = (new Dimensions()) |
||
| 550 | ->setDocument($this->document) |
||
| 551 | ->init(); |
||
| 552 | $this->dimensions |
||
| 553 | ->setWidth(Math::sub((string) $dimensions[0], Math::add((string) $this->margins['left'], (string) $this->margins['right']))) |
||
| 554 | ->setHeight(Math::sub((string) $dimensions[1], Math::add((string) $this->margins['top'], (string) $this->margins['bottom']))); |
||
| 555 | $this->outerDimensions = (new Dimensions()) |
||
| 556 | ->setDocument($this->document) |
||
| 557 | ->init(); |
||
| 558 | $this->outerDimensions->setWidth((string) $dimensions[0])->setHeight((string) $dimensions[1]); |
||
| 559 | $this->coordinates = (new Coordinates()) |
||
| 560 | ->setDocument($this->document) |
||
| 561 | ->init(); |
||
| 562 | $this->coordinates->setX((string) $this->margins['left'])->setY((string) $this->margins['top'])->init(); |
||
| 563 | return $this; |
||
| 564 | } |
||
| 565 | |||
| 566 | /** |
||
| 567 | * Get format. |
||
| 568 | * |
||
| 569 | * @return string |
||
| 570 | */ |
||
| 571 | public function getFormat() |
||
| 572 | { |
||
| 573 | return $this->format; |
||
| 574 | } |
||
| 575 | |||
| 576 | /** |
||
| 577 | * Set page orientation. |
||
| 578 | * |
||
| 579 | * @param string $orientation |
||
| 580 | * |
||
| 581 | * @return \YetiForcePDF\Page |
||
| 582 | */ |
||
| 583 | public function setOrientation(string $orientation): self |
||
| 584 | { |
||
| 585 | $this->orientation = $orientation; |
||
| 586 | return $this; |
||
| 587 | } |
||
| 588 | |||
| 589 | /** |
||
| 590 | * Get orientation. |
||
| 591 | * |
||
| 592 | * @return string |
||
| 593 | */ |
||
| 594 | public function getOrientation() |
||
| 595 | { |
||
| 596 | return $this->orientation; |
||
| 597 | } |
||
| 598 | |||
| 599 | /** |
||
| 600 | * Set page number. |
||
| 601 | * |
||
| 602 | * @param int $number |
||
| 603 | * |
||
| 604 | * @return $this |
||
| 605 | */ |
||
| 606 | public function setPageNumber(int $number) |
||
| 607 | { |
||
| 608 | $this->pageNumber = $number; |
||
| 609 | return $this; |
||
| 610 | } |
||
| 611 | |||
| 612 | /** |
||
| 613 | * Get page number. |
||
| 614 | * |
||
| 615 | * @return int |
||
| 616 | */ |
||
| 617 | public function getPageNumber() |
||
| 618 | { |
||
| 619 | return $this->pageNumber; |
||
| 620 | } |
||
| 621 | |||
| 622 | /** |
||
| 623 | * Set page count. |
||
| 624 | * |
||
| 625 | * @param int $pageCount |
||
| 626 | * |
||
| 627 | * @return $this |
||
| 628 | */ |
||
| 629 | public function setPageCount(int $pageCount) |
||
| 630 | { |
||
| 631 | $this->pageCount = $pageCount; |
||
| 632 | return $this; |
||
| 633 | } |
||
| 634 | |||
| 635 | /** |
||
| 636 | * Get page count. |
||
| 637 | * |
||
| 638 | * @return mixed |
||
| 639 | */ |
||
| 640 | public function getPageCount() |
||
| 641 | { |
||
| 642 | return $this->pageCount; |
||
| 643 | } |
||
| 644 | |||
| 645 | /** |
||
| 646 | * Get page margins. |
||
| 647 | * |
||
| 648 | * @return array |
||
| 649 | */ |
||
| 650 | public function getMargins(): array |
||
| 651 | { |
||
| 652 | return $this->margins; |
||
| 653 | } |
||
| 654 | |||
| 655 | /** |
||
| 656 | * Set page margins. |
||
| 657 | * |
||
| 658 | * @param float $left |
||
| 659 | * @param float $top |
||
| 660 | * @param float $right |
||
| 661 | * @param float $bottom |
||
| 662 | * |
||
| 663 | * @return $this |
||
| 664 | */ |
||
| 665 | public function setMargins(float $left, float $top, float $right, float $bottom) |
||
| 666 | { |
||
| 667 | $this->margins = [ |
||
| 668 | 'left' => $left, |
||
| 669 | 'top' => $top, |
||
| 670 | 'right' => $right, |
||
| 671 | 'bottom' => $bottom, |
||
| 672 | 'horizontal' => $left + $right, |
||
| 673 | 'vertical' => $top + $bottom, |
||
| 674 | ]; |
||
| 675 | $this->setFormat($this->format); |
||
| 676 | return $this; |
||
| 677 | } |
||
| 678 | |||
| 679 | /** |
||
| 680 | * Get page coordinates - content area basing on margins. |
||
| 681 | * |
||
| 682 | * @return \YetiForcePDF\Layout\Coordinates\Coordinates |
||
| 683 | */ |
||
| 684 | public function getCoordinates() |
||
| 685 | { |
||
| 686 | return $this->coordinates; |
||
| 687 | } |
||
| 688 | |||
| 689 | /** |
||
| 690 | * Set main box for the page. |
||
| 691 | * |
||
| 692 | * @param Box $box |
||
| 693 | * |
||
| 694 | * @return $this |
||
| 695 | */ |
||
| 696 | public function setBox(Box $box) |
||
| 697 | { |
||
| 698 | $this->box = $box; |
||
| 699 | return $this; |
||
| 700 | } |
||
| 701 | |||
| 702 | /** |
||
| 703 | * Get main box for the page. |
||
| 704 | * |
||
| 705 | * @return Box |
||
| 706 | */ |
||
| 707 | public function getBox() |
||
| 708 | { |
||
| 709 | return $this->box; |
||
| 710 | } |
||
| 711 | |||
| 712 | /** |
||
| 713 | * Set user unit (scale of the DPI $userUnit * 72). |
||
| 714 | * |
||
| 715 | * @param float $userUnit |
||
| 716 | * |
||
| 717 | * @return \YetiForcePDF\Page |
||
| 718 | */ |
||
| 719 | public function setUserUnit(float $userUnit): self |
||
| 720 | { |
||
| 721 | $this->userUnit = $userUnit; |
||
| 722 | return $this; |
||
| 723 | } |
||
| 724 | |||
| 725 | /** |
||
| 726 | * Add page resource. |
||
| 727 | * |
||
| 728 | * @param string $groupName |
||
| 729 | * @param string $resourceName |
||
| 730 | * @param \YetiForcePDF\Objects\PdfObject $resource |
||
| 731 | * |
||
| 732 | * @return \YetiForcePDF\Page |
||
| 733 | */ |
||
| 734 | public function addResource(string $groupName, string $resourceName, Objects\PdfObject $resource): self |
||
| 735 | { |
||
| 736 | if (!isset($this->resources[$groupName])) { |
||
| 737 | $this->resources[$groupName] = []; |
||
| 738 | } |
||
| 739 | $this->resources[$groupName][$resourceName] = $resource; |
||
| 740 | if (!$resourceName) { |
||
| 741 | $this->doNotGroup[] = $groupName; |
||
| 742 | } |
||
| 743 | return $this; |
||
| 744 | } |
||
| 745 | |||
| 746 | /** |
||
| 747 | * Get resource. |
||
| 748 | * |
||
| 749 | * @param string $groupName |
||
| 750 | * @param string $resourceName |
||
| 751 | * |
||
| 752 | * @return \YetiForcePDF\Objects\PdfObject|null |
||
| 753 | */ |
||
| 754 | public function getResource(string $groupName, string $resourceName) |
||
| 755 | { |
||
| 756 | if (!empty($this->resources[$groupName][$resourceName])) { |
||
| 757 | return $this->resources[$groupName][$resourceName]; |
||
| 758 | } |
||
| 759 | return null; |
||
| 760 | } |
||
| 761 | |||
| 762 | /** |
||
| 763 | * Synchronize fonts with document fonts. |
||
| 764 | */ |
||
| 765 | public function synchronizeFonts() |
||
| 766 | { |
||
| 767 | // add all existing fonts |
||
| 768 | foreach ($this->document->getAllFontInstances() as $fontInstance) { |
||
| 769 | $fontNumber = $fontInstance->getNumber(); |
||
| 770 | if (!$this->getResource('Font', $fontNumber)) { |
||
| 771 | $this->addResource('Font', $fontNumber, $fontInstance->getType0Font()); |
||
| 772 | } |
||
| 773 | } |
||
| 774 | } |
||
| 775 | |||
| 776 | /** |
||
| 777 | * Get page content stream. |
||
| 778 | * |
||
| 779 | * @return \YetiForcePDF\Objects\Basic\StreamObject |
||
| 780 | */ |
||
| 781 | public function getContentStream(): StreamObject |
||
| 782 | { |
||
| 783 | return $this->contentStream; |
||
| 784 | } |
||
| 785 | |||
| 786 | /** |
||
| 787 | * Get page dimensions. |
||
| 788 | * |
||
| 789 | * @return \YetiForcePDF\Layout\Dimensions\Dimensions |
||
| 790 | */ |
||
| 791 | public function getDimensions(): Dimensions |
||
| 792 | { |
||
| 793 | return $this->dimensions; |
||
| 794 | } |
||
| 795 | |||
| 796 | /** |
||
| 797 | * Get page dimensions. |
||
| 798 | * |
||
| 799 | * @return \YetiForcePDF\Layout\Dimensions\Dimensions |
||
| 800 | */ |
||
| 801 | public function getOuterDimensions(): Dimensions |
||
| 802 | { |
||
| 803 | return $this->outerDimensions; |
||
| 804 | } |
||
| 805 | |||
| 806 | /** |
||
| 807 | * Layout header. |
||
| 808 | * |
||
| 809 | * @param HeaderBox $header |
||
| 810 | * |
||
| 811 | * @return $this |
||
| 812 | */ |
||
| 813 | protected function layoutHeader(HeaderBox $header) |
||
| 814 | { |
||
| 815 | $header = $header->cloneWithChildren(); |
||
| 816 | $box = $this->getBox(); |
||
| 817 | if (!$box->hasChildren()) { |
||
| 818 | return $this; |
||
| 819 | } |
||
| 820 | $box->insertBefore($header, $box->getFirstChild()); |
||
| 821 | $outerWidth = $this->getOuterDimensions()->getWidth(); |
||
| 822 | $outerHeight = $this->getOuterDimensions()->getHeight(); |
||
| 823 | $header->getDimensions()->resetWidth()->resetHeight(); |
||
| 824 | $this->getDimensions()->setWidth($outerWidth); |
||
| 825 | $this->getBox()->getDimensions()->setWidth($outerWidth); |
||
| 826 | $this->getDimensions()->setHeight($outerHeight); |
||
| 827 | $this->getBox()->getDimensions()->setWidth($outerHeight); |
||
| 828 | $header->getDimensions()->setWidth($outerWidth); |
||
| 829 | $header->setDisplayable(true); |
||
| 830 | $header->layout(); |
||
| 831 | return $this; |
||
| 832 | } |
||
| 833 | |||
| 834 | /** |
||
| 835 | * Layout footer. |
||
| 836 | * |
||
| 837 | * @param FooterBox $footer |
||
| 838 | * |
||
| 839 | * @return $this |
||
| 840 | */ |
||
| 841 | protected function layoutFooter(FooterBox $footer) |
||
| 842 | { |
||
| 843 | $footer = $footer->cloneWithChildren(); |
||
| 844 | $box = $this->getBox(); |
||
| 845 | if (!$box->hasChildren()) { |
||
| 846 | return $this; |
||
| 847 | } |
||
| 848 | $box->insertBefore($footer, $box->getFirstChild()); |
||
| 849 | $outerWidth = $this->getOuterDimensions()->getWidth(); |
||
| 850 | $outerHeight = $this->getOuterDimensions()->getHeight(); |
||
| 851 | $footer->getDimensions()->resetWidth()->resetHeight(); |
||
| 852 | $this->getDimensions()->setWidth($outerWidth); |
||
| 853 | $this->getBox()->getDimensions()->setWidth($outerWidth); |
||
| 854 | $this->getDimensions()->setHeight($outerHeight); |
||
| 855 | $this->getBox()->getDimensions()->setWidth($outerHeight); |
||
| 856 | $footer->getDimensions()->setWidth($outerWidth); |
||
| 857 | $footer->setDisplayable(true); |
||
| 858 | $footer->layout(); |
||
| 859 | return $this; |
||
| 860 | } |
||
| 861 | |||
| 862 | /** |
||
| 863 | * Layout watermark. |
||
| 864 | * |
||
| 865 | * @param WatermarkBox $watermark |
||
| 866 | * |
||
| 867 | * @return $this |
||
| 868 | */ |
||
| 869 | protected function layoutWatermark(WatermarkBox $watermark) |
||
| 870 | { |
||
| 871 | $watermark = $watermark->cloneWithChildren(); |
||
| 872 | $box = $this->getBox(); |
||
| 873 | if (!$box->hasChildren()) { |
||
| 874 | return $this; |
||
| 875 | } |
||
| 876 | $box->insertBefore($watermark, $box->getFirstChild()); |
||
| 877 | $outerWidth = $this->getOuterDimensions()->getWidth(); |
||
| 878 | $outerHeight = $this->getOuterDimensions()->getHeight(); |
||
| 879 | $watermark->getDimensions()->resetWidth()->resetHeight(); |
||
| 880 | $this->getDimensions()->setWidth($outerWidth); |
||
| 881 | $this->getBox()->getDimensions()->setWidth($outerWidth); |
||
| 882 | $this->getDimensions()->setHeight($outerHeight); |
||
| 883 | $this->getBox()->getDimensions()->setWidth($outerHeight); |
||
| 884 | $watermark->getDimensions()->setWidth($outerWidth); |
||
| 885 | $watermark->setDisplayable(true); |
||
| 886 | $watermark->layout(); |
||
| 887 | return $this; |
||
| 888 | } |
||
| 889 | |||
| 890 | /** |
||
| 891 | * Set up absolute positioned boxes like header,footer, watermark. |
||
| 892 | * |
||
| 893 | * @return $this |
||
| 894 | */ |
||
| 895 | public function setUpAbsoluteBoxes() |
||
| 896 | { |
||
| 897 | $this->document->setCurrentPage($this); |
||
| 898 | $this->getBox()->getOffset()->setLeft('0'); |
||
| 899 | $this->getBox()->getOffset()->setTop('0'); |
||
| 900 | $this->getBox()->getCoordinates()->setX('0'); |
||
| 901 | $this->getBox()->getCoordinates()->setY('0'); |
||
| 902 | $this->setMargins(0, 0, 0, 0); |
||
| 903 | $box = $this->getBox(); |
||
| 904 | $headers = $box->getBoxesByType('HeaderBox'); |
||
| 905 | if (!empty($headers)) { |
||
| 906 | $header = $headers[0]; |
||
| 907 | $headerClone = $header->getParent()->removeChild($header)->cloneWithChildren(); |
||
| 908 | $header->clearChildren(); |
||
| 909 | $this->document->setHeader($headerClone); |
||
| 910 | $this->layoutHeader($headerClone); |
||
| 911 | } elseif ($this->document->getHeader()) { |
||
| 912 | $this->layoutHeader($this->document->getHeader()); |
||
| 913 | } |
||
| 914 | $footers = $box->getBoxesByType('FooterBox'); |
||
| 915 | if (!empty($footers)) { |
||
| 916 | $footer = $footers[0]; |
||
| 917 | $footerClone = $footer->getParent()->removeChild($footer)->cloneWithChildren(); |
||
| 918 | $footer->clearChildren(); |
||
| 919 | $this->document->setFooter($footerClone); |
||
| 920 | $this->layoutFooter($footerClone); |
||
| 921 | } elseif ($this->document->getFooter()) { |
||
| 922 | $this->layoutFooter($this->document->getFooter()); |
||
| 923 | } |
||
| 924 | $watermarks = $box->getBoxesByType('WatermarkBox'); |
||
| 925 | if (!empty($watermarks)) { |
||
| 926 | $watermark = $watermarks[0]; |
||
| 927 | $watermarkClone = $watermark->getParent()->removeChild($watermark)->cloneWithChildren(); |
||
| 928 | $watermark->clearChildren(); |
||
| 929 | $this->document->setWatermark($watermarkClone); |
||
| 930 | $this->layoutWatermark($watermarkClone); |
||
| 931 | } elseif ($this->document->getWatermark()) { |
||
| 932 | $this->layoutWatermark($this->document->getWatermark()); |
||
| 933 | } |
||
| 934 | return $this; |
||
| 935 | } |
||
| 936 | |||
| 937 | /** |
||
| 938 | * Get boxes that are laid out after specified y position of the current page. |
||
| 939 | * |
||
| 940 | * @param string $yPos |
||
| 941 | * |
||
| 942 | * @return Box[] |
||
| 943 | */ |
||
| 944 | public function getRootChildsAfterY(string $yPos) |
||
| 945 | { |
||
| 946 | $boxes = []; |
||
| 947 | $box = $this->getBox(); |
||
| 948 | $endY = $box->getCoordinates()->getEndY(); |
||
| 949 | if (Math::comp($endY, $yPos) <= 0) { |
||
| 950 | return $boxes; |
||
| 951 | } |
||
| 952 | foreach ($box->getChildren() as $childBox) { |
||
| 953 | if (Math::comp($childBox->getCoordinates()->getEndY(), $yPos) > 0) { |
||
| 954 | $boxes[] = $childBox; |
||
| 955 | } |
||
| 956 | } |
||
| 957 | return $boxes; |
||
| 958 | } |
||
| 959 | |||
| 960 | /** |
||
| 961 | * Cut box above specified position. |
||
| 962 | * |
||
| 963 | * @param Box $child |
||
| 964 | * @param string $yPos |
||
| 965 | * |
||
| 966 | * @return $this |
||
| 967 | */ |
||
| 968 | public function cutAbove(Box $child, string $yPos) |
||
| 969 | { |
||
| 970 | $height = Math::sub($child->getCoordinates()->getEndY(), $yPos); |
||
| 971 | $child->getDimensions()->setHeight($height); |
||
| 972 | $child->getStyle() |
||
| 973 | ->setRule('border-top-width', '0') |
||
| 974 | ->setRule('padding-top', '0') |
||
| 975 | ->setRule('margin-top', '0'); |
||
| 976 | $child->setCut(static::CUT_ABOVE); |
||
| 977 | return $this; |
||
| 978 | } |
||
| 979 | |||
| 980 | /** |
||
| 981 | * Cut box below specified position. |
||
| 982 | * |
||
| 983 | * @param Box $child |
||
| 984 | * @param string $yPos |
||
| 985 | * |
||
| 986 | * @return $this |
||
| 987 | */ |
||
| 988 | public function cutBelow(Box $child, string $yPos) |
||
| 989 | { |
||
| 990 | if ($child instanceof TextBox) { |
||
| 991 | $child->setRenderable(false); |
||
| 992 | return $this; |
||
| 993 | } |
||
| 994 | $height = Math::sub($yPos, $child->getCoordinates()->getY()); |
||
| 995 | $child->getDimensions()->setHeight($height); |
||
| 996 | $child->getStyle() |
||
| 997 | ->setRule('border-bottom-width', '0') |
||
| 998 | ->setRule('margin-bottom', '0') |
||
| 999 | ->setRule('padding-bottom', '0'); |
||
| 1000 | $child->setCut(static::CUT_BELOW); |
||
| 1001 | return $this; |
||
| 1002 | } |
||
| 1003 | |||
| 1004 | /** |
||
| 1005 | * Cut box. |
||
| 1006 | * |
||
| 1007 | * @param Box $box |
||
| 1008 | * @param string $yPos |
||
| 1009 | * @param Box $cloned |
||
| 1010 | * |
||
| 1011 | * @return Box |
||
| 1012 | */ |
||
| 1013 | public function cutBox(Box $box, string $yPos, Box $cloned) |
||
| 1014 | { |
||
| 1015 | foreach ($box->getChildren() as $child) { |
||
| 1016 | if (!$child->isForMeasurement() || !$child->isRenderable()) { |
||
| 1017 | continue; |
||
| 1018 | } |
||
| 1019 | $childCoords = $child->getCoordinates(); |
||
| 1020 | if (Math::comp($childCoords->getEndY(), $yPos) >= 0) { |
||
| 1021 | $childBoxes = $this->cloneAndDivideChildrenAfterY($yPos, [$child]); |
||
| 1022 | foreach ($childBoxes as $childBox) { |
||
| 1023 | $cloned->appendChild($childBox); |
||
| 1024 | } |
||
| 1025 | } |
||
| 1026 | if (Math::comp($childCoords->getY(), $yPos) >= 0) { |
||
| 1027 | $child->setRenderable(false)->setForMeasurement(false); |
||
| 1028 | } |
||
| 1029 | } |
||
| 1030 | if (Math::comp($box->getCoordinates()->getY(), $yPos) < 0 && Math::comp($box->getCoordinates()->getEndY(), $yPos) > 0) { |
||
| 1031 | $this->cutBelow($box, $yPos); |
||
| 1032 | $this->cutAbove($cloned, $yPos); |
||
| 1033 | } elseif (Math::comp($box->getCoordinates()->getY(), $yPos) >= 0) { |
||
| 1034 | $box->setRenderable(false)->setForMeasurement(false); |
||
| 1035 | } |
||
| 1036 | return $cloned; |
||
| 1037 | } |
||
| 1038 | |||
| 1039 | /** |
||
| 1040 | * Group boxes by parent. |
||
| 1041 | * |
||
| 1042 | * @param Box[]|null $boxes |
||
| 1043 | * @param string $yPos |
||
| 1044 | * |
||
| 1045 | * @return Box[]|null cloned boxes |
||
| 1046 | */ |
||
| 1047 | public function cloneAndDivideChildrenAfterY(string $yPos, array $boxes = null) |
||
| 1048 | { |
||
| 1049 | if (null === $boxes) { |
||
| 1050 | $boxes = []; |
||
| 1051 | foreach ($this->getBox()->getChildren() as $child) { |
||
| 1052 | if (Math::comp($child->getCoordinates()->getEndY(), $yPos) >= 0) { |
||
| 1053 | $boxes[] = $child; |
||
| 1054 | } |
||
| 1055 | } |
||
| 1056 | } |
||
| 1057 | if (empty($boxes)) { |
||
| 1058 | return null; |
||
| 1059 | } |
||
| 1060 | $clonedBoxes = []; |
||
| 1061 | foreach ($boxes as $box) { |
||
| 1062 | $cloned = $box->clone(); |
||
| 1063 | $cloned->clearChildren(); |
||
| 1064 | $boxCoords = $box->getCoordinates(); |
||
| 1065 | if ($box instanceof TableWrapperBox && Math::comp($boxCoords->getY(), $yPos) <= 0 && Math::comp($boxCoords->getEndY(), $yPos) > 0) { |
||
| 1066 | $cloned = $this->divideTable($box, $yPos, $cloned); |
||
| 1067 | } else { |
||
| 1068 | $cloned = $this->cutBox($box, $yPos, $cloned); |
||
| 1069 | } |
||
| 1070 | $clonedBoxes[] = $cloned; |
||
| 1071 | } |
||
| 1072 | return $clonedBoxes; |
||
| 1073 | } |
||
| 1074 | |||
| 1075 | /** |
||
| 1076 | * Treat table like div? - just cut. |
||
| 1077 | * |
||
| 1078 | * @param TableWrapperBox $tableWrapperBox |
||
| 1079 | * @param string $yPos |
||
| 1080 | * |
||
| 1081 | * @return bool |
||
| 1082 | */ |
||
| 1083 | public function treatTableLikeDiv(TableWrapperBox $tableWrapperBox, string $yPos) |
||
| 1084 | { |
||
| 1085 | $cells = $tableWrapperBox->getBoxesByType('TableCellBox'); |
||
| 1086 | foreach ($cells as $cell) { |
||
| 1087 | if (Math::comp($cell->getDimensions()->getHeight(), $this->getDimensions()->getHeight()) > 0) { |
||
| 1088 | return true; |
||
| 1089 | } |
||
| 1090 | } |
||
| 1091 | return false; |
||
| 1092 | } |
||
| 1093 | |||
| 1094 | /** |
||
| 1095 | * Divide overflowed table. |
||
| 1096 | * |
||
| 1097 | * @param Box $tableChild |
||
| 1098 | * @param string $yPos |
||
| 1099 | * @param Box $cloned |
||
| 1100 | * |
||
| 1101 | * @return TableWrapperBox |
||
| 1102 | */ |
||
| 1103 | protected function divideTable(Box $tableChild, string $yPos, Box $cloned) |
||
| 1104 | { |
||
| 1105 | $tableWrapperBox = $tableChild->getClosestByType('TableWrapperBox'); |
||
| 1106 | if ($this->treatTableLikeDiv($tableWrapperBox, $yPos)) { |
||
| 1107 | return $this->cutBox($tableWrapperBox, $yPos, $cloned); |
||
| 1108 | } |
||
| 1109 | $pageEnd = Math::add($this->getDimensions()->getHeight(), (string) $this->margins['top']); |
||
| 1110 | if (Math::comp($tableWrapperBox->getCoordinates()->getY(), $pageEnd) >= 0) { |
||
| 1111 | // if table is below page do nothing - it will be moved to the next page and then again checked |
||
| 1112 | return $tableWrapperBox; |
||
| 1113 | } |
||
| 1114 | $newTableWrapperBox = $tableWrapperBox->clone(); |
||
| 1115 | $newTableWrapperBox->getStyle()->setBox($newTableWrapperBox); |
||
| 1116 | $newTableWrapperBox->clearChildren(); |
||
| 1117 | $tableBox = $tableWrapperBox->getFirstChild(); |
||
| 1118 | $newTableBox = $tableBox->clone(); |
||
| 1119 | $newTableBox->getStyle()->setBox($newTableBox); |
||
| 1120 | $newTableBox->clearChildren(); |
||
| 1121 | $newTableWrapperBox->appendChild($newTableBox); |
||
| 1122 | $clonedFooters = $tableWrapperBox->getBoxesByType('TableFooterGroupBox', 'TableWrapperBox'); |
||
| 1123 | if (!empty($clonedFooters)) { |
||
| 1124 | $clonedFooter = $clonedFooters[0]->getParent()->removeChild($clonedFooters[0])->cloneWithChildren(); |
||
| 1125 | } |
||
| 1126 | $headers = $tableWrapperBox->getBoxesByType('TableHeaderGroupBox', 'TableWrapperBox'); |
||
| 1127 | if (!empty($headers)) { |
||
| 1128 | $newTableBox->appendChild($headers[0]->cloneWithChildren()); |
||
| 1129 | } |
||
| 1130 | // clone row groups and rows |
||
| 1131 | foreach ($tableWrapperBox->getFirstChild()->getChildren() as $tableRowGroup) { |
||
| 1132 | if (Math::comp($tableRowGroup->getCoordinates()->getEndY(), $pageEnd) < 0) { |
||
| 1133 | continue; |
||
| 1134 | } |
||
| 1135 | $moveRowGroup = $tableRowGroup->clone(); |
||
| 1136 | $moveRowGroup->clearChildren(); |
||
| 1137 | foreach ($tableRowGroup->getChildren() as $rowIndex => $row) { |
||
| 1138 | if (!$tableRowGroup instanceof TableFooterGroupBox && !$tableRowGroup instanceof TableHeaderGroupBox) { |
||
| 1139 | $moveRow = false; |
||
| 1140 | foreach ($row->getChildren() as $column) { |
||
| 1141 | if (Math::comp($column->getCoordinates()->getEndY(), $pageEnd) >= 0) { |
||
| 1142 | $moveRow = true; |
||
| 1143 | break; |
||
| 1144 | } |
||
| 1145 | } |
||
| 1146 | if ($moveRow) { |
||
| 1147 | if ($row->getRowSpanUp() > 0) { |
||
| 1148 | $move = []; |
||
| 1149 | // copy spanned rows too |
||
| 1150 | for ($i = $row->getRowSpanUp(); $i > 0; --$i) { |
||
| 1151 | $spannedRowIndex = $rowIndex - $i; |
||
| 1152 | $move[] = $tableRowGroup->getChildren()[$spannedRowIndex]; |
||
| 1153 | } |
||
| 1154 | // copy all next rows |
||
| 1155 | $rows = $tableRowGroup->getChildren(); |
||
| 1156 | for ($i = $rowIndex, $len = \count($rows); $i < $len; ++$i) { |
||
| 1157 | $nextRow = $rows[$i]; |
||
| 1158 | $move[] = $nextRow; |
||
| 1159 | } |
||
| 1160 | foreach ($move as $mr) { |
||
| 1161 | $moveRowGroup->appendChild($mr->getParent()->removeChild($mr)); |
||
| 1162 | } |
||
| 1163 | break; |
||
| 1164 | } |
||
| 1165 | $moveRowGroup->appendChild($row->getParent()->removeChild($row)); |
||
| 1166 | } |
||
| 1167 | } |
||
| 1168 | } |
||
| 1169 | $newTableBox->appendChild($moveRowGroup); |
||
| 1170 | } |
||
| 1171 | if (isset($clonedFooter)) { |
||
| 1172 | $newTableBox->appendChild($clonedFooter); |
||
| 1173 | } |
||
| 1174 | //remove empty rows |
||
| 1175 | $tableBox->removeEmptyRows(); |
||
| 1176 | // remove original table if it was moved with all the content |
||
| 1177 | $removeSource = !$tableBox->hasChildren() || !$tableBox->containContent(); |
||
| 1178 | $removeSource = $removeSource || ($tableBox->getFirstChild() instanceof TableHeaderGroupBox && 1 === \count($tableBox->getChildren())); |
||
| 1179 | if ($removeSource) { |
||
| 1180 | $tableWrapperBox->setDisplayable(false)->setRenderable(false)->setForMeasurement(false); |
||
| 1181 | } |
||
| 1182 | return $newTableWrapperBox; |
||
| 1183 | } |
||
| 1184 | |||
| 1185 | /** |
||
| 1186 | * Clone current page. |
||
| 1187 | * |
||
| 1188 | * @throws \InvalidArgumentException |
||
| 1189 | * |
||
| 1190 | * @return Page |
||
| 1191 | */ |
||
| 1192 | public function cloneCurrentPage() |
||
| 1204 | } |
||
| 1205 | |||
| 1206 | /** |
||
| 1207 | * Break page after specified box. |
||
| 1208 | * |
||
| 1209 | * @param Box $box |
||
| 1210 | * |
||
| 1211 | * @return $this |
||
| 1212 | */ |
||
| 1213 | public function breakAfter(Box $box) |
||
| 1214 | { |
||
| 1215 | $box = $box->getFirstRootChild(); |
||
| 1216 | if ($box->getParent()->getLastChild() === $box) { |
||
| 1217 | return $this; |
||
| 1218 | } |
||
| 1219 | $contentBoxes = []; |
||
| 1220 | $break = false; |
||
| 1221 | foreach ($box->getParent()->getChildren() as $child) { |
||
| 1222 | if ($child === $box) { |
||
| 1223 | $break = true; |
||
| 1224 | } |
||
| 1225 | if ($break && $child !== $box) { |
||
| 1226 | $contentBoxes[] = $child; |
||
| 1227 | } |
||
| 1228 | } |
||
| 1229 | $haveContent = false; |
||
| 1230 | foreach ($contentBoxes as $contentBox) { |
||
| 1231 | if ($contentBox->containContent()) { |
||
| 1232 | $haveContent = true; |
||
| 1233 | break; |
||
| 1234 | } |
||
| 1235 | } |
||
| 1236 | if (!$haveContent) { |
||
| 1237 | return $this; |
||
| 1238 | } |
||
| 1239 | $newPage = $this->cloneCurrentPage(); |
||
| 1240 | $newBox = $newPage->getBox()->clone(); |
||
| 1241 | $newBox->clearChildren(); |
||
| 1242 | $newPage->setBox($newBox); |
||
| 1243 | $break = false; |
||
| 1244 | foreach ($box->getParent()->getChildren() as $child) { |
||
| 1245 | if ($child === $box) { |
||
| 1246 | $break = true; |
||
| 1247 | } |
||
| 1248 | if ($break && $child !== $box) { |
||
| 1249 | $newBox->appendChild($child->getParent()->removeChild($child)); |
||
| 1250 | } |
||
| 1251 | } |
||
| 1252 | $newBox->layout(true); |
||
| 1253 | $this->document->setCurrentPage($newPage); |
||
| 1254 | unset($contentBoxes); |
||
| 1255 | return $this; |
||
| 1256 | } |
||
| 1257 | |||
| 1258 | /** |
||
| 1259 | * Break overflow of the current page. |
||
| 1260 | * |
||
| 1261 | * @param int $level Is used to stop infinite loop if something goes wrong |
||
| 1262 | * |
||
| 1263 | * @return $this |
||
| 1264 | */ |
||
| 1265 | public function breakOverflow(int $level = 0) |
||
| 1288 | } |
||
| 1289 | |||
| 1290 | /** |
||
| 1291 | * Layout page resources. |
||
| 1292 | * |
||
| 1293 | * @return string |
||
| 1294 | */ |
||
| 1295 | public function renderResources(): string |
||
| 1296 | { |
||
| 1297 | $rendered = [ |
||
| 1298 | ' /Resources <<', |
||
| 1299 | ]; |
||
| 1300 | foreach ($this->resources as $groupName => $resourceGroup) { |
||
| 1301 | if (!\in_array($groupName, $this->doNotGroup)) { |
||
| 1302 | $rendered[] = " /$groupName <<"; |
||
| 1303 | foreach ($resourceGroup as $resourceName => $resourceObject) { |
||
| 1304 | $rendered[] = " /$resourceName " . $resourceObject->getReference(); |
||
| 1305 | } |
||
| 1306 | $rendered[] = ' >>'; |
||
| 1307 | } else { |
||
| 1308 | $str = " /$groupName "; |
||
| 1309 | foreach ($resourceGroup as $resourceName => $resourceObject) { |
||
| 1310 | $str .= $resourceObject->getReference(); |
||
| 1311 | } |
||
| 1312 | $rendered[] = $str; |
||
| 1313 | } |
||
| 1314 | } |
||
| 1315 | $rendered[] = ' >>'; |
||
| 1316 | return implode("\n", $rendered); |
||
| 1317 | } |
||
| 1318 | |||
| 1319 | /** |
||
| 1320 | * {@inheritdoc} |
||
| 1321 | */ |
||
| 1322 | public function render(): string |
||
| 1323 | { |
||
| 1324 | $dimensions = $this->getOuterDimensions(); |
||
| 1325 | return implode("\n", [ |
||
| 1326 | $this->getRawId() . ' obj', |
||
| 1327 | '<<', |
||
| 1328 | ' /Type /Page', |
||
| 1329 | ' /Parent ' . $this->parent->getReference(), |
||
| 1330 | ' /MediaBox [0 0 ' . $dimensions->getWidth() . ' ' . $dimensions->getHeight() . ']', |
||
| 1331 | ' /BleedBox [' . $this->margins['left'] . ' ' . $this->margins['top'] . ' ' . $dimensions->getWidth() . ' ' . $dimensions->getHeight() . ']', |
||
| 1332 | ' /UserUnit ' . $this->userUnit, |
||
| 1333 | ' /Rotate 0', |
||
| 1334 | $this->renderResources(), |
||
| 1335 | ' /Contents ' . $this->contentStream->getReference(), |
||
| 1336 | '>>', |
||
| 1337 | 'endobj', |
||
| 1338 | ]); |
||
| 1339 | } |
||
| 1340 | |||
| 1341 | public function __clone() |
||
| 1354 | } |
||
| 1355 | } |
||
| 1356 | } |
||
| 1357 | } |
||
| 1358 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)or! empty(...)instead.