Come analizzare i moduli PDF con una macro ONLYOFFICE

30 aprile 2025Da Alice

Nel frenetico ambiente digitale di oggi, scrittori, redattori e creatori di contenuti spesso lottano per acquisire informazioni significative sui loro documenti. La comprensione di parametri come la leggibilità, la frequenza delle parole e l’equilibrio strutturale può migliorare significativamente la qualità dei documenti, ma l’analisi manuale richiede molto tempo e non è coerente. In questo post ti mostreremo come creare una potente macro ONLYOFFICE che analizza automaticamente i tuoi documenti e genera report completi.

How to analyze PDF form documents with ONLYOFFICE macro

Costruire la macro di analisi dei documenti

Scomponiamo la macro in componenti funzionali e spieghiamo il funzionamento di ciascuna parte.

Impostazione della funzione principale

Il cuore della nostra macro è la funzione analyzeDocument(), che orchestra l’intero processo di analisi:

function analyzeDocument() {
    try {
        // Get document and all text
        var oDocument = Api.GetDocument();
        var allText = "";
        var paragraphs = oDocument.GetAllParagraphs();
        
        // Check if document is empty
        if (paragraphs.length === 0) {
            console.log("Warning: Document is empty or no paragraphs found for analysis.");
            return;
        }
        
        // Collect all text
        paragraphs.forEach(function(paragraph) {
            allText += paragraph.GetText() + " ";
        });
        
        // Perform analyses
        var stats = calculateBasicStats(allText, paragraphs);
        var advancedStats = calculateAdvancedStats(allText, stats);
        var commonWords = findCommonWords(allText, 10);
        
        // Create report
        createAndAddReport(oDocument, stats, advancedStats, commonWords);
        
        // Log success
        console.log("Success: Document analysis completed. Report added to the end of the document.");
    } catch (error) {
        console.log("Error: " + error.message);
    }
}

Questa funzione raccoglie prima tutto il testo dal documento, poi lo passa a funzioni di analisi specializzate e infine crea un report. Il blocco try-catch assicura che la macro gestisca con precisione eventuali errori.

Calcolo delle statistiche di base

La funzione calculateBasicStats() elabora il testo per estrarre le metriche fondamentali:

function calculateBasicStats(text, paragraphs) {
    // Word count
    var words = text.split(/\s+/).filter(function(word) { 
        return word.length > 0; 
    });
    var wordCount = words.length;
    
    // Sentence count
    var sentences = text.split(/[.!?]+/).filter(function(sentence) { 
        return sentence.trim().length > 0; 
    });
    var sentenceCount = sentences.length;
    
    // Paragraph count
    var paragraphCount = paragraphs.length;
    
    // Character count
    var charCountWithSpaces = text.length;
    var charCountWithoutSpaces = text.replace(/\s+/g, "").length;
    
    // Line count (approximate)
    var lineCount = Math.ceil(charCountWithSpaces / 70);
    
    return {
        wordCount: wordCount,
        sentenceCount: sentenceCount,
        paragraphCount: paragraphCount,
        charCountWithSpaces: charCountWithSpaces,
        charCountWithoutSpaces: charCountWithoutSpaces,
        lineCount: lineCount,
        words: words,
        sentences: sentences
    };
}

Questa funzione divide il testo in parole e frasi, conta i paragrafi e calcola il numero di caratteri e di righe.

Esecuzione di analisi avanzate

Per ottenere informazioni più approfondite, la funzione calculateAdvancedStats() calcola metriche più sofisticate:

function calculateAdvancedStats(text, basicStats) {
    // Average sentence length
    var avgWordsPerSentence = basicStats.wordCount / Math.max(1, basicStats.sentenceCount);
    
    // Average paragraph length
    var avgWordsPerParagraph = basicStats.wordCount / Math.max(1, basicStats.paragraphCount);
    
    // Average word length
    var totalWordLength = basicStats.words.reduce(function(sum, word) {
        return sum + word.length;
    }, 0);
    var avgWordLength = totalWordLength / Math.max(1, basicStats.wordCount);
    
    // Readability score (simplified Flesch-Kincaid)
    var readabilityScore = 206.835 - 1.015 * avgWordsPerSentence - 84.6 * (totalWordLength / basicStats.wordCount);
    
    // Estimated reading time
    var readingTimeMinutes = Math.ceil(basicStats.wordCount / 200);
    
    return {
        avgWordsPerSentence: avgWordsPerSentence,
        avgWordsPerParagraph: avgWordsPerParagraph,
        avgWordLength: avgWordLength,
        readabilityScore: readabilityScore,
        readingTimeMinutes: readingTimeMinutes
    };
}

Calcola la lunghezza media di frasi e paragrafi, i punteggi di leggibilità e il tempo di lettura stimato.

Analisi della frequenza delle parole

La funzione findCommonWords() identifica le parole usate più frequentemente:

function findCommonWords(text, limit) {
    // Clean text and convert to lowercase
    var cleanText = text.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, "");
    
    // Split into words
    var words = cleanText.split(/\s+/).filter(function(word) { 
        return word.length > 3; 
    });
    
    // Calculate word frequencies
    var wordFrequency = {};
    words.forEach(function(word) {
        wordFrequency[word] = (wordFrequency[word] || 0) + 1;
    });
    
    // Filter stop words
    var stopWords = ["this", "that", "with", "from", "have", "been"];
    stopWords.forEach(function(stopWord) {
        delete wordFrequency[stopWord];
    });
    
    // Sort by frequency
    var sortedWords = Object.keys(wordFrequency).sort(function(a, b) {
        return wordFrequency[b] - wordFrequency[a];
    });
    
    // Return top N words
    return sortedWords.slice(0, limit).map(function(word) {
        return { word: word, frequency: wordFrequency[word] };
    });
}
function findCommonWords(text, limit) {
    // Clean text and convert to lowercase
    var cleanText = text.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, "");
    
    // Split into words
    var words = cleanText.split(/\s+/).filter(function(word) { 
        return word.length > 3; 
    });
    
    // Calculate word frequencies
    var wordFrequency = {};
    words.forEach(function(word) {
        wordFrequency[word] = (wordFrequency[word] || 0) + 1;
    });
    
    // Filter stop words
    var stopWords = ["this", "that", "with", "from", "have", "been"];
    stopWords.forEach(function(stopWord) {
        delete wordFrequency[stopWord];
    });
    
    // Sort by frequency
    var sortedWords = Object.keys(wordFrequency).sort(function(a, b) {
        return wordFrequency[b] - wordFrequency[a];
    });
    
    // Return top N words
    return sortedWords.slice(0, limit).map(function(word) {
        return { word: word, frequency: wordFrequency[word] };
    });
}

Questa funzione rimuove la punteggiatura, filtra le parole riempitive più comuni e restituisce le parole più frequentemente utilizzate nel documento.

Generazione del report

Infine, la funzione createAndAddReport() compila e formatta tutti i risultati dell’analisi:

function createAndAddReport(oDocument, basicStats, advancedStats, commonWords) {
    // Add new page
    var oParagraph = Api.CreateParagraph();
    oParagraph.AddPageBreak();
    oDocument.AddElement(oDocument.GetElementsCount(), oParagraph);
    
    // Add title
    var oHeading = Api.CreateParagraph();
    oHeading.AddText("DOCUMENT ANALYSIS REPORT");
    oDocument.AddElement(oDocument.GetElementsCount(), oHeading);
    
    // Add basic statistics section
    var oSubHeading = Api.CreateParagraph();
    oSubHeading.AddText("BASIC STATISTICS");
    oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);
    
    // Add statistics content
    // ... (code that adds individual statistics)
    
    // Add advanced analysis section
    // ... (code that adds advanced metrics)
    
    // Add word frequency section
    // ... (code that adds word frequency list)
    
    // Add footer
    var oFootnotePara = Api.CreateParagraph();
    oFootnotePara.AddText("This report was generated by OnlyOffice Document Statistics and Analysis Tool on " + 
                        new Date().toLocaleString() + ".");
    oDocument.AddElement(oDocument.GetElementsCount(), oFootnotePara);
}

Questa funzione crea un report strutturato alla fine del documento con tutti i risultati dell’analisi.

How to analyze PDF form documents with ONLYOFFICE macro

Codice completo della macro

Ecco il codice completo della macro che puoi copiare e utilizzare:

(function() {
    // Main function - starts all operations
    function analyzeDocument() {
        try {
            // Get document and all text
            var oDocument = Api.GetDocument();
            var allText = "";
            var paragraphs = oDocument.GetAllParagraphs();
            
            // Check if document is empty
            if (paragraphs.length === 0) {
                console.log("Warning: Document is empty or no paragraphs found for analysis.");
                return;
            }
            
            // Collect all text
            paragraphs.forEach(function(paragraph) {
                allText += paragraph.GetText() + " ";
            });
            
            // Calculate basic statistics
            var stats = calculateBasicStats(allText, paragraphs);
            
            // Perform advanced analysis
            var advancedStats = calculateAdvancedStats(allText, stats);
            
            // Find most common words
            var commonWords = findCommonWords(allText, 10);
            
            // Create and add report to the document
            createAndAddReport(oDocument, stats, advancedStats, commonWords);
            
            // Inform user
            console.log("Success: Document analysis completed. Report added to the end of the document.");
        } catch (error) {
           console.log("Error: An error occurred during processing: " +         error.message);
        }
    }
    
    // Calculate basic statistics
    function calculateBasicStats(text, paragraphs) {
        // Word count
        var words = text.split(/\s+/).filter(function(word) { 
            return word.length > 0; 
        });
        var wordCount = words.length;
        
        // Sentence count
        var sentences = text.split(/[.!?]+/).filter(function(sentence) { 
            return sentence.trim().length > 0; 
        });
 var sentenceCount = sentences.length;
        
        // Paragraph count
        var paragraphCount = paragraphs.length;
        
        // Character count (with and without spaces)
        var charCountWithSpaces = text.length;
        var charCountWithoutSpaces = text.replace(/\s+/g, "").length;
        
        // Line count (approximate)
        var lineCount = Math.ceil(charCountWithSpaces / 70); // Approximately 70 characters/line
   return {
            wordCount: wordCount,
            sentenceCount: sentenceCount,
            paragraphCount: paragraphCount,
            charCountWithSpaces: charCountWithSpaces,
            charCountWithoutSpaces: charCountWithoutSpaces,
            lineCount: lineCount,
            words: words,
            sentences: sentences
        };
    }
    
    // Calculate advanced statistics
    function calculateAdvancedStats(text, basicStats) {
        // Average sentence length (in words)
        var avgWordsPerSentence = basicStats.wordCount / Math.max(1, basicStats.sentenceCount);
        
        // Average paragraph length (in words)
        var avgWordsPerParagraph = basicStats.wordCount / Math.max(1, basicStats.paragraphCount);
        
        // Average word length (in characters)
        var totalWordLength = basicStats.words.reduce(function(sum, word) {
            return sum + word.length;
        }, 0);
        var avgWordLength = totalWordLength / Math.max(1, basicStats.wordCount);
        
        // Readability score (simplified Flesch-Kincaid)
        var readabilityScore = 206.835 - 1.015 * (basicStats.wordCount / Math.max(1, basicStats.sentenceCount)) - 84.6 * (totalWordLength / Math.max(1, basicStats.wordCount));
        
        // Estimated reading time (minutes)
        var readingTimeMinutes = Math.ceil(basicStats.wordCount / 200); // Average reading speed 200 words/minute
        
        return {
            avgWordsPerSentence: avgWordsPerSentence,
            avgWordsPerParagraph: avgWordsPerParagraph,
            avgWordLength: avgWordLength,
            readabilityScore: readabilityScore,
            readingTimeMinutes: readingTimeMinutes
        };
    }
    
    // Find most common words
    function findCommonWords(text, limit) {
        // Clean text and convert to lowercase
        var cleanText = text.toLowerCase().replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, "");
        
   // Split into words
        var words = cleanText.split(/\s+/).filter(function(word) { 
            return word.length > 3; // Filter out very short words
        });
   // Calculate word frequencies
        var wordFrequency = {};
        words.forEach(function(word) {
            if (wordFrequency[word]) {
                wordFrequency[word]++;
            } else {
                wordFrequency[word] = 1;
            }
        });

   // Filter stop words (common English words)
        var stopWords = ["this", "that", "these", "those", "with", "from", "have", "been", "were", "they", "their", "what", "when", "where", "which", "there", "will", "would", "could", "should", "about", "also"];
        stopWords.forEach(function(stopWord) {
            if (wordFrequency[stopWord]) {
                delete wordFrequency[stopWord];
            }
        });
        
        // Sort by frequency
        var sortedWords = Object.keys(wordFrequency).sort(function(a, b) {
            return wordFrequency[b] - wordFrequency[a];
        });
        
        // Take top N words
        var topWords = sortedWords.slice(0, limit);
        
        // Return results as word-frequency pairs
        return topWords.map(function(word) {
            return {
                word: word,
                frequency: wordFrequency[word]
            };
        });
    }
   
    // Create and add report to document
    function createAndAddReport(oDocument, basicStats, advancedStats, commonWords) {
        // Add new page
        var oParagraph = Api.CreateParagraph();
        oParagraph.AddPageBreak();
        oDocument.AddElement(oDocument.GetElementsCount(), oParagraph);
        
        // Main title - highlighting in capital letters
        var oHeading = Api.CreateParagraph();
        oHeading.AddText("DOCUMENT ANALYSIS REPORT");
        oDocument.AddElement(oDocument.GetElementsCount(), oHeading);
        
        // Subheading - in capital letters
        var oSubHeading = Api.CreateParagraph();
        oSubHeading.AddText("BASIC STATISTICS");
        oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);

        // Add basic statistics
        var oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Word Count: " + basicStats.wordCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Sentence Count: " + basicStats.sentenceCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Paragraph Count: " +      basicStats.paragraphCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Character Count (with spaces): " +  basicStats.charCountWithSpaces);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Character Count (without spaces): " +  basicStats.charCountWithoutSpaces);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        

        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Estimated Line Count: " + basicStats.lineCount);
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        // Advanced analysis title
        oSubHeading = Api.CreateParagraph();
        oSubHeading.AddText("ADVANCED ANALYSIS");
        oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);
        
        // Add advanced analysis results
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Average Sentence Length: " + advancedStats.avgWordsPerSentence.toFixed(2) + " words");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Average Paragraph Length: " + advancedStats.avgWordsPerParagraph.toFixed(2) + " words");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Average Word Length: " + advancedStats.avgWordLength.toFixed(2) + " characters");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Readability Score: " + advancedStats.readabilityScore.toFixed(2));
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        oStatsPara = Api.CreateParagraph();
        oStatsPara.AddText("• Estimated Reading Time: " + advancedStats.readingTimeMinutes + " minutes");
        oDocument.AddElement(oDocument.GetElementsCount(), oStatsPara);
        
        // Common words title
        oSubHeading = Api.CreateParagraph();
        oSubHeading.AddText("MOST FREQUENTLY USED WORDS");
        oDocument.AddElement(oDocument.GetElementsCount(), oSubHeading);
        
        // We'll create a simple list instead of a table
        if (commonWords.length > 0) {
            for (var i = 0; i < commonWords.length; i++) {
                var oWordPara = Api.CreateParagraph();
                oWordPara.AddText((i + 1) + ". " + commonWords[i].word + " (" + commonWords[i].frequency + " times)");
                oDocument.AddElement(oDocument.GetElementsCount(), oWordPara);
            }
        } else {
            var oNoneFoundPara = Api.CreateParagraph();
            oNoneFoundPara.AddText("No frequently used words found.");
            oDocument.AddElement(oDocument.GetElementsCount(), oNoneFoundPara);
        }
        
        // Footer note
        var oFootnotePara = Api.CreateParagraph();
        oFootnotePara.AddText("This report was generated by OnlyOffice Document Statistics and Analysis Tool on " + 
                            new Date().toLocaleString() + ".");
        oDocument.AddElement(oDocument.GetElementsCount(), oFootnotePara);
    }
    
    // Run the macro
    analyzeDocument();
})();

     

Per usare questa macro in ONLYOFFICE

  1. Apri il documento in ONLYOFFICE
  2. Passa alla scheda Visualizza e seleziona Macro
  3. Crea una nuova macro e incolla il codice
  4. Esegui la macro
  5. Alla fine del documento verrà aggiunto un rapporto di analisi dettagliato.

Ora eseguiamo la macro e vediamo come funziona!

Questa macro è uno strumento prezioso per i professionisti che desiderano automatizzare i processi di analisi del testo e di documentazione in un moderno ambiente d’ufficio. Ci auguriamo che sia un’utile aggiunta al tuo kit di strumenti di lavoro.

Ti invitiamo a esplorare la documentazione dell’API di ONLYOFFICE per creare le tue macro personalizzate o per migliorare questa macro. Se hai idee di miglioramento o suggerimenti per nuove macro, non esitare a contattarci. Il tuo feedback ci aiuta a continuare a sviluppare strumenti che rendono più efficiente la creazione e la modifica dei documenti.

Sull’autore

How to analyze PDF form documents with ONLYOFFICE macro

Crea il tuo account ONLYOFFICE gratuito

Visualizza, modifica e collabora su documenti, fogli, diapositive, moduli e file PDF online.