watermark.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import {
  2. WatermarkType,
  3. } from '../constants/type';
  4. import { floatToHex } from './utility';
  5. import { xmlParser, getElementsByTagName } from './dom';
  6. type WatermarkAnnotType = {
  7. obj_type: string;
  8. obj_attr: WatermarkType;
  9. };
  10. export const parseWatermarkFromXml = (xmlString: string): WatermarkAnnotType => {
  11. if (!xmlString) return { obj_type: 'watermark', obj_attr: {} };
  12. const xmlDoc = xmlParser(xmlString);
  13. const elements = xmlDoc.firstElementChild || xmlDoc.firstChild;
  14. const data: WatermarkType = {};
  15. const element = getElementsByTagName(elements as ChildNode, 'watermarks');
  16. if (element[1]) {
  17. const array: Element[] = Array.prototype.slice.call(element[1].childNodes);
  18. array.forEach((ele, index) => {
  19. const attr: any = ele.attributes;
  20. switch (ele.tagName) {
  21. case 'Font':
  22. data.type = 'text';
  23. data.text = (array[index + 1].textContent as string).trim();
  24. break;
  25. case 'Opacity': {
  26. data.opacity = attr.value.value;
  27. break;
  28. }
  29. case 'Rotation': {
  30. data.rotation = parseFloat(attr.value.value);
  31. break;
  32. }
  33. case 'Scale': {
  34. data.scale = parseFloat(attr.value.value);
  35. break;
  36. }
  37. case 'Color': {
  38. const r = attr.r.value;
  39. const g = attr.g.value;
  40. const b = attr.b.value;
  41. data.textcolor = floatToHex(r, g, b);
  42. break;
  43. }
  44. case 'PageRange': {
  45. data.pages = (array[index + 1].textContent as string).trim();
  46. break;
  47. }
  48. default:
  49. break;
  50. }
  51. });
  52. }
  53. return {
  54. obj_type: 'watermark',
  55. obj_attr: {
  56. vertalign: 'center',
  57. horizalign: 'center',
  58. xoffset: 0,
  59. yoffset: 0,
  60. isfront: 'yes',
  61. ...data,
  62. },
  63. };
  64. };
  65. export default parseWatermarkFromXml;