Konwersja RTF

Dziś troszeczkę pobawimy się Officem, a konkretnie Word’em i konwersją dokumentów. Zanim przejdę dalej przedstawię sedno problemu. Mianowicie, wielu użytkowników nie zdaje sobie sprawy, iż zwykły dokument naszpikowany grafiką o wysokiej rozdzielczości, zapisany w formacie rtf, potrafi osiągać wręcz gigantyczne rozmiary. W przypadku pojedynczych plików nie jest to jeszcze duży problem, ale gdy stanowi on szablon dokumentu i co gorsza jest powielony kilkaset razy, to sytuacji zaczyna wyglądać zupełnie inaczej. Kwestia przerobienia szablonu nie jest zbyt trudnym zadaniem dla użytkownika, ale wymaganie poprawy dokumentów, na przykład z kilku letniej pracy, może już być czasochłonne i uciążliwe.

Jednakże rozwiązanie problemu nie jest, aż tak bardzo trudne jakby się mogło wydawać. Mianowicie, wystarczy dokonać konwersji pliku rtf, do formatu doc lub docx, a rozmiar pliku zostanie automatycznie ograniczony.

Jak wiadomo PowerShell idealnie nadaje się do wykonywania powtarzalnej pracy. Dodatkowo, prócz w/w narzędzia konieczne będzie posłużenie się pakietem Office, który to dzięki udostępnieniu swojego API, pozwala na skryptowe wykonywanie praktycznie dowolnej operacji jaką możemy w normalny sposób wyklikać. Dlatego w takiej sytuacji można problem uznać praktycznie za rozwiązany.

W pierwszej kolejności musimy utworzyć nową instancję Worda z poziomu konsoli Windows PowerShell:

$Word = New-Object -ComObject Word.Application 

Dodatkowo, aby lepiej to zobrazować, włączmy widoczność okna aplikacji.

$Word.Visible = $True 

Następnie konieczne jest przygotowanie kilku podstawowych danych. Mianowicie, ścieżki do katalogu z plikami, oraz dla urozmaicenia kodu, źródłowego jak i docelowego rozszerzenia w jakim chcemy zapisać dokumenty.

$OldFormat = ".rtf"
$NewFormat = ".doc"
$Files = Get-ChildItem C:\Documents -Filter "*$OldFormat" –Recurse

Możemy również zaimplementować drobną funkcjonalność pozwalającą na łatwe modyfikowanie wynikowego formatu, poprzez zastosowanie klauzuli switch, z przykładowymi formatami w jakich można zapisywać dokumenty Worda.

switch($NewFormat)
{
  ".doc" {$Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatDocument}
  ".docx" {$Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatXMLDocument}
  ".rtf" {$Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatRTF}
}

Kluczowym elementem skryptu, będzie wykorzystanie pętli, na przykład foreach, zasilonej listą znalezionych plików. W ramach niej, w pierwszej kolejności tworzymy nową nazwę pliku poprzez zastąpienie rozszerzenia źródłowego, nowy formatem.

$NewFileName = $File.FullName -replace $OldFormat, $NewFormat 

Następnie otwieramy dokument rtf przy pomocy obiektu Worda. W tym celu wystarczy wskazać ścieżkę do jego pliku.

$Doc = $Word.Documents.Open($File.FullName) 

Zapisujemy go do nowego formatu poprzez wskazanie ścieżki ze zmodyfikowanym rozszerzeniem oraz zdefiniowaniem nowego formatu.

$Doc.SaveAs([ref]$NewFileName, [ref] $Format) 

Ostatecznie zamykamy plik. Opcjonalnie w tym momencie możemy również dołożyć polecenie do usunięcia starego pliku rtf.

$Doc.Close()

Wszystkie cztery kroki muszą być powtarzane w ramach pętli dla każdego pliku z osobna.

Na zakończenie wystarczy zamknąć obiekt aplikacji, w celu zwolnienia pamięci.

$Word.Quit()

Cały kod wygląda następująco:

$Word = New-Object -COMObject Word.Application
$Word.Visible = $True

$OldFormat = ".rtf"
$NewFormat = ".doc"
$Files = Get-ChildItem C:\Documents -Filter "*$OldFormat" -Recurse

switch($NewFormat)
{
	".doc" {$Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatDocument}
	".docx" {$Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatXMLDocument}
	".rtf" {$Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatRTF}
}

foreach ($File in $Files)
{
    $NewFileName = $File.FullName -replace $OldFormat, $NewFormat
    $Doc = $Word.Documents.Open($File.FullName)
    $Doc.SaveAs([ref]$NewFileName, [ref]$Format)
    $Doc.Close()
}

$Word.Quit() 

Przedstawiony problem dotyczy głównie konwersji plików .rtf, jednakże sam kod jest na tyle uniwersalny, dlatego pozwala również na konwersje innych formatów obsługiwanych przez omawianą aplikację.

Źródła:
http://msdn.microsoft.com/en-us/library/office/ff838565.aspx
http://msdn.microsoft.com/en-us/library/Microsoft.Office.Interop.Word.Documents(v=office.11).aspx
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.wdsaveformat.aspx

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s