How to automate inserting images into RTF files using Powershell?

693 views Asked by At

I already have a script that does this except it uses MS Word with DOCX files. However I've been asked to make it work without having to have MS Office installed and so I've been playing with WordPad and RTF files.

I've seen that images pasted into RTF documents get converted to some type of HEX in the RTF code.

Is there some way to automate that image to RTF HEX string conversion? Because then I could just send that string to the RTF file contents.

TIA

Example RTF code with only picture inserted:

{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang3081{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.17763}\viewkind4\uc1 
\pard\sa200\sl240\slmult1\f0\fs22\lang9{\pict{\*\picprop}\wmetafile8\picw1429\pich582\picwgoal810\pichgoal330 
0100090000034c07000000002d07000000000400000003010800050000000c02eaff3600050000
000b0200000000050000000701040000002d070000410b2000cc001600360000000000eaff3600
000000002800000036000000160000000100180000000000180e00000000000000000000000000
0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffff0000ffffffffffffffffffffffffffffffb6ffff003a90000000660000ffffb6ffffff
ffffffffffffffffff66b6db0000000000000000000000000000000000000000003a0000ffdb90
ffffff90b6db3a3a660000000000000000003a3a00b69066ffffdbffffffffffffffffffffffff
ffffffb6ffff003a90000000660000ffffb6ffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffb6ffff00006600000066
0000ffffb6ffffffffffffffffffffffff3a90db00000000000000000000000000000000000000
00003a0000ffdb9066b6ff000000000000000000000000000000000000000000660000ffdbb6ff
ffffffffffffffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffb6ff
ff000066000000660000ffffb6ffffffffffffffffffffffff3a90db000000000000db903affff
ffffffffffffffffffffffffffffffff66b6ff3a3a00b69066ffffdbffffffffffff66b6db0000
00000000903a00ffffdbffffffffffffffffffb6ffff000066000000660000ffffb6ffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff
ffffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffffffff3a90db000000
000000db903affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffff0066b60000003a0000ffdb90ffffffffffffffffffb6ffff000066000000660000
ffffb6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff
ffffffffffffffffffffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffff
ffff3a90db000000000000db903affffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffff0066b6000000000000ffb666ffffffffffffffffffb6ffff00
0066000000660000ffffb6ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffff0000ffffffffffffffffffffffffffffffb6ffff000066000000660000ffffb6ffff
ffffffffffffffffffff3a90db000000000000db903affffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffff66b6db0000000000003a0000ffdb90ffffffffff
ffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffb6ffff000066000000
660000ffffb6ffffffffffffffffffffffff3a90db000000000000db903affffffffffffffffff
ffffffffffffffffffffffffffffffffffffdbffff66b6db003a3a000000000000000000903a00
ffffdbffffffffffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffb6
ffff000066000000660000ffffb6ffffffffffffffffffffffff3a90db00000000000000000000
0000000000000000000000ffb666ffffffffffffffffff66b6db00003a00000000000000000000
0000663a00ffffb6ffffffffffffffffffffffffb6ffff000066000000660000ffffb6ffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff
ffffffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffffffff3a90db0000
00000000000000000000000000000000000000ffb666ffffffffffff66b6ff0000000000000000
000000003a0000b69066ffffdbffffffffffffffffffffffffffffffb6ffff0000660000006600
00ffffb6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
ffffffffffffffffffffffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffff
ffffff3a90db000000000000db903affffffffffffffffffffffffffffffffffffdbffff003a90
000000000000663a00dbb690ffffffffffffffffffffffffffffffffffffffffffffffffb6ffff
000066000000660000ffffb6ffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffff0000ffffffffffffffffffffffffffffffb6ffff000066000000660000ffffb6ff
ffffffffffffffffffffff3a90db000000000000db903affffffffffffffffffffffffffffffff
ffffb6ffff000066000000660000ffffb6ffffffffffffffffffffffffffffffffffffffffffff
ffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffb6ffff0000660000
00660000ffffb6ffffffffffffffffffffffff3a90db000000000000db903affffffffffffffff
ffffffffffffffffffffb6ffff000066000000903a00ffffdbffffffffffffffffffffffffffff
ffffffffffffffffffffffffffb6ffff000066000000660000ffffb6ffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff
b6ffff000066000000660000ffffb6ffffffffffffffffffffffff3a90db000000000000db903a
ffffffffffffffffffffffffffffffffffffffffff0066b6000000000000db9066ffffffffffff
b6dbdb003a66db903affffffffffffffffffffffffb6ffff000066000000660000ffffb6ffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff00
0066000000000000000000000000000000000000000000000000000000660000ffffb63a90db00
00000000000000000000000000000000000000003a0000ffdb90ffffff90dbff00003a00000000
0000000000000000000000000000db903ab6ffff00006600000000000000000000000000000000
0000000000000000000000660000ffffb6ffffffffffffffffffffffffffffffffffffffffff00
00ffffffffffff0000660000000000000000000000000000000000000000000000000000006600
00ffffb666b6db0000000000000000000000000000000000000000003a0000ffdb90ffffffffff
ffdbdbff3a66b600003a0000000000003a3a00b69066ffffdbb6ffff0000660000000000000000
00000000000000000000000000000000000000660000ffffb6ffffffffffffffffffffffffffff
ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffff0000030000000000
}\par

\pard\sa200\sl276\slmult1\par
}
1

There are 1 answers

2
Theo On

It looks like WordPad always converts a picture into .wmf format (wmetafile8 in RTF), but for .PNG and .JPG files this doesn't seem needed.

Below demo is limited to image types PNG, JPG

# This example uses a .jpg file
$imagePath = 'D:\Test\test.jpg'

$rtfType = switch -Regex ([System.IO.Path]::GetExtension($imagePath).TrimStart(".")) {
    'png'   { 'pngblip' }
    'jpe?g' { 'jpegblip'}
}
# get the image dimensions
$pixelSize = ([System.Drawing.Image]::FromFile($imagePath)).Size
$width  = $pixelSize.Width
$height = $pixelSize.Height
$twipsW = $width * 15  # pixels to twips
$twipsH = $height * 15

# load the image file as bytes
[byte[]]$imageBytes = [System.IO.File]::ReadAllBytes($imagePath)
# convert the bytes to hex string, split on 78 bytes per line
$hexImage = [System.BitConverter]::ToString($imageBytes).Replace('-','') -split '(.{78})' -ne '' -join [environment]::NewLine

# create the image in RTF format
# IMPORTANT: the top line MUST end in a space character!
$rtfImage = @"
{\pict\$rtfType\picw$width\pich$height\picwgoal$twipsW\pichgoal$twipsH 
$hexImage
}
"@

# merge in RTF document
$rtfContent = @"
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang3081{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.17763}\viewkind4\uc1 
\pard\sa200\sl240\slmult1\f0\fs22\lang9\par
$rtfImage
\par
\pard\sa200\sl276\slmult1\par
}
"@

# save as file
$rtfContent | Set-Content -Path 'D:\Test\completed.rtf'

When opened in WordPad or MS Word you should have the image in there:

enter image description here