Beispiel #1
0
        // update all fields in a range
        private static void updateFieldsInRange(Range range, Microsoft.Office.Interop.Word.Application word, String filename)
        {
            var rangeFields = range.Fields;

            if (rangeFields.Count > 0)
            {
                for (var i = 1; i <= rangeFields.Count; i++)
                {
                    var field = rangeFields[i];
                    WordConverter.updateField(field, word, filename);
                    Converter.releaseCOMObject(field);
                }
            }
            Converter.releaseCOMObject(rangeFields);
        }
Beispiel #2
0
        private static void updateDocumentFields(Document doc, Microsoft.Office.Interop.Word.Application word, String inputFile, Hashtable options)
        {
            // Update fields quickly if it is safe to do so. We have
            // to check for broken links as they may raise Word dialogs
            if ((Boolean)options["word_field_quick_update"] ||
                ((Boolean)options["word_field_quick_update_safe"] && !hasBrokenLinks(doc)))
            {
                var fields = doc.Fields;
                fields.Update();
                Converter.releaseCOMObject(fields);
                return;
            }

            try
            {
                // Update some of the field types in the document so the printed
                // PDF looks correct. Skips some field types (such as ASK) that would
                // create dialogs
                foreach (Microsoft.Office.Interop.Word.Section section in doc.Sections)
                {
                    var sectionRange  = section.Range;
                    var sectionFields = sectionRange.Fields;
                    var zeroHeader    = true;
                    var zeroFooter    = true;

                    foreach (Field sectionField in sectionFields)
                    {
                        WordConverter.updateField(sectionField, word, inputFile);
                    }

                    var sectionPageSetup = section.PageSetup;
                    var headers          = section.Headers;
                    foreach (Microsoft.Office.Interop.Word.HeaderFooter header in headers)
                    {
                        if (header.Exists)
                        {
                            var range       = header.Range;
                            var rangeFields = range.Fields;
                            foreach (Field rangeField in rangeFields)
                            {
                                WordConverter.updateField(rangeField, word, inputFile);
                            }
                            // Simply querying the range of the header will create it.
                            // If the header is empty, this can introduce additional space
                            // between the non-existant header and the top of the page.
                            // To counter this for empty headers, we manually set the header
                            // distance to zero here
                            var shapes      = header.Shapes;
                            var rangeShapes = range.ShapeRange;
                            if ((shapes.Count > 0) || !String.IsNullOrWhiteSpace(range.Text) || (rangeShapes.Count > 0))
                            {
                                zeroHeader = false;
                            }
                            Converter.releaseCOMObject(shapes);
                            Converter.releaseCOMObject(rangeShapes);
                            Converter.releaseCOMObject(rangeFields);
                            Converter.releaseCOMObject(range);
                        }
                    }

                    var footers = section.Footers;
                    foreach (Microsoft.Office.Interop.Word.HeaderFooter footer in footers)
                    {
                        if (footer.Exists)
                        {
                            var range       = footer.Range;
                            var rangeFields = range.Fields;
                            foreach (Field rangeField in rangeFields)
                            {
                                WordConverter.updateField(rangeField, word, inputFile);
                            }
                            // Simply querying the range of the footer will create it.
                            // If the footer is empty, this can introduce additional space
                            // between the non-existant footer and the bottom of the page.
                            // To counter this for empty footers, we manually set the footer
                            // distance to zero here
                            var shapes      = footer.Shapes;
                            var rangeShapes = range.ShapeRange;
                            if (shapes.Count > 0 || !String.IsNullOrWhiteSpace(range.Text) || rangeShapes.Count > 0)
                            {
                                zeroFooter = false;
                            }
                            Converter.releaseCOMObject(shapes);
                            Converter.releaseCOMObject(rangeShapes);
                            Converter.releaseCOMObject(rangeFields);
                            Converter.releaseCOMObject(range);
                        }
                    }
                    if (doc.ProtectionType == WdProtectionType.wdNoProtection)
                    {
                        if (zeroHeader)
                        {
                            sectionPageSetup.HeaderDistance = 0;
                        }
                        if (zeroFooter)
                        {
                            sectionPageSetup.FooterDistance = 0;
                        }
                    }
                    Converter.releaseCOMObject(sectionFields);
                    Converter.releaseCOMObject(sectionRange);
                    Converter.releaseCOMObject(headers);
                    Converter.releaseCOMObject(footers);
                    Converter.releaseCOMObject(sectionPageSetup);
                }
            }
            catch (COMException)
            {
                // There can be odd errors when column widths are out of the page boundaries
                // See github issue #14
            }
            var docFields = doc.Fields;

            foreach (Field docField in docFields)
            {
                WordConverter.updateField(docField, word, inputFile);
            }
            var storyRanges = doc.StoryRanges;

            foreach (Range range in storyRanges)
            {
                var rangeFields = range.Fields;
                foreach (Field field in rangeFields)
                {
                    WordConverter.updateField(field, word, inputFile);
                }
                Converter.releaseCOMObject(rangeFields);
            }
            Converter.releaseCOMObject(storyRanges);
            Converter.releaseCOMObject(docFields);
        }
Beispiel #3
0
        // Update all the fields in a document
        private static void updateDocumentFields(Microsoft.Office.Interop.Word.Document doc, Microsoft.Office.Interop.Word.Application word, String inputFile, Hashtable options)
        {
            // Update fields quickly if it is safe to do so. We have
            // to check for broken links as they may raise Word dialogs or leave broken content
            if ((Boolean)options["word_field_quick_update"] ||
                ((Boolean)options["word_field_quick_update_safe"] && !hasBrokenLinks(doc)))
            {
                var fields = doc.Fields;
                fields.Update();
                Converter.releaseCOMObject(fields);
                return;
            }

            try
            {
                // Update some of the field types in the document so the printed
                // PDF looks correct. Skips some field types (such as ASK) that would
                // create dialogs
                var docSections = doc.Sections;
                if (docSections.Count > 0)
                {
                    for (var dsi = 1; dsi <= docSections.Count; dsi++)
                    {
                        var section       = docSections[dsi];
                        var sectionRange  = section.Range;
                        var sectionFields = sectionRange.Fields;
                        var headers       = section.Headers;
                        var footers       = section.Footers;

                        if (sectionFields.Count > 0)
                        {
                            for (var si = 1; si <= sectionFields.Count; si++)
                            {
                                var sectionField = sectionFields[si];
                                WordConverter.updateField(sectionField, word, inputFile);
                                Converter.releaseCOMObject(sectionField);
                            }
                        }

                        updateHeaderFooterFields(headers, word, inputFile);
                        updateHeaderFooterFields(footers, word, inputFile);

                        Converter.releaseCOMObject(footers);
                        Converter.releaseCOMObject(headers);
                        Converter.releaseCOMObject(sectionFields);
                        Converter.releaseCOMObject(sectionRange);
                        Converter.releaseCOMObject(section);
                    }
                }
                Converter.releaseCOMObject(docSections);
            }
            catch (COMException)
            {
                // There can be odd errors when column widths are out of the page boundaries
                // See github issue #14
            }

            var docFields   = doc.Fields;
            var storyRanges = doc.StoryRanges;

            if (docFields.Count > 0)
            {
                for (var fi = 1; fi <= docFields.Count; fi++)
                {
                    var docField = docFields[fi];
                    WordConverter.updateField(docField, word, inputFile);
                    Converter.releaseCOMObject(docField);
                }
            }

            foreach (Range range in storyRanges)
            {
                updateFieldsInRange(range, word, inputFile);
                Converter.releaseCOMObject(range);
            }

            Converter.releaseCOMObject(storyRanges);
            Converter.releaseCOMObject(docFields);
        }