Jump to content

Struggling with _Word_DocPictureAdd

Go to solution Solved by Nine,

Recommended Posts



so I have started to learn to use the Word UDF and got issue to add my pictures after exact paragraphs. I was searching in the forum for the solution, checked with examples and still I don't understand how to add pictures after paragraph in new line.


My word document has like 8 pages and for example on page I have paragraph named "My examples:" and here starts my problem.


I have tried to do this:

#include <Word.au3>

Local $oWord = _Word_Create()
Local $oDoc = _Word_DocOpen($Word, @ScriptDir & "\examples.docx", Default, Default, True)

$oSearchRange = _Word_DocRangeSet($oDoc, -1, $wdParagraph, 0)
$oRangeFound = _Word_DocFind($oDoc, "My examples:", $oSearchRange)

_Word_DocPictureAdd($oDoc, @ScriptDir & "\pic1.jpg", Default, Default, $oRangeFound)

And here the picture adds before the paragraph My examples: on same line and looks like

{pic1}My Examples:


What I want to see is:

My examples:

{PICTURE IN NEW LINE} which is pic1.jpg from my code.


How I can do that? I want to add 3 pictures in a row in new line each like:

My examples:





Hope I explained this well, but you can ask me if you need any additional information to clarify.

Edited by diff
Link to post
Share on other sites
  • Solution

There was a number of typos in your snippet, but here a clean working example :

#include <Word.au3>

Local $oWord = _Word_Create()
Local $oDoc = _Word_DocOpen($oWord, @ScriptDir & "\V.doc", Default, Default, True)

$oSearchRange = _Word_DocRangeSet($oDoc, -1)
$oRangeFound = _Word_DocFind($oDoc, "Dijon", $oSearchRange)
$oSearchRange = _Word_DocRangeSet($oDoc, $oRangeFound, $wdParagraph, 1)
_Word_DocPictureAdd($oDoc, @ScriptDir & "\Pic1.jpg", Default, Default, $oRangeFound)


Link to post
Share on other sites
4 minutes ago, Nine said:

There was a number of typos in your snippet, but here a clean working example :

#include <Word.au3>

Local $oWord = _Word_Create()
Local $oDoc = _Word_DocOpen($oWord, @ScriptDir & "\V.doc", Default, Default, True)

$oSearchRange = _Word_DocRangeSet($oDoc, -1)
$oRangeFound = _Word_DocFind($oDoc, "Dijon", $oSearchRange)
$oSearchRange = _Word_DocRangeSet($oDoc, $oRangeFound, $wdParagraph, 1)
_Word_DocPictureAdd($oDoc, @ScriptDir & "\Pic1.jpg", Default, Default, $oRangeFound)


Yeah, sorry for the typos as I wasn't be able to copy now the code so I wrote from my memory. I have fixed the first post now.


I have quickly checked your solution and looks like now the image is inserted exactly where I needed, I will try later to do this with more pictures in a row if that will work.


Thank you for the solution, looks so simple where I was stuck :sweating:

Link to post
Share on other sites

Sorry for double post, just adding solution with multiple pictures if someone will need it


I added a loop to add more screenshots, probably it could be written better, but it's working for me and I am still learning ;)

So the pictures will be added in ascending order like

My examples:




My extra code below on @Nine example:

#include <Word.au3>

$picName = "Pic"
$picFormat = ".jpg"

Local $oWord = _Word_Create()
Local $oDoc = _Word_DocOpen($oWord, @ScriptDir & "\V.doc", Default, Default, True)

$oSearchRange = _Word_DocRangeSet($oDoc, -1)
$oRangeFound = _Word_DocFind($oDoc, "Dijon", $oSearchRange)
$oSearchRange = _Word_DocRangeSet($oDoc, $oRangeFound, $wdParagraph, 1)

Local $i = 1

While 1

    _Word_DocPictureAdd($oDoc, @ScriptDir & "\" & $picName & $i & $picFormat, Default, Default, $oRangeFound)
    _Word_DocRangeSet($oDoc, $oRangeFound, $wdParagraph, 1) ;   to add pics in ascending order
    $i += 1

    If FileExists(@ScriptDir & "\" & $picName & $i & $picFormat) = 0 Then



Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By ahha
      I'm trying to get the number of columns in a specific row in a Word table and am stuck.   I need a push.  Program below and Word file attached.
      #AutoIt3Wrapper_run_debug_mode=Y ;use this to debug in console window #include <Word.au3> $oWord = _Word_Create(True, True) ;Create Word application object, make it visible, and force a new instance of Word $oDoc = _Word_DocOpen($oWord, @ScriptDir&"\ColumnTest.docx", Default, Default, True) ;Open the Word document $iTablesCount = $oDoc.Tables.Count ;get Tables count in $oDoc Pause("$iTablesCount = '" & $iTablesCount & "'") $iRowCount = $oDoc.Tables.Item(1).Rows.Count ;Table hard coded $iColCount = $oDoc.Tables.Item(1).Columns.Count Pause("Table#1 $iRowCount = '" & $iRowCount & " $iColCount = '" & $iColCount & "'") ;trying to get the number of columns in each row ;$ColCountInRow = $oDoc.Tables.Item(1).Rows(1).Columns.Count ;this fails and read somewhere to use Cells.Count $ColCountInRow = $oDoc.Tables.Item(1).Rows(1).Cells.Count ;hard code Row 1 <<<<< ERROR here ;this is the error I get ;: ==> The requested action with this object has failed.: ;$ColCountInRow = $oDoc.Tables.Item(1).Rows(1).Cells.Count ;$ColCountInRow = $oDoc.Tables.Item(1)^ ERROR Pause("Row 1 has " & $ColCountInRow & " Columns") Exit Func Pause($text="") MsgBox(262144, "DEBUG", "Paused: " & $text) EndFunc  
    • By Fenzik
      i wrote this function as alternative to using the Com Object or Commandline version of this project, discussed also earlyer on this forum.
      Project site - http://ebstudio.info/home/xdoc2txt.html
      Advantage of this implementation is that you do not need to register Com dll, using regsvr32.
      But you still need the project Dll (xd2txlib.dll).
      ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ExtractText ; Description ...: Extracts text from advanced documment formats (Doc, Docx, ODT, XLS, ...) ; Syntax ........: _ExtractText($sFilename[, $bProperties = False[, $hDll = 0]]) ; Parameters ....: $sFilename - a string value. ; $bProperties - [optional] a boolean value. Default is False. If True, documment properties will be returned instead of the text. ; $hDll - [optional] a handle value. Default is 0. Optional handle to previously opened xd2txlib.dll. By default the xd2txlib.dll (Expected in @scriptdir) will be opened and closed during the function call. ; Return value .: String, containing the text or documment properties or empty string and Error as follows: ;1 - The file does not exists. ;2 - Error during opening xd2txlib.dll. ;3 - No text returned. ; Author ........: Fenzik ; Modified ......: ; Remarks .......: Project site - http://ebstudio.info/home/xdoc2txt.html ; Related .......: ; Link ..........: ; Example .......: No ; =============================================================================================================================== Func _ExtractText($sFilename, $bProperties = False, $hDll = 0) If Not FileExists($sFilename) Then Return SetError(1, "", "") Local $bLoaded = False If $hDll = 0 Then $hDll = DllOpen(@scriptdir&"\xd2txlib.dll") If $hDll = -1 Then Return SetError(2, "", "") $bLoaded = True Endif $aResult = DllCall($hDll, "int:cdecl", "ExtractText", "WSTR", $sFilename, "BOOL", $bProperties, "WSTR*", "") If $aResult[0] = 0 Then Return SetError(3, "", "") If $bLoaded = True Then DllClose($hDll) Return $aResult[3] EndFunc  
    • By lavascript
      I have a Word document containing a 9-column table where row 1 is the column headers. My goal is to read the table into a 2d array, remove some rows, update some fields, and add a few rows to the end. The resulting array will likely be a different length. Next, I want to write the data back into the table. If it's easier, I can write the data to a new document from a template containing the same table header with a blank 2nd row.
      Here's my early attempt:
      Local $oWord = _Word_Create() Local $oDoc = _Word_DocOpen($oWord, $sFile) Local $aData = _Word_DocTableRead($oDoc, 1) $aData[3][5] = "Something else" Local $oRange = _Word_DocRangeSet($oDoc, 0) $oRange = _Word_DocRangeSet($oDoc, $oRange, $wdCell, 9) _Word_DocTableWrite($oRange,$aData) This, unfortunately, writes the entire array into the first cell of row 2. What am I doing wrong?
    • By Subz
      Our Microsoft Office Templates shared folder was changed from a DFS share to an Isilon share. example:
      Old Server: \\Domain.com\Office\Templates
      New Server: \\Templates.domain.com\Office\Templates
      The team making the changes overlooked that several hundred thousand documents, had been attached to the old template documents.  So when you open a document which has been attached, it will take a couple of minutes to open, while it tries to locate the old server path.  I've been asked to come in and fix it, so after several hours found that the data is being held in document.zip\word\_rels\settings.xml.rels, I now need to replace the old server path with the new server path.  I didn't want to use dom as that would take too long and found a tool wtc https://github.com/NeosIT/wtc which  works perfectly, takes about 8 minutes to scan a single directory with 4000 documents and fix them.  The problem is the documents are all held on sharepoint and they want to retain the file timestamp, which is easy enough, but they also don't want to keep the "Modified By" apparently they don't like seeing all the documents appearing as "Modified by: Subz"  Anyone know of way to retain the "Modified By" info,
    • By FrancescoDiMuro
      Good evening everyone
      I am working with Word UDF ( thanks @water! ), and, especially, with the function _Word_DocFindReplace().
      The replace does work everywhere in the document, but, it does not work in Headers or Footers.
      Am I missing something or am I forced to use the code below?
      I have already looked in the Help file ( about _Word_DocFindReplace() ), but there are no mentions about replace text in Headers/Footers.
      Sub FindAndReplaceFirstStoryOfEachType() Dim rngStory As Range For Each rngStory In ActiveDocument.StoryRanges With rngStory.Find .Text = "find text" .Replacement.Text = "I'm found .Wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With Next rngStory End Sub Thanks everyone in advance

      Best Regards.
  • Create New...