1//---------------------------------------------------------------------------------------
2// Copyright (c) 2001-2023 by Apryse Software Inc. All Rights Reserved.
3// Consult legal.txt regarding legal and license information.
4//---------------------------------------------------------------------------------------
5
6(exports => {
7
8  exports.runElementEditTest = () => {
9    const PDFNet = exports.Core.PDFNet;
10
11    async function ProcessElements(reader, writer, visited) {
12      await PDFNet.startDeallocateStack();
13      const colorspace = await PDFNet.ColorSpace.createDeviceRGB();
14      const redColor = await PDFNet.ColorPt.init(1, 0, 0, 0);
15      const blueColor = await PDFNet.ColorPt.init(0, 0, 1, 0);
16
17      for (let element = await reader.next(); element !== null; element = await reader.next()) {
18        const elementType = await element.getType();
19        let gs;
20        let formObj;
21        let formObjNum = null;
22        switch (elementType) {
23          case PDFNet.Element.Type.e_image:
24          case PDFNet.Element.Type.e_inline_image:
25            // remove all images by skipping them
26            break;
27          case PDFNet.Element.Type.e_path:
28            // Set all paths to red
29            gs = await element.getGState();
30            gs.setFillColorSpace(colorspace);
31            gs.setFillColorWithColorPt(redColor);
32            writer.writeElement(element);
33            break;
34          case PDFNet.Element.Type.e_text:
35            // Set all text to blue
36            gs = await element.getGState();
37            gs.setFillColorSpace(colorspace);
38            gs.setFillColorWithColorPt(blueColor);
39            writer.writeElement(element);
40            break;
41          case PDFNet.Element.Type.e_form:
42            writer.writeElement(element);
43            formObj = await element.getXObject();
44            formObjNum = formObj.getObjNum();
45            // if XObject not yet processed
46            if (visited.indexOf(formObjNum) === -1) {
47              // Set Replacement
48              const insertedObj = await formObj.getObjNum();
49              if (!visited.includes(insertedObj)) {
50                visited.push(insertedObj);
51              }
52              const newWriter = await PDFNet.ElementWriter.create();
53              reader.formBegin();
54              newWriter.beginOnObj(formObj, true);
55              await ProcessElements(reader, newWriter, visited);
56              newWriter.end();
57              reader.end();
58            }
59            break;
60          default:
61            writer.writeElement(element);
62        }
63      }
64      await PDFNet.endDeallocateStack();
65    }
66
67    const main = async () => {
68      console.log('Beginning Test');
69      const ret = 0;
70      // Relative path to the folder containing test files.
71      const inputUrl = '../TestFiles/';
72      const doc = await PDFNet.PDFDoc.createFromURL(inputUrl + 'newsletter.pdf');
73      doc.initSecurityHandler();
74      doc.lock();
75
76      console.log('PDF document initialized and locked');
77      const writer = await PDFNet.ElementWriter.create();
78      const reader = await PDFNet.ElementReader.create();
79      const visited = [];
80
81      const totalPageNumber = await doc.getPageCount();
82
83      const itr = await doc.getPageIterator(1);
84
85      // Read every page
86      for (itr; await itr.hasNext(); itr.next()) {
87        const page = await itr.current();
88        const currentPageNumber = await page.getIndex();
89        console.log('Processing elements on page ' + currentPageNumber + '/' + totalPageNumber);
90        const sdfObj = await page.getSDFObj();
91        // Set Replacement
92        const insertedObj = await sdfObj.getObjNum();
93        if (!visited.includes(insertedObj)) {
94          visited.push(insertedObj);
95        }
96        reader.beginOnPage(page);
97        writer.beginOnPage(page, PDFNet.ElementWriter.WriteMode.e_replacement, false);
98        await ProcessElements(reader, writer, visited);
99        writer.end();
100        reader.end();
101      }
102
103      const docBuffer = await doc.saveMemoryBuffer(PDFNet.SDFDoc.SaveOptions.e_remove_unused);
104      saveBufferAsPDFDoc(docBuffer, 'newsletter_edited.pdf');
105      console.log('Done.');
106      return ret;
107    };
108
109    // add your own license key as the second parameter, e.g. PDFNet.runWithCleanup(main, 'YOUR_LICENSE_KEY')
110    PDFNet.runWithCleanup(main);
111  };
112})(window);
113// eslint-disable-next-line spaced-comment
114//# sourceURL=ElementEditTest.js