1

I have slightly modified this PowerShell script for my work with DOCX files but would like to edit the DOCX file in place.

After running the script, the terminal displays the error message: "You cannot call a method on a null-value expression" in reference to line 43, $document.Save().

I am not sure the reason for the error as the path to $document is already defined earlier in the script. What am I missing?

Here is the whole script:

    Param ([string]$path = $(throw "-path is required."))

    Import-Module "C:\scripts\PSGenericMethods.psm1"
    [System.Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll") | out-null

    [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml") | out-null
    [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Packaging") | out-null
    [Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Wordprocessing") | out-null
    [Reflection.Assembly]::LoadWithPartialName("OpenXmlPowerTools") | out-null

    [DocumentFormat.OpenXml.Packaging.WordprocessingDocument]$document = $null
    $document = [DocumentFormat.OpenXml.Packaging.WordprocessingDocument]::Open($path, $true)

    [DocumentFormat.OpenXml.Packaging.MainDocumentPart]$MainDocumentPart = $document.MainDocumentPart

    [DocumentFormat.OpenXml.Wordprocessing.Document]$InnerDocument = $document.Document

    [DocumentFormat.OpenXml.Wordprocessing.Body]$Body = $document.Body

    [DocumentFormat.OpenXml.Wordprocessing.Paragraph]$paragraph = $document.Paragraph

    [DocumentFormat.OpenXml.Wordprocessing.ParagraphMarkRunProperties]$ParagraphMarkRunProperties = $document.ParagraphMarkRunProperties

    [DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties]$ParagraphProperties = $document.ParagraphProperties

    [DocumentFormat.OpenXml.Wordprocessing.ParagraphStyleId]$ParagraphStyleId = $document.ParagraphStyleId

    [DocumentFormat.OpenXml.Wordprocessing.Run]$run = $document.Run

    $paragraphs = Invoke-GenericMethod -InputObject $MainDocumentPart.Document -MethodName Descendants -GenericType DocumentFormat.OpenXml.Wordprocessing.Paragraph

    $runs = Invoke-GenericMethod -InputObject $MainDocumentPart.Document -MethodName Descendants -GenericType DocumentFormat.OpenXml.Wordprocessing.Run

    foreach ($run in $runs) { 
     if ($run.RunProperties.Languages.Val) {

    <#[String]$value = $run.InnerText#>
    [String]$language = $run.RunProperties.Languages.Val

    '{{$span xml:lang="{0}"$}}{1}{{$/span}}$' -f $language, $run.InnerText
    }
    }
    $document.close()

Update: After modifying the script, I now no longer have the problem with "You cannot call a method on a null value expression" error. The problem is that I am not sure how to save results to the file.

This may be a duplicate of this thread.

Can anyone suggest a method for saving the changes to the file?

1 Answers1

1

Variable names in PowerShell are NOT case-sensitive. You destroy your "document" with this line I think:

[DocumentFormat.OpenXml.Wordprocessing.Document]$Document = $document.Document

Because $Document is the same variable as $document.

stackprotector
  • 10,498
  • 4
  • 35
  • 64
  • most likely this is correct, if not, just add a breakpoint in `[DocumentFormat.OpenXml.Packaging.WordprocessingDocument]$document = $null` and follow the value of document from then on. – Roque Sosa Apr 06 '20 at 15:26
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/211084/discussion-between-joseph-polizzotto-and-thomas). – Joseph Polizzotto Apr 06 '20 at 16:08