// 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); }
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); }
// 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); }