annotation.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. /* Copyright 2017 Mozilla Foundation
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. 'use strict';
  16. var sharedUtil = require('../shared/util.js');
  17. var corePrimitives = require('./primitives.js');
  18. var coreStream = require('./stream.js');
  19. var coreColorSpace = require('./colorspace.js');
  20. var coreObj = require('./obj.js');
  21. var coreEvaluator = require('./evaluator.js');
  22. var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType;
  23. var AnnotationFieldFlag = sharedUtil.AnnotationFieldFlag;
  24. var AnnotationFlag = sharedUtil.AnnotationFlag;
  25. var AnnotationType = sharedUtil.AnnotationType;
  26. var OPS = sharedUtil.OPS;
  27. var Util = sharedUtil.Util;
  28. var isArray = sharedUtil.isArray;
  29. var isInt = sharedUtil.isInt;
  30. var stringToBytes = sharedUtil.stringToBytes;
  31. var stringToPDFString = sharedUtil.stringToPDFString;
  32. var warn = sharedUtil.warn;
  33. var Dict = corePrimitives.Dict;
  34. var isDict = corePrimitives.isDict;
  35. var isName = corePrimitives.isName;
  36. var isRef = corePrimitives.isRef;
  37. var isStream = corePrimitives.isStream;
  38. var Stream = coreStream.Stream;
  39. var ColorSpace = coreColorSpace.ColorSpace;
  40. var Catalog = coreObj.Catalog;
  41. var ObjectLoader = coreObj.ObjectLoader;
  42. var FileSpec = coreObj.FileSpec;
  43. var OperatorList = coreEvaluator.OperatorList;
  44. function AnnotationFactory() {
  45. }
  46. AnnotationFactory.prototype = {
  47. create: function AnnotationFactory_create(xref, ref, pdfManager, idFactory) {
  48. var dict = xref.fetchIfRef(ref);
  49. if (!isDict(dict)) {
  50. return;
  51. }
  52. var id = isRef(ref) ? ref.toString() : 'annot_' + idFactory.createObjId();
  53. var subtype = dict.get('Subtype');
  54. subtype = isName(subtype) ? subtype.name : null;
  55. var parameters = {
  56. xref: xref,
  57. dict: dict,
  58. ref: isRef(ref) ? ref : null,
  59. subtype: subtype,
  60. id: id,
  61. pdfManager: pdfManager
  62. };
  63. switch (subtype) {
  64. case 'Link':
  65. return new LinkAnnotation(parameters);
  66. case 'Text':
  67. return new TextAnnotation(parameters);
  68. case 'Widget':
  69. var fieldType = Util.getInheritableProperty(dict, 'FT');
  70. fieldType = isName(fieldType) ? fieldType.name : null;
  71. switch (fieldType) {
  72. case 'Tx':
  73. return new TextWidgetAnnotation(parameters);
  74. case 'Btn':
  75. return new ButtonWidgetAnnotation(parameters);
  76. case 'Ch':
  77. return new ChoiceWidgetAnnotation(parameters);
  78. }
  79. warn('Unimplemented widget field type "' + fieldType + '", ' + 'falling back to base field type.');
  80. return new WidgetAnnotation(parameters);
  81. case 'Popup':
  82. return new PopupAnnotation(parameters);
  83. case 'Highlight':
  84. return new HighlightAnnotation(parameters);
  85. case 'Underline':
  86. return new UnderlineAnnotation(parameters);
  87. case 'Squiggly':
  88. return new SquigglyAnnotation(parameters);
  89. case 'StrikeOut':
  90. return new StrikeOutAnnotation(parameters);
  91. case 'FileAttachment':
  92. return new FileAttachmentAnnotation(parameters);
  93. default:
  94. if (!subtype) {
  95. warn('Annotation is missing the required /Subtype.');
  96. } else {
  97. warn('Unimplemented annotation type "' + subtype + '", ' + 'falling back to base annotation.');
  98. }
  99. return new Annotation(parameters);
  100. }
  101. }
  102. };
  103. var Annotation = function AnnotationClosure() {
  104. function getTransformMatrix(rect, bbox, matrix) {
  105. var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);
  106. var minX = bounds[0];
  107. var minY = bounds[1];
  108. var maxX = bounds[2];
  109. var maxY = bounds[3];
  110. if (minX === maxX || minY === maxY) {
  111. return [
  112. 1,
  113. 0,
  114. 0,
  115. 1,
  116. rect[0],
  117. rect[1]
  118. ];
  119. }
  120. var xRatio = (rect[2] - rect[0]) / (maxX - minX);
  121. var yRatio = (rect[3] - rect[1]) / (maxY - minY);
  122. return [
  123. xRatio,
  124. 0,
  125. 0,
  126. yRatio,
  127. rect[0] - minX * xRatio,
  128. rect[1] - minY * yRatio
  129. ];
  130. }
  131. function Annotation(params) {
  132. var dict = params.dict;
  133. this.setFlags(dict.get('F'));
  134. this.setRectangle(dict.getArray('Rect'));
  135. this.setColor(dict.getArray('C'));
  136. this.setBorderStyle(dict);
  137. this.setAppearance(dict);
  138. this.data = {};
  139. this.data.id = params.id;
  140. this.data.subtype = params.subtype;
  141. this.data.annotationFlags = this.flags;
  142. this.data.rect = this.rectangle;
  143. this.data.color = this.color;
  144. this.data.borderStyle = this.borderStyle;
  145. this.data.hasAppearance = !!this.appearance;
  146. }
  147. Annotation.prototype = {
  148. _hasFlag: function Annotation_hasFlag(flags, flag) {
  149. return !!(flags & flag);
  150. },
  151. _isViewable: function Annotation_isViewable(flags) {
  152. return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.NOVIEW);
  153. },
  154. _isPrintable: function AnnotationFlag_isPrintable(flags) {
  155. return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.HIDDEN);
  156. },
  157. get viewable() {
  158. if (this.flags === 0) {
  159. return true;
  160. }
  161. return this._isViewable(this.flags);
  162. },
  163. get printable() {
  164. if (this.flags === 0) {
  165. return false;
  166. }
  167. return this._isPrintable(this.flags);
  168. },
  169. setFlags: function Annotation_setFlags(flags) {
  170. this.flags = isInt(flags) && flags > 0 ? flags : 0;
  171. },
  172. hasFlag: function Annotation_hasFlag(flag) {
  173. return this._hasFlag(this.flags, flag);
  174. },
  175. setRectangle: function Annotation_setRectangle(rectangle) {
  176. if (isArray(rectangle) && rectangle.length === 4) {
  177. this.rectangle = Util.normalizeRect(rectangle);
  178. } else {
  179. this.rectangle = [
  180. 0,
  181. 0,
  182. 0,
  183. 0
  184. ];
  185. }
  186. },
  187. setColor: function Annotation_setColor(color) {
  188. var rgbColor = new Uint8Array(3);
  189. if (!isArray(color)) {
  190. this.color = rgbColor;
  191. return;
  192. }
  193. switch (color.length) {
  194. case 0:
  195. this.color = null;
  196. break;
  197. case 1:
  198. ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);
  199. this.color = rgbColor;
  200. break;
  201. case 3:
  202. ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);
  203. this.color = rgbColor;
  204. break;
  205. case 4:
  206. ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);
  207. this.color = rgbColor;
  208. break;
  209. default:
  210. this.color = rgbColor;
  211. break;
  212. }
  213. },
  214. setBorderStyle: function Annotation_setBorderStyle(borderStyle) {
  215. this.borderStyle = new AnnotationBorderStyle();
  216. if (!isDict(borderStyle)) {
  217. return;
  218. }
  219. if (borderStyle.has('BS')) {
  220. var dict = borderStyle.get('BS');
  221. var dictType = dict.get('Type');
  222. if (!dictType || isName(dictType, 'Border')) {
  223. this.borderStyle.setWidth(dict.get('W'));
  224. this.borderStyle.setStyle(dict.get('S'));
  225. this.borderStyle.setDashArray(dict.getArray('D'));
  226. }
  227. } else if (borderStyle.has('Border')) {
  228. var array = borderStyle.getArray('Border');
  229. if (isArray(array) && array.length >= 3) {
  230. this.borderStyle.setHorizontalCornerRadius(array[0]);
  231. this.borderStyle.setVerticalCornerRadius(array[1]);
  232. this.borderStyle.setWidth(array[2]);
  233. if (array.length === 4) {
  234. this.borderStyle.setDashArray(array[3]);
  235. }
  236. }
  237. } else {
  238. this.borderStyle.setWidth(0);
  239. }
  240. },
  241. setAppearance: function Annotation_setAppearance(dict) {
  242. this.appearance = null;
  243. var appearanceStates = dict.get('AP');
  244. if (!isDict(appearanceStates)) {
  245. return;
  246. }
  247. var normalAppearanceState = appearanceStates.get('N');
  248. if (isStream(normalAppearanceState)) {
  249. this.appearance = normalAppearanceState;
  250. return;
  251. }
  252. if (!isDict(normalAppearanceState)) {
  253. return;
  254. }
  255. var as = dict.get('AS');
  256. if (!isName(as) || !normalAppearanceState.has(as.name)) {
  257. return;
  258. }
  259. this.appearance = normalAppearanceState.get(as.name);
  260. },
  261. _preparePopup: function Annotation_preparePopup(dict) {
  262. if (!dict.has('C')) {
  263. this.data.color = null;
  264. }
  265. this.data.hasPopup = dict.has('Popup');
  266. this.data.title = stringToPDFString(dict.get('T') || '');
  267. this.data.contents = stringToPDFString(dict.get('Contents') || '');
  268. },
  269. loadResources: function Annotation_loadResources(keys) {
  270. return new Promise(function (resolve, reject) {
  271. this.appearance.dict.getAsync('Resources').then(function (resources) {
  272. if (!resources) {
  273. resolve();
  274. return;
  275. }
  276. var objectLoader = new ObjectLoader(resources.map, keys, resources.xref);
  277. objectLoader.load().then(function () {
  278. resolve(resources);
  279. }, reject);
  280. }, reject);
  281. }.bind(this));
  282. },
  283. getOperatorList: function Annotation_getOperatorList(evaluator, task, renderForms) {
  284. if (!this.appearance) {
  285. return Promise.resolve(new OperatorList());
  286. }
  287. var data = this.data;
  288. var appearanceDict = this.appearance.dict;
  289. var resourcesPromise = this.loadResources([
  290. 'ExtGState',
  291. 'ColorSpace',
  292. 'Pattern',
  293. 'Shading',
  294. 'XObject',
  295. 'Font'
  296. ]);
  297. var bbox = appearanceDict.getArray('BBox') || [
  298. 0,
  299. 0,
  300. 1,
  301. 1
  302. ];
  303. var matrix = appearanceDict.getArray('Matrix') || [
  304. 1,
  305. 0,
  306. 0,
  307. 1,
  308. 0,
  309. 0
  310. ];
  311. var transform = getTransformMatrix(data.rect, bbox, matrix);
  312. var self = this;
  313. return resourcesPromise.then(function (resources) {
  314. var opList = new OperatorList();
  315. opList.addOp(OPS.beginAnnotation, [
  316. data.rect,
  317. transform,
  318. matrix
  319. ]);
  320. return evaluator.getOperatorList(self.appearance, task, resources, opList).then(function () {
  321. opList.addOp(OPS.endAnnotation, []);
  322. self.appearance.reset();
  323. return opList;
  324. });
  325. });
  326. }
  327. };
  328. return Annotation;
  329. }();
  330. var AnnotationBorderStyle = function AnnotationBorderStyleClosure() {
  331. function AnnotationBorderStyle() {
  332. this.width = 1;
  333. this.style = AnnotationBorderStyleType.SOLID;
  334. this.dashArray = [3];
  335. this.horizontalCornerRadius = 0;
  336. this.verticalCornerRadius = 0;
  337. }
  338. AnnotationBorderStyle.prototype = {
  339. setWidth: function AnnotationBorderStyle_setWidth(width) {
  340. if (width === (width | 0)) {
  341. this.width = width;
  342. }
  343. },
  344. setStyle: function AnnotationBorderStyle_setStyle(style) {
  345. if (!style) {
  346. return;
  347. }
  348. switch (style.name) {
  349. case 'S':
  350. this.style = AnnotationBorderStyleType.SOLID;
  351. break;
  352. case 'D':
  353. this.style = AnnotationBorderStyleType.DASHED;
  354. break;
  355. case 'B':
  356. this.style = AnnotationBorderStyleType.BEVELED;
  357. break;
  358. case 'I':
  359. this.style = AnnotationBorderStyleType.INSET;
  360. break;
  361. case 'U':
  362. this.style = AnnotationBorderStyleType.UNDERLINE;
  363. break;
  364. default:
  365. break;
  366. }
  367. },
  368. setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) {
  369. if (isArray(dashArray) && dashArray.length > 0) {
  370. var isValid = true;
  371. var allZeros = true;
  372. for (var i = 0, len = dashArray.length; i < len; i++) {
  373. var element = dashArray[i];
  374. var validNumber = +element >= 0;
  375. if (!validNumber) {
  376. isValid = false;
  377. break;
  378. } else if (element > 0) {
  379. allZeros = false;
  380. }
  381. }
  382. if (isValid && !allZeros) {
  383. this.dashArray = dashArray;
  384. } else {
  385. this.width = 0;
  386. }
  387. } else if (dashArray) {
  388. this.width = 0;
  389. }
  390. },
  391. setHorizontalCornerRadius: function AnnotationBorderStyle_setHorizontalCornerRadius(radius) {
  392. if (radius === (radius | 0)) {
  393. this.horizontalCornerRadius = radius;
  394. }
  395. },
  396. setVerticalCornerRadius: function AnnotationBorderStyle_setVerticalCornerRadius(radius) {
  397. if (radius === (radius | 0)) {
  398. this.verticalCornerRadius = radius;
  399. }
  400. }
  401. };
  402. return AnnotationBorderStyle;
  403. }();
  404. var WidgetAnnotation = function WidgetAnnotationClosure() {
  405. function WidgetAnnotation(params) {
  406. Annotation.call(this, params);
  407. var dict = params.dict;
  408. var data = this.data;
  409. data.annotationType = AnnotationType.WIDGET;
  410. data.fieldName = this._constructFieldName(dict);
  411. data.fieldValue = Util.getInheritableProperty(dict, 'V', true);
  412. data.alternativeText = stringToPDFString(dict.get('TU') || '');
  413. data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || '';
  414. var fieldType = Util.getInheritableProperty(dict, 'FT');
  415. data.fieldType = isName(fieldType) ? fieldType.name : null;
  416. this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty;
  417. data.fieldFlags = Util.getInheritableProperty(dict, 'Ff');
  418. if (!isInt(data.fieldFlags) || data.fieldFlags < 0) {
  419. data.fieldFlags = 0;
  420. }
  421. data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY);
  422. if (data.fieldType === 'Sig') {
  423. this.setFlags(AnnotationFlag.HIDDEN);
  424. }
  425. }
  426. Util.inherit(WidgetAnnotation, Annotation, {
  427. _constructFieldName: function WidgetAnnotation_constructFieldName(dict) {
  428. if (!dict.has('T') && !dict.has('Parent')) {
  429. warn('Unknown field name, falling back to empty field name.');
  430. return '';
  431. }
  432. if (!dict.has('Parent')) {
  433. return stringToPDFString(dict.get('T'));
  434. }
  435. var fieldName = [];
  436. if (dict.has('T')) {
  437. fieldName.unshift(stringToPDFString(dict.get('T')));
  438. }
  439. var loopDict = dict;
  440. while (loopDict.has('Parent')) {
  441. loopDict = loopDict.get('Parent');
  442. if (!isDict(loopDict)) {
  443. break;
  444. }
  445. if (loopDict.has('T')) {
  446. fieldName.unshift(stringToPDFString(loopDict.get('T')));
  447. }
  448. }
  449. return fieldName.join('.');
  450. },
  451. hasFieldFlag: function WidgetAnnotation_hasFieldFlag(flag) {
  452. return !!(this.data.fieldFlags & flag);
  453. }
  454. });
  455. return WidgetAnnotation;
  456. }();
  457. var TextWidgetAnnotation = function TextWidgetAnnotationClosure() {
  458. function TextWidgetAnnotation(params) {
  459. WidgetAnnotation.call(this, params);
  460. this.data.fieldValue = stringToPDFString(this.data.fieldValue || '');
  461. var alignment = Util.getInheritableProperty(params.dict, 'Q');
  462. if (!isInt(alignment) || alignment < 0 || alignment > 2) {
  463. alignment = null;
  464. }
  465. this.data.textAlignment = alignment;
  466. var maximumLength = Util.getInheritableProperty(params.dict, 'MaxLen');
  467. if (!isInt(maximumLength) || maximumLength < 0) {
  468. maximumLength = null;
  469. }
  470. this.data.maxLen = maximumLength;
  471. this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE);
  472. this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== null;
  473. }
  474. Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {
  475. getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {
  476. var operatorList = new OperatorList();
  477. if (renderForms) {
  478. return Promise.resolve(operatorList);
  479. }
  480. if (this.appearance) {
  481. return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);
  482. }
  483. if (!this.data.defaultAppearance) {
  484. return Promise.resolve(operatorList);
  485. }
  486. var stream = new Stream(stringToBytes(this.data.defaultAppearance));
  487. return evaluator.getOperatorList(stream, task, this.fieldResources, operatorList).then(function () {
  488. return operatorList;
  489. });
  490. }
  491. });
  492. return TextWidgetAnnotation;
  493. }();
  494. var ButtonWidgetAnnotation = function ButtonWidgetAnnotationClosure() {
  495. function ButtonWidgetAnnotation(params) {
  496. WidgetAnnotation.call(this, params);
  497. this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);
  498. if (this.data.checkBox) {
  499. if (!isName(this.data.fieldValue)) {
  500. return;
  501. }
  502. this.data.fieldValue = this.data.fieldValue.name;
  503. }
  504. this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);
  505. if (this.data.radioButton) {
  506. this.data.fieldValue = this.data.buttonValue = null;
  507. var fieldParent = params.dict.get('Parent');
  508. if (isDict(fieldParent) && fieldParent.has('V')) {
  509. var fieldParentValue = fieldParent.get('V');
  510. if (isName(fieldParentValue)) {
  511. this.data.fieldValue = fieldParentValue.name;
  512. }
  513. }
  514. var appearanceStates = params.dict.get('AP');
  515. if (!isDict(appearanceStates)) {
  516. return;
  517. }
  518. var normalAppearanceState = appearanceStates.get('N');
  519. if (!isDict(normalAppearanceState)) {
  520. return;
  521. }
  522. var keys = normalAppearanceState.getKeys();
  523. for (var i = 0, ii = keys.length; i < ii; i++) {
  524. if (keys[i] !== 'Off') {
  525. this.data.buttonValue = keys[i];
  526. break;
  527. }
  528. }
  529. }
  530. }
  531. Util.inherit(ButtonWidgetAnnotation, WidgetAnnotation, {
  532. getOperatorList: function ButtonWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {
  533. var operatorList = new OperatorList();
  534. if (renderForms) {
  535. return Promise.resolve(operatorList);
  536. }
  537. if (this.appearance) {
  538. return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);
  539. }
  540. return Promise.resolve(operatorList);
  541. }
  542. });
  543. return ButtonWidgetAnnotation;
  544. }();
  545. var ChoiceWidgetAnnotation = function ChoiceWidgetAnnotationClosure() {
  546. function ChoiceWidgetAnnotation(params) {
  547. WidgetAnnotation.call(this, params);
  548. this.data.options = [];
  549. var options = Util.getInheritableProperty(params.dict, 'Opt');
  550. if (isArray(options)) {
  551. var xref = params.xref;
  552. for (var i = 0, ii = options.length; i < ii; i++) {
  553. var option = xref.fetchIfRef(options[i]);
  554. var isOptionArray = isArray(option);
  555. this.data.options[i] = {
  556. exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option,
  557. displayValue: isOptionArray ? xref.fetchIfRef(option[1]) : option
  558. };
  559. }
  560. }
  561. if (!isArray(this.data.fieldValue)) {
  562. this.data.fieldValue = [this.data.fieldValue];
  563. }
  564. this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO);
  565. this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT);
  566. }
  567. Util.inherit(ChoiceWidgetAnnotation, WidgetAnnotation, {
  568. getOperatorList: function ChoiceWidgetAnnotation_getOperatorList(evaluator, task, renderForms) {
  569. var operatorList = new OperatorList();
  570. if (renderForms) {
  571. return Promise.resolve(operatorList);
  572. }
  573. return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms);
  574. }
  575. });
  576. return ChoiceWidgetAnnotation;
  577. }();
  578. var TextAnnotation = function TextAnnotationClosure() {
  579. var DEFAULT_ICON_SIZE = 22;
  580. function TextAnnotation(parameters) {
  581. Annotation.call(this, parameters);
  582. this.data.annotationType = AnnotationType.TEXT;
  583. if (this.data.hasAppearance) {
  584. this.data.name = 'NoIcon';
  585. } else {
  586. this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;
  587. this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;
  588. this.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note';
  589. }
  590. this._preparePopup(parameters.dict);
  591. }
  592. Util.inherit(TextAnnotation, Annotation, {});
  593. return TextAnnotation;
  594. }();
  595. var LinkAnnotation = function LinkAnnotationClosure() {
  596. function LinkAnnotation(params) {
  597. Annotation.call(this, params);
  598. var data = this.data;
  599. data.annotationType = AnnotationType.LINK;
  600. Catalog.parseDestDictionary({
  601. destDict: params.dict,
  602. resultObj: data,
  603. docBaseUrl: params.pdfManager.docBaseUrl
  604. });
  605. }
  606. Util.inherit(LinkAnnotation, Annotation, {});
  607. return LinkAnnotation;
  608. }();
  609. var PopupAnnotation = function PopupAnnotationClosure() {
  610. function PopupAnnotation(parameters) {
  611. Annotation.call(this, parameters);
  612. this.data.annotationType = AnnotationType.POPUP;
  613. var dict = parameters.dict;
  614. var parentItem = dict.get('Parent');
  615. if (!parentItem) {
  616. warn('Popup annotation has a missing or invalid parent annotation.');
  617. return;
  618. }
  619. this.data.parentId = dict.getRaw('Parent').toString();
  620. this.data.title = stringToPDFString(parentItem.get('T') || '');
  621. this.data.contents = stringToPDFString(parentItem.get('Contents') || '');
  622. if (!parentItem.has('C')) {
  623. this.data.color = null;
  624. } else {
  625. this.setColor(parentItem.getArray('C'));
  626. this.data.color = this.color;
  627. }
  628. if (!this.viewable) {
  629. var parentFlags = parentItem.get('F');
  630. if (this._isViewable(parentFlags)) {
  631. this.setFlags(parentFlags);
  632. }
  633. }
  634. }
  635. Util.inherit(PopupAnnotation, Annotation, {});
  636. return PopupAnnotation;
  637. }();
  638. var HighlightAnnotation = function HighlightAnnotationClosure() {
  639. function HighlightAnnotation(parameters) {
  640. Annotation.call(this, parameters);
  641. this.data.annotationType = AnnotationType.HIGHLIGHT;
  642. this._preparePopup(parameters.dict);
  643. this.data.borderStyle.setWidth(0);
  644. }
  645. Util.inherit(HighlightAnnotation, Annotation, {});
  646. return HighlightAnnotation;
  647. }();
  648. var UnderlineAnnotation = function UnderlineAnnotationClosure() {
  649. function UnderlineAnnotation(parameters) {
  650. Annotation.call(this, parameters);
  651. this.data.annotationType = AnnotationType.UNDERLINE;
  652. this._preparePopup(parameters.dict);
  653. this.data.borderStyle.setWidth(0);
  654. }
  655. Util.inherit(UnderlineAnnotation, Annotation, {});
  656. return UnderlineAnnotation;
  657. }();
  658. var SquigglyAnnotation = function SquigglyAnnotationClosure() {
  659. function SquigglyAnnotation(parameters) {
  660. Annotation.call(this, parameters);
  661. this.data.annotationType = AnnotationType.SQUIGGLY;
  662. this._preparePopup(parameters.dict);
  663. this.data.borderStyle.setWidth(0);
  664. }
  665. Util.inherit(SquigglyAnnotation, Annotation, {});
  666. return SquigglyAnnotation;
  667. }();
  668. var StrikeOutAnnotation = function StrikeOutAnnotationClosure() {
  669. function StrikeOutAnnotation(parameters) {
  670. Annotation.call(this, parameters);
  671. this.data.annotationType = AnnotationType.STRIKEOUT;
  672. this._preparePopup(parameters.dict);
  673. this.data.borderStyle.setWidth(0);
  674. }
  675. Util.inherit(StrikeOutAnnotation, Annotation, {});
  676. return StrikeOutAnnotation;
  677. }();
  678. var FileAttachmentAnnotation = function FileAttachmentAnnotationClosure() {
  679. function FileAttachmentAnnotation(parameters) {
  680. Annotation.call(this, parameters);
  681. var file = new FileSpec(parameters.dict.get('FS'), parameters.xref);
  682. this.data.annotationType = AnnotationType.FILEATTACHMENT;
  683. this.data.file = file.serializable;
  684. this._preparePopup(parameters.dict);
  685. }
  686. Util.inherit(FileAttachmentAnnotation, Annotation, {});
  687. return FileAttachmentAnnotation;
  688. }();
  689. exports.Annotation = Annotation;
  690. exports.AnnotationBorderStyle = AnnotationBorderStyle;
  691. exports.AnnotationFactory = AnnotationFactory;