Display background when printing or saving a text widget (issue #14928)
This commit is contained in:
		
							parent
							
								
									60e9065bf6
								
							
						
					
					
						commit
						60498c67e4
					
				| @ -33,9 +33,14 @@ import { | |||||||
|   Util, |   Util, | ||||||
|   warn, |   warn, | ||||||
| } from "../shared/util.js"; | } from "../shared/util.js"; | ||||||
| import { collectActions, getInheritableProperty } from "./core_utils.js"; | import { | ||||||
|  |   collectActions, | ||||||
|  |   getInheritableProperty, | ||||||
|  |   numberToString, | ||||||
|  | } from "./core_utils.js"; | ||||||
| import { | import { | ||||||
|   createDefaultAppearance, |   createDefaultAppearance, | ||||||
|  |   getPdfColor, | ||||||
|   parseDefaultAppearance, |   parseDefaultAppearance, | ||||||
| } from "./default_appearance.js"; | } from "./default_appearance.js"; | ||||||
| import { Dict, isName, Name, Ref, RefSet } from "./primitives.js"; | import { Dict, isName, Name, Ref, RefSet } from "./primitives.js"; | ||||||
| @ -663,6 +668,27 @@ class Annotation { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   getBorderAndBackgroundAppearances() { | ||||||
|  |     if (!this.backgroundColor && !this.borderColor) { | ||||||
|  |       return ""; | ||||||
|  |     } | ||||||
|  |     const width = this.data.rect[2] - this.data.rect[0]; | ||||||
|  |     const height = this.data.rect[3] - this.data.rect[1]; | ||||||
|  |     const rect = `0 0 ${width} ${height} re`; | ||||||
|  | 
 | ||||||
|  |     let str = ""; | ||||||
|  |     if (this.backgroundColor) { | ||||||
|  |       str = `${getPdfColor(this.backgroundColor)} ${rect} f `; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (this.borderColor) { | ||||||
|  |       const borderWidth = this.borderStyle.width || 1; | ||||||
|  |       str += `${borderWidth} w ${getPdfColor(this.borderColor)} ${rect} S `; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return str; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * Set the border style (as AnnotationBorderStyle object). |    * Set the border style (as AnnotationBorderStyle object). | ||||||
|    * |    * | ||||||
| @ -1609,7 +1635,13 @@ class WidgetAnnotation extends Annotation { | |||||||
|       descent = 0; |       descent = 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const vPadding = defaultPadding + Math.abs(descent) * fontSize; |     // Take into account the space we have to compute the default vertical
 | ||||||
|  |     // padding.
 | ||||||
|  |     const defaultVPadding = Math.min( | ||||||
|  |       Math.floor((totalHeight - fontSize) / 2), | ||||||
|  |       defaultPadding | ||||||
|  |     ); | ||||||
|  |     const vPadding = defaultVPadding + Math.abs(descent) * fontSize; | ||||||
|     const alignment = this.data.textAlignment; |     const alignment = this.data.textAlignment; | ||||||
| 
 | 
 | ||||||
|     if (this.data.multiLine) { |     if (this.data.multiLine) { | ||||||
| @ -1640,10 +1672,13 @@ class WidgetAnnotation extends Annotation { | |||||||
|       ); |       ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // Empty or it has a trailing whitespace.
 | ||||||
|  |     const colors = this.getBorderAndBackgroundAppearances(); | ||||||
|  | 
 | ||||||
|     if (alignment === 0 || alignment > 2) { |     if (alignment === 0 || alignment > 2) { | ||||||
|       // Left alignment: nothing to do
 |       // Left alignment: nothing to do
 | ||||||
|       return ( |       return ( | ||||||
|         "/Tx BMC q BT " + |         `/Tx BMC q ${colors}BT ` + | ||||||
|         defaultAppearance + |         defaultAppearance + | ||||||
|         ` 1 0 0 1 ${hPadding} ${vPadding} Tm (${escapeString( |         ` 1 0 0 1 ${hPadding} ${vPadding} Tm (${escapeString( | ||||||
|           encodedString |           encodedString | ||||||
| @ -1662,7 +1697,7 @@ class WidgetAnnotation extends Annotation { | |||||||
|       vPadding |       vPadding | ||||||
|     ); |     ); | ||||||
|     return ( |     return ( | ||||||
|       "/Tx BMC q BT " + |       `/Tx BMC q ${colors}BT ` + | ||||||
|       defaultAppearance + |       defaultAppearance + | ||||||
|       ` 1 0 0 1 0 0 Tm ${renderedText}` + |       ` 1 0 0 1 0 0 Tm ${renderedText}` + | ||||||
|       " ET Q EMC" |       " ET Q EMC" | ||||||
| @ -1790,8 +1825,8 @@ class WidgetAnnotation extends Annotation { | |||||||
|     } else { |     } else { | ||||||
|       shift = hPadding; |       shift = hPadding; | ||||||
|     } |     } | ||||||
|     shift = shift.toFixed(2); |     shift = numberToString(shift); | ||||||
|     vPadding = vPadding.toFixed(2); |     vPadding = numberToString(vPadding); | ||||||
| 
 | 
 | ||||||
|     return `${shift} ${vPadding} Td (${escapeString(text)}) Tj`; |     return `${shift} ${vPadding} Td (${escapeString(text)}) Tj`; | ||||||
|   } |   } | ||||||
| @ -1889,16 +1924,18 @@ class TextWidgetAnnotation extends WidgetAnnotation { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   _getCombAppearance(defaultAppearance, font, text, width, hPadding, vPadding) { |   _getCombAppearance(defaultAppearance, font, text, width, hPadding, vPadding) { | ||||||
|     const combWidth = (width / this.data.maxLen).toFixed(2); |     const combWidth = numberToString(width / this.data.maxLen); | ||||||
|     const buf = []; |     const buf = []; | ||||||
|     const positions = font.getCharPositions(text); |     const positions = font.getCharPositions(text); | ||||||
|     for (const [start, end] of positions) { |     for (const [start, end] of positions) { | ||||||
|       buf.push(`(${escapeString(text.substring(start, end))}) Tj`); |       buf.push(`(${escapeString(text.substring(start, end))}) Tj`); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // Empty or it has a trailing whitespace.
 | ||||||
|  |     const colors = this.getBorderAndBackgroundAppearances(); | ||||||
|     const renderedComb = buf.join(` ${combWidth} 0 Td `); |     const renderedComb = buf.join(` ${combWidth} 0 Td `); | ||||||
|     return ( |     return ( | ||||||
|       "/Tx BMC q BT " + |       `/Tx BMC q ${colors}BT ` + | ||||||
|       defaultAppearance + |       defaultAppearance + | ||||||
|       ` 1 0 0 1 ${hPadding} ${vPadding} Tm ${renderedComb}` + |       ` 1 0 0 1 ${hPadding} ${vPadding} Tm ${renderedComb}` + | ||||||
|       " ET Q EMC" |       " ET Q EMC" | ||||||
| @ -1938,8 +1975,12 @@ class TextWidgetAnnotation extends WidgetAnnotation { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const renderedText = buf.join("\n"); |     const renderedText = buf.join("\n"); | ||||||
|  | 
 | ||||||
|  |     // Empty or it has a trailing whitespace.
 | ||||||
|  |     const colors = this.getBorderAndBackgroundAppearances(); | ||||||
|  | 
 | ||||||
|     return ( |     return ( | ||||||
|       "/Tx BMC q BT " + |       `/Tx BMC q ${colors}BT ` + | ||||||
|       defaultAppearance + |       defaultAppearance + | ||||||
|       ` 1 0 0 1 0 ${height} Tm ${renderedText}` + |       ` 1 0 0 1 0 ${height} Tm ${renderedText}` + | ||||||
|       " ET Q EMC" |       " ET Q EMC" | ||||||
| @ -2295,8 +2336,8 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Values to center the glyph in the bbox.
 |     // Values to center the glyph in the bbox.
 | ||||||
|     const xShift = (width - metrics.width) / 2; |     const xShift = numberToString((width - metrics.width) / 2); | ||||||
|     const yShift = (height - metrics.height) / 2; |     const yShift = numberToString((height - metrics.height) / 2); | ||||||
| 
 | 
 | ||||||
|     const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; |     const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -531,6 +531,23 @@ function recoverJsURL(str) { | |||||||
|   return null; |   return null; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | function numberToString(value) { | ||||||
|  |   if (Number.isInteger(value)) { | ||||||
|  |     return value.toString(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const roundedValue = Math.round(value * 100); | ||||||
|  |   if (roundedValue % 100 === 0) { | ||||||
|  |     return (roundedValue / 100).toString(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (roundedValue % 10 === 0) { | ||||||
|  |     return value.toFixed(1); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return value.toFixed(2); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export { | export { | ||||||
|   collectActions, |   collectActions, | ||||||
|   DocStats, |   DocStats, | ||||||
| @ -542,6 +559,7 @@ export { | |||||||
|   isWhiteSpace, |   isWhiteSpace, | ||||||
|   log2, |   log2, | ||||||
|   MissingDataException, |   MissingDataException, | ||||||
|  |   numberToString, | ||||||
|   ParserEOFException, |   ParserEOFException, | ||||||
|   parseXFAPath, |   parseXFAPath, | ||||||
|   readInt8, |   readInt8, | ||||||
|  | |||||||
| @ -13,9 +13,9 @@ | |||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | import { escapePDFName, numberToString } from "./core_utils.js"; | ||||||
| import { OPS, warn } from "../shared/util.js"; | import { OPS, warn } from "../shared/util.js"; | ||||||
| import { ColorSpace } from "./colorspace.js"; | import { ColorSpace } from "./colorspace.js"; | ||||||
| import { escapePDFName } from "./core_utils.js"; |  | ||||||
| import { EvaluatorPreprocessor } from "./evaluator.js"; | import { EvaluatorPreprocessor } from "./evaluator.js"; | ||||||
| import { Name } from "./primitives.js"; | import { Name } from "./primitives.js"; | ||||||
| import { StringStream } from "./stream.js"; | import { StringStream } from "./stream.js"; | ||||||
| @ -82,18 +82,21 @@ function parseDefaultAppearance(str) { | |||||||
|   return new DefaultAppearanceEvaluator(str).parse(); |   return new DefaultAppearanceEvaluator(str).parse(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Create default appearance string from some information.
 | function getPdfColor(color) { | ||||||
| function createDefaultAppearance({ fontSize, fontName, fontColor }) { |   if (color[0] === color[1] && color[1] === color[2]) { | ||||||
|   let colorCmd; |     const gray = color[0] / 255; | ||||||
|   if (fontColor.every(c => c === 0)) { |     return `${numberToString(gray)} g`; | ||||||
|     colorCmd = "0 g"; |  | ||||||
|   } else { |  | ||||||
|     colorCmd = |  | ||||||
|       Array.from(fontColor) |  | ||||||
|         .map(c => (c / 255).toFixed(2)) |  | ||||||
|         .join(" ") + " rg"; |  | ||||||
|   } |   } | ||||||
|   return `/${escapePDFName(fontName)} ${fontSize} Tf ${colorCmd}`; |   return ( | ||||||
|  |     Array.from(color) | ||||||
|  |       .map(c => numberToString(c / 255)) | ||||||
|  |       .join(" ") + " rg" | ||||||
|  |   ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export { createDefaultAppearance, parseDefaultAppearance }; | // Create default appearance string from some information.
 | ||||||
|  | function createDefaultAppearance({ fontSize, fontName, fontColor }) { | ||||||
|  |   return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor)}`; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export { createDefaultAppearance, getPdfColor, parseDefaultAppearance }; | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ | |||||||
| 
 | 
 | ||||||
| import { bytesToString, escapeString, warn } from "../shared/util.js"; | import { bytesToString, escapeString, warn } from "../shared/util.js"; | ||||||
| import { Dict, Name, Ref } from "./primitives.js"; | import { Dict, Name, Ref } from "./primitives.js"; | ||||||
| import { escapePDFName, parseXFAPath } from "./core_utils.js"; | import { escapePDFName, numberToString, parseXFAPath } from "./core_utils.js"; | ||||||
| import { SimpleDOMNode, SimpleXMLParser } from "./xml_parser.js"; | import { SimpleDOMNode, SimpleXMLParser } from "./xml_parser.js"; | ||||||
| import { BaseStream } from "./base_stream.js"; | import { BaseStream } from "./base_stream.js"; | ||||||
| import { calculateMD5 } from "./crypto.js"; | import { calculateMD5 } from "./crypto.js"; | ||||||
| @ -53,23 +53,6 @@ function writeArray(array, buffer, transform) { | |||||||
|   buffer.push("]"); |   buffer.push("]"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function numberToString(value) { |  | ||||||
|   if (Number.isInteger(value)) { |  | ||||||
|     return value.toString(); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   const roundedValue = Math.round(value * 100); |  | ||||||
|   if (roundedValue % 100 === 0) { |  | ||||||
|     return (roundedValue / 100).toString(); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if (roundedValue % 10 === 0) { |  | ||||||
|     return value.toFixed(1); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return value.toFixed(2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function writeValue(value, buffer, transform) { | function writeValue(value, buffer, transform) { | ||||||
|   if (value instanceof Name) { |   if (value instanceof Name) { | ||||||
|     buffer.push(`/${escapePDFName(value.name)}`); |     buffer.push(`/${escapePDFName(value.name)}`); | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								test/pdfs/issue14928.pdf.link
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								test/pdfs/issue14928.pdf.link
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | https://github.com/mozilla/pdf.js/files/8710789/cerfa_15615-01-2.pdf | ||||||
|  | 
 | ||||||
| @ -6480,5 +6480,19 @@ | |||||||
|       "link": true, |       "link": true, | ||||||
|       "lastPage": 1, |       "lastPage": 1, | ||||||
|       "type": "eq" |       "type": "eq" | ||||||
|  |    }, | ||||||
|  |    {  "id": "issue14928", | ||||||
|  |       "file": "pdfs/issue14928.pdf", | ||||||
|  |       "md5": "9687feb927eeb1b2a6f0794ea00f5c60", | ||||||
|  |       "rounds": 1, | ||||||
|  |       "link": true, | ||||||
|  |       "lastPage": 1, | ||||||
|  |       "type": "eq", | ||||||
|  |       "print": true, | ||||||
|  |       "annotationStorage": { | ||||||
|  |         "1483R": { | ||||||
|  |           "value": "05/17/2022" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|    } |    } | ||||||
| ] | ] | ||||||
|  | |||||||
| @ -1614,7 +1614,7 @@ describe("annotation", function () { | |||||||
|       ); |       ); | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 0 Tm" + |         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 0 Tm" + | ||||||
|           " 2.00 3.04 Td (test\\\\print) Tj ET Q EMC" |           " 2 3.04 Td (test\\\\print) Tj ET Q EMC" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -1650,7 +1650,7 @@ describe("annotation", function () { | |||||||
|         "\x30\x53\x30\x93\x30\x6b\x30\x61\x30\x6f\x4e\x16\x75\x4c\x30\x6e"; |         "\x30\x53\x30\x93\x30\x6b\x30\x61\x30\x6f\x4e\x16\x75\x4c\x30\x6e"; | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Goth 5 Tf 1 0 0 1 0 0 Tm" + |         "/Tx BMC q BT /Goth 5 Tf 1 0 0 1 0 0 Tm" + | ||||||
|           ` 2.00 2.00 Td (${utf16String}) Tj ET Q EMC` |           ` 2 2 Td (${utf16String}) Tj ET Q EMC` | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -1733,7 +1733,7 @@ describe("annotation", function () { | |||||||
|       ); |       ); | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Helv 5.92 Tf 0 g 1 0 0 1 0 0 Tm" + |         "/Tx BMC q BT /Helv 5.92 Tf 0 g 1 0 0 1 0 0 Tm" + | ||||||
|           " 2.00 3.23 Td (test \\(print\\)) Tj ET Q EMC" |           " 2 3.23 Td (test \\(print\\)) Tj ET Q EMC" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -1769,7 +1769,7 @@ describe("annotation", function () { | |||||||
|         "\x30\x53\x30\x93\x30\x6b\x30\x61\x30\x6f\x4e\x16\x75\x4c\x30\x6e"; |         "\x30\x53\x30\x93\x30\x6b\x30\x61\x30\x6f\x4e\x16\x75\x4c\x30\x6e"; | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Goth 3.5 Tf 0 g 1 0 0 1 0 0 Tm" + |         "/Tx BMC q BT /Goth 3.5 Tf 0 g 1 0 0 1 0 0 Tm" + | ||||||
|           ` 2.00 2.00 Td (${utf16String}) Tj ET Q EMC` |           ` 2 2 Td (${utf16String}) Tj ET Q EMC` | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -1832,13 +1832,13 @@ describe("annotation", function () { | |||||||
|       ); |       ); | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 10 Tm " + |         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 10 Tm " + | ||||||
|           "2.00 -5.00 Td (a aa aaa ) Tj\n" + |           "2 -5 Td (a aa aaa ) Tj\n" + | ||||||
|           "0.00 -5.00 Td (aaaa aaaaa ) Tj\n" + |           "0 -5 Td (aaaa aaaaa ) Tj\n" + | ||||||
|           "0.00 -5.00 Td (aaaaaa ) Tj\n" + |           "0 -5 Td (aaaaaa ) Tj\n" + | ||||||
|           "0.00 -5.00 Td (pneumonoultr) Tj\n" + |           "0 -5 Td (pneumonoultr) Tj\n" + | ||||||
|           "0.00 -5.00 Td (amicroscopi) Tj\n" + |           "0 -5 Td (amicroscopi) Tj\n" + | ||||||
|           "0.00 -5.00 Td (csilicovolca) Tj\n" + |           "0 -5 Td (csilicovolca) Tj\n" + | ||||||
|           "0.00 -5.00 Td (noconiosis) Tj ET Q EMC" |           "0 -5 Td (noconiosis) Tj ET Q EMC" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -1873,8 +1873,8 @@ describe("annotation", function () { | |||||||
|       ); |       ); | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Goth 5 Tf 1 0 0 1 0 10 Tm " + |         "/Tx BMC q BT /Goth 5 Tf 1 0 0 1 0 10 Tm " + | ||||||
|           "2.00 -5.00 Td (\x30\x53\x30\x93\x30\x6b\x30\x61\x30\x6f) Tj\n" + |           "2 -5 Td (\x30\x53\x30\x93\x30\x6b\x30\x61\x30\x6f) Tj\n" + | ||||||
|           "0.00 -5.00 Td (\x4e\x16\x75\x4c\x30\x6e) Tj ET Q EMC" |           "0 -5 Td (\x4e\x16\x75\x4c\x30\x6e) Tj ET Q EMC" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -1891,25 +1891,25 @@ describe("annotation", function () { | |||||||
|       partialEvaluator.xref = xref; |       partialEvaluator.xref = xref; | ||||||
|       const expectedAppearance = |       const expectedAppearance = | ||||||
|         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 10 Tm " + |         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 10 Tm " + | ||||||
|         "2.00 -5.00 Td " + |         "2 -5 Td " + | ||||||
|         "(Lorem ipsum dolor sit amet, consectetur adipiscing elit.) Tj\n" + |         "(Lorem ipsum dolor sit amet, consectetur adipiscing elit.) Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "(Aliquam vitae felis ac lectus bibendum ultricies quis non) Tj\n" + |         "(Aliquam vitae felis ac lectus bibendum ultricies quis non) Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "( diam.) Tj\n" + |         "( diam.) Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "(Morbi id porttitor quam, a iaculis dui.) Tj\n" + |         "(Morbi id porttitor quam, a iaculis dui.) Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "(Pellentesque habitant morbi tristique senectus et netus ) Tj\n" + |         "(Pellentesque habitant morbi tristique senectus et netus ) Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "(et malesuada fames ac turpis egestas.) Tj\n" + |         "(et malesuada fames ac turpis egestas.) Tj\n" + | ||||||
|         "0.00 -5.00 Td () Tj\n" + |         "0 -5 Td () Tj\n" + | ||||||
|         "0.00 -5.00 Td () Tj\n" + |         "0 -5 Td () Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "(Nulla consectetur, ligula in tincidunt placerat, velit ) Tj\n" + |         "(Nulla consectetur, ligula in tincidunt placerat, velit ) Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "(augue consectetur orci, sed mattis libero nunc ut massa.) Tj\n" + |         "(augue consectetur orci, sed mattis libero nunc ut massa.) Tj\n" + | ||||||
|         "0.00 -5.00 Td " + |         "0 -5 Td " + | ||||||
|         "(Etiam facilisis tempus interdum.) Tj ET Q EMC"; |         "(Etiam facilisis tempus interdum.) Tj ET Q EMC"; | ||||||
| 
 | 
 | ||||||
|       const annotation = await AnnotationFactory.create( |       const annotation = await AnnotationFactory.create( | ||||||
| @ -1967,10 +1967,10 @@ describe("annotation", function () { | |||||||
|       ); |       ); | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 2 3.035 Tm" + |         "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 2 3.035 Tm" + | ||||||
|           " (a) Tj 8.00 0 Td (a) Tj 8.00 0 Td (\\() Tj" + |           " (a) Tj 8 0 Td (a) Tj 8 0 Td (\\() Tj" + | ||||||
|           " 8.00 0 Td (a) Tj 8.00 0 Td (a) Tj" + |           " 8 0 Td (a) Tj 8 0 Td (a) Tj" + | ||||||
|           " 8.00 0 Td (\\)) Tj 8.00 0 Td (a) Tj" + |           " 8 0 Td (\\)) Tj 8 0 Td (a) Tj" + | ||||||
|           " 8.00 0 Td (\\\\) Tj ET Q EMC" |           " 8 0 Td (\\\\) Tj ET Q EMC" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -2007,10 +2007,10 @@ describe("annotation", function () { | |||||||
|       ); |       ); | ||||||
|       expect(appearance).toEqual( |       expect(appearance).toEqual( | ||||||
|         "/Tx BMC q BT /Goth 5 Tf 1 0 0 1 2 2 Tm" + |         "/Tx BMC q BT /Goth 5 Tf 1 0 0 1 2 2 Tm" + | ||||||
|           " (\x30\x53) Tj 8.00 0 Td (\x30\x93) Tj 8.00 0 Td (\x30\x6b) Tj" + |           " (\x30\x53) Tj 8 0 Td (\x30\x93) Tj 8 0 Td (\x30\x6b) Tj" + | ||||||
|           " 8.00 0 Td (\x30\x61) Tj 8.00 0 Td (\x30\x6f) Tj" + |           " 8 0 Td (\x30\x61) Tj 8 0 Td (\x30\x6f) Tj" + | ||||||
|           " 8.00 0 Td (\x4e\x16) Tj 8.00 0 Td (\x75\x4c) Tj" + |           " 8 0 Td (\x4e\x16) Tj 8 0 Td (\x75\x4c) Tj" + | ||||||
|           " 8.00 0 Td (\x30\x6e) Tj ET Q EMC" |           " 8 0 Td (\x30\x6e) Tj ET Q EMC" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
| @ -2050,9 +2050,9 @@ describe("annotation", function () { | |||||||
|           "/V (hello world) /AP << /N 2 0 R>> /M (date)>>\nendobj\n" |           "/V (hello world) /AP << /N 2 0 R>> /M (date)>>\nendobj\n" | ||||||
|       ); |       ); | ||||||
|       expect(newData.data).toEqual( |       expect(newData.data).toEqual( | ||||||
|         "2 0 obj\n<< /Length 77 /Subtype /Form /Resources " + |         "2 0 obj\n<< /Length 74 /Subtype /Form /Resources " + | ||||||
|           "<< /Font << /Helv 314 0 R>>>> /BBox [0 0 32 10]>> stream\n" + |           "<< /Font << /Helv 314 0 R>>>> /BBox [0 0 32 10]>> stream\n" + | ||||||
|           "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 0 Tm 2.00 3.04 Td (hello world) Tj " + |           "/Tx BMC q BT /Helv 5 Tf 1 0 0 1 0 0 Tm 2 3.04 Td (hello world) Tj " + | ||||||
|           "ET Q EMC\nendstream\nendobj\n" |           "ET Q EMC\nendstream\nendobj\n" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| @ -2181,9 +2181,9 @@ describe("annotation", function () { | |||||||
|           `/V (\xfe\xff${utf16String}) /AP << /N 2 0 R>> /M (date)>>\nendobj\n` |           `/V (\xfe\xff${utf16String}) /AP << /N 2 0 R>> /M (date)>>\nendobj\n` | ||||||
|       ); |       ); | ||||||
|       expect(newData.data).toEqual( |       expect(newData.data).toEqual( | ||||||
|         "2 0 obj\n<< /Length 82 /Subtype /Form /Resources " + |         "2 0 obj\n<< /Length 76 /Subtype /Form /Resources " + | ||||||
|           "<< /Font << /Helv 314 0 R /Goth 159 0 R>>>> /BBox [0 0 32 10]>> stream\n" + |           "<< /Font << /Helv 314 0 R /Goth 159 0 R>>>> /BBox [0 0 32 10]>> stream\n" + | ||||||
|           `/Tx BMC q BT /Goth 5 Tf 1 0 0 1 0 0 Tm 2.00 2.00 Td (${utf16String}) Tj ` + |           `/Tx BMC q BT /Goth 5 Tf 1 0 0 1 0 0 Tm 2 2 Td (${utf16String}) Tj ` + | ||||||
|           "ET Q EMC\nendstream\nendobj\n" |           "ET Q EMC\nendstream\nendobj\n" | ||||||
|       ); |       ); | ||||||
|     }); |     }); | ||||||
| @ -3428,8 +3428,8 @@ describe("annotation", function () { | |||||||
|           "BT", |           "BT", | ||||||
|           "/Helv 5 Tf", |           "/Helv 5 Tf", | ||||||
|           "1 0 0 1 0 10 Tm", |           "1 0 0 1 0 10 Tm", | ||||||
|           "2.00 -5.88 Td (a) Tj", |           "2 -5.88 Td (a) Tj", | ||||||
|           "0.00 -6.75 Td (b) Tj", |           "0 -6.75 Td (b) Tj", | ||||||
|           "ET Q EMC", |           "ET Q EMC", | ||||||
|         ].join("\n") |         ].join("\n") | ||||||
|       ); |       ); | ||||||
| @ -3477,8 +3477,8 @@ describe("annotation", function () { | |||||||
|           "BT", |           "BT", | ||||||
|           "/Helv 5 Tf", |           "/Helv 5 Tf", | ||||||
|           "1 0 0 1 0 10 Tm", |           "1 0 0 1 0 10 Tm", | ||||||
|           "2.00 -5.88 Td (b) Tj", |           "2 -5.88 Td (b) Tj", | ||||||
|           "0.00 -6.75 Td (c) Tj", |           "0 -6.75 Td (c) Tj", | ||||||
|           "ET Q EMC", |           "ET Q EMC", | ||||||
|         ].join("\n") |         ].join("\n") | ||||||
|       ); |       ); | ||||||
| @ -3526,7 +3526,7 @@ describe("annotation", function () { | |||||||
|       expect(newData.data).toEqual( |       expect(newData.data).toEqual( | ||||||
|         [ |         [ | ||||||
|           "2 0 obj", |           "2 0 obj", | ||||||
|           "<< /Length 136 /Subtype /Form /Resources << /Font << /Helv 314 0 R>>>> " + |           "<< /Length 133 /Subtype /Form /Resources << /Font << /Helv 314 0 R>>>> " + | ||||||
|             "/BBox [0 0 32 10]>> stream", |             "/BBox [0 0 32 10]>> stream", | ||||||
|           "/Tx BMC q", |           "/Tx BMC q", | ||||||
|           "1 1 32 10 re W n", |           "1 1 32 10 re W n", | ||||||
| @ -3535,7 +3535,7 @@ describe("annotation", function () { | |||||||
|           "BT", |           "BT", | ||||||
|           "/Helv 5 Tf", |           "/Helv 5 Tf", | ||||||
|           "1 0 0 1 0 10 Tm", |           "1 0 0 1 0 10 Tm", | ||||||
|           "2.00 -5.88 Td (C) Tj", |           "2 -5.88 Td (C) Tj", | ||||||
|           "ET Q EMC", |           "ET Q EMC", | ||||||
|           "endstream", |           "endstream", | ||||||
|           "endobj\n", |           "endobj\n", | ||||||
| @ -3592,7 +3592,7 @@ describe("annotation", function () { | |||||||
|       expect(newData.data).toEqual( |       expect(newData.data).toEqual( | ||||||
|         [ |         [ | ||||||
|           "2 0 obj", |           "2 0 obj", | ||||||
|           "<< /Length 177 /Subtype /Form /Resources << /Font << /Helv 314 0 R>>>> " + |           "<< /Length 171 /Subtype /Form /Resources << /Font << /Helv 314 0 R>>>> " + | ||||||
|             "/BBox [0 0 32 10]>> stream", |             "/BBox [0 0 32 10]>> stream", | ||||||
|           "/Tx BMC q", |           "/Tx BMC q", | ||||||
|           "1 1 32 10 re W n", |           "1 1 32 10 re W n", | ||||||
| @ -3602,8 +3602,8 @@ describe("annotation", function () { | |||||||
|           "BT", |           "BT", | ||||||
|           "/Helv 5 Tf", |           "/Helv 5 Tf", | ||||||
|           "1 0 0 1 0 10 Tm", |           "1 0 0 1 0 10 Tm", | ||||||
|           "2.00 -5.88 Td (b) Tj", |           "2 -5.88 Td (b) Tj", | ||||||
|           "0.00 -6.75 Td (c) Tj", |           "0 -6.75 Td (c) Tj", | ||||||
|           "ET Q EMC", |           "ET Q EMC", | ||||||
|           "endstream", |           "endstream", | ||||||
|           "endobj\n", |           "endobj\n", | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ import { | |||||||
| describe("Default appearance", function () { | describe("Default appearance", function () { | ||||||
|   describe("parseDefaultAppearance and createDefaultAppearance", function () { |   describe("parseDefaultAppearance and createDefaultAppearance", function () { | ||||||
|     it("should parse and create default appearance", function () { |     it("should parse and create default appearance", function () { | ||||||
|       const da = "/F1 12 Tf 0.10 0.20 0.30 rg"; |       const da = "/F1 12 Tf 0.1 0.2 0.3 rg"; | ||||||
|       const result = { |       const result = { | ||||||
|         fontSize: 12, |         fontSize: 12, | ||||||
|         fontName: "F1", |         fontName: "F1", | ||||||
| @ -42,8 +42,7 @@ describe("Default appearance", function () { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it("should parse default appearance with save/restore", function () { |     it("should parse default appearance with save/restore", function () { | ||||||
|       const da = |       const da = "q Q 0.1 0.2 0.3 rg /F1 12 Tf q 0.3 0.2 0.1 rg /F2 13 Tf Q"; | ||||||
|         "q Q 0.10 0.20 0.30 rg /F1 12 Tf q 0.30 0.20 0.10 rg /F2 13 Tf Q"; |  | ||||||
|       expect(parseDefaultAppearance(da)).toEqual({ |       expect(parseDefaultAppearance(da)).toEqual({ | ||||||
|         fontSize: 12, |         fontSize: 12, | ||||||
|         fontName: "F1", |         fontName: "F1", | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user