Manipulacija PDF sadržajem uz novi ONLYOFFICE PDF Editor API

ONLYOFFICE je nedavno predstavio novi PDF API, donoseći podršku za makroe u PDF-u. Uz ove nove metode, možete programatski da komunicirate sa PDF dokumentima — automatizujući zadatke koji bi inače zahtevali ručni rad. U ovom blog postu istražićemo tri praktična makroa koji pokazuju šta možete uraditi sa novim API-jem.
Manipulate PDF Content with the New ONLYOFFICE PDF Editor API

Nove PDF API metode

Evo pregleda novih metoda koje se koriste u tri primera makroa:

  • GetPagesCount() vraća ukupan broj stranica u PDF dokumentu.
  • GetPage(index) preuzima određeni objekat stranice po indeksu, vraćajući ApiPage objekat.
  • GetAllAnnots() vraća niz svih anotacija na datoj stranici.
  • GetContents() preuzima tekstualni sadržaj anotacije.
  • GetAllDrawings() vraća niz svih objekata crteža (oblici, grafikoni, slike).
  • SetPosition(x, y) postavlja objekat crteža direktno na stranicu koristeći apsolutne koordinate.
  • AddObject(object) dodaje objekat crteža (oblik, grafikon, slika) na određenu stranicu
  • Delete() uklanja određeni objekat iz dokumenta.

Ove metode pripadaju ApiDocument, ApiPage, ApiBaseAnnotation, i ApiDrawing klasama. Mogu se kombinovati sa postojećim Office API metodama koje vam već mogu biti poznate.

Primer 1: Uklanjanje anotacija po ključnoj reči

Naš prvi makro pronalazi i briše sve anotacije koje sadrže određenu ključnu reč. Hajde da prođemo kroz njega korak po korak.

Podešavanje ključne reči i dokumenta

const KEYWORD = "example";
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
let deletedCount = 0;

Prvo definišemo ciljnu ključnu reč — svaka anotacija čiji sadržaj sadrži ovu reč biće uklonjena. Zatim preuzimamo trenutni dokument i dobijamo ukupan broj stranica pomoću GetPagesCount(). Promenljiva deletedCount prati koliko anotacija brišemo.

for (let i = 0; i < pagesCount; i++) {
    const page = doc.GetPage(i);
    const annots = page.GetAllAnnots();

    if (!annots || annots.length === 0) continue;

For petlja prolazi kroz svaku stranicu. Za svaku stranicu koristimo GetPage() da dobijemo ApiPage objekat i GetAllAnnots() da preuzmemo sve anotacije na toj stranici. Ako stranica nema anotacije, preskačemo je i nastavljamo.

Pronalaženje i brisanje anotacija

for (let j = annots.length - 1; j >= 0; j--) {
    const annot = annots[j];
    const contents = (annot.GetContents() || "").toLowerCase();

Unutar svake stranice prolazimo kroz anotacije unazad. Iteriranje unazad je važno jer brisanje elemenata iz niza tokom kretanja unapred može izazvati pomeranje indeksa i preskakanje elemenata. Za svaku anotaciju izdvajamo tekst pomoću GetContents() i pretvaramo ga u mala slova radi poređenja bez obzira na velika i mala slova.

if (contents.includes(KEYWORD.toLowerCase())) {
    annot.Delete();
    deletedCount++;
}

Ako tekst anotacije sadrži ciljnu ključnu reč, pozivamo Delete() da je uklonimo iz dokumenta i povećavamo brojač.

console.log("Deleted annotations containing keyword:", KEYWORD);

console.log("Total deleted:", deletedCount);

Na kraju, makro ispisuje ključnu reč koja je pretraživana i ukupan broj obrisanih anotacija u konzolu.

Kompletan kod makroa:

(function () {
    const KEYWORD = "example";
    const doc = Api.GetDocument();
    const pagesCount = doc.GetPagesCount();
    let deletedCount = 0;

    for (let i = 0; i < pagesCount; i++) {
        const page = doc.GetPage(i);
        const annots = page.GetAllAnnots();

        if (!annots || annots.length === 0) continue;

        for (let j = annots.length - 1; j >= 0; j--) {
            const annot = annots[j];
            const contents = (annot.GetContents() || "").toLowerCase();

            if (contents.includes(KEYWORD.toLowerCase())) {
                annot.Delete();
                deletedCount++;
            }
        }
    }

    console.log("Deleted annotations containing keyword:", KEYWORD);
    console.log("Total deleted:", deletedCount);
})();

Kada se makro pokrene, svaka anotacija koja sadrži zadatu ključnu reč biće uklonjena iz dokumenta. Da biste ciljali drugu reč, samo promenite vrednost KEYWORD promenljive na vrhu koda.

Manipulate PDF Content with the New ONLYOFFICE PDF Editor API

Primer 2: Uklanjanje svih crteža

Ovaj makro prolazi kroz svaku stranicu i briše sve objekte crteža — ili samo određeni tip. Koristi GetAllDrawings() za preuzimanje svih vizuelnih elemenata na svakoj stranici i GetClassType() za proveru njihovog tipa pre brisanja.

Promenljiva targetType na vrhu određuje šta se uklanja. Postavite je na “all” da biste uklonili sve, ili koristite “shape”, “image” ili “chart” za ciljanje određenog tipa crteža.

(function () {
    const doc = Api.GetDocument();
    const pagesCount = doc.GetPagesCount();
    let totalDeleted = 0;

    const targetType = "all";

    for (let i = 0; i < pagesCount; i++) {
        const page = doc.GetPage(i);
        const drawings = page.GetAllDrawings();

        for (let j = 0; j < drawings.length; j++) {
            if (targetType === "all" || drawings[j].GetClassType() === targetType) {
                drawings[j].Delete();
                totalDeleted++;
            }
        }
    }

    console.log("Deleted " + totalDeleted + " drawing(s) from " + pagesCount + " page(s).");
})();

Bilo da pripremate dokument za štampu, uklanjate zastarele dijagrame ili uklanjate slike pre ponovne distribucije — ovaj makro to obavlja. Podešavanjem targetType promenljive možete se prebacivati između potpunog čišćenja i selektivnog bez menjanja ostatka koda.

Manipulate PDF Content with the New ONLYOFFICE PDF Editor API

Example 3: Add a watermark to every page

Naš poslednji makro kreira prilagodljiv oblik vodenog žiga i postavlja ga na svaku stranicu dokumenta. Koristi SetPosition() za postavljanje oblika na tačne koordinate i AddObject() za dodavanje na svaku stranicu.

Sve ključne karakteristike definisane su kao promenljive na vrhu, što olakšava podešavanje teksta vodenog žiga, boja, veličine fonta, pozicije i ugla rotacije.

(function () {
    const doc = Api.GetDocument();
    const pagesCount = doc.GetPagesCount();

    const watermarkText = "DRAFT";
    const bgColor = Api.CreateRGBColor(200, 200, 200);
    const textColor = Api.CreateRGBColor(255, 255, 255);
    const fontSize = 72;
    const positionX = 1200000;
    const positionY = 4000000;
    const rotation = -45;

    for (let i = 0; i < pagesCount; i++) {
        const page = doc.GetPage(i);
        const fill = Api.CreateSolidFill(bgColor);
        const stroke = Api.CreateStroke(0, Api.CreateNoFill());
        const watermark = Api.CreateShape("rect", 160 * 36000, 20 * 36000, fill, stroke);
        watermark.SetPosition(positionX, positionY);
        watermark.SetRotation(rotation);

        const content = watermark.GetContent();
        const para = content.GetElement(0);
        para.SetJc("center");
        const run = para.AddText(watermarkText);
        run.SetFontSize(fontSize);
        run.SetBold(true);
        run.SetFill(Api.CreateSolidFill(textColor));

        page.AddObject(watermark);
    }
})();

Vodeni žig se pravi od standardnog oblika sa tekstualnim sadržajem, što vam daje potpunu kontrolu nad njegovim izgledom — od suptilnih oznaka u pozadini do upadljivih oznaka preko cele stranice. Možete eksperimentisati sa različitim veličinama oblika, stilovima fonta ili uglovima rotacije kako biste dobili izgled koji vam najviše odgovara.

Manipulate PDF Content with the New ONLYOFFICE PDF Editor API

Ova tri makroa su samo početak — novi PDF API otvara mnogo više mogućnosti za automatizaciju vaših PDF tokova rada. Možete kombinovati ove metode kako biste kreirali naprednije makroe prilagođene vašim potrebama. Istražite API dokumentaciju i primere makroa navedene ispod za više ideja. Ako imate pitanja ili želite da podelite šta ste napravili, slobodno nam se obratite!

Create your free ONLYOFFICE account

View, edit and collaborate on docs, sheets, slides, forms, and PDF files online.