| View previous topic :: View next topic |
| Author |
Message |
DannyB Moderator


Joined: 02 Apr 2003 Posts: 4062 Location: Lawrence, Kansas, USA
|
Posted: Fri Nov 07, 2003 2:39 pm Post subject: How to convert Word -> PDF from the command line |
|
|
In answer to a question in the General forum, this post is a description of how to convert Word documents into PDF documents from the command line.
You need a Macro to do the work. That part is written in OOo's dialect of Basic.
Get into OpenOffice.org.
Tools -> Macros -> Macro....
Now click the button Organizer.....
Click the Libraries tab.
Set Application/Document to "soffice".
Click the button New...
Give the library the name "DannysLibrary".
Now click the Modules tab.
Unfold the tree of items under soffice. Find DannysLibrary and hilight it. Click the button New Module...
Name the module "Conversion".
The Basic IDE window should appear. Paste in the following code. Be sure to watch out for trailing spaces on lines copied from this web site. Especially on lines ending with an underscore, there cannot be any trailing spaces.
| Code: | Sub test( cArg )
Print "|"+cArg+"|"
End Sub
Sub ConvertWordToPDF( cFile )
cURL = ConvertToURL( cFile )
' Open the document.
' Just blindly assume that the document is of a type that OOo will
' correctly recognize and open -- without specifying an import filter.
oDoc = StarDesktop.loadComponentFromURL( cURL, "_blank", 0, Array(_
MakePropertyValue( "Hidden", True ),_
) )
cFile = Left( cFile, Len( cFile ) - 4 ) + ".pdf"
cURL = ConvertToURL( cFile )
' Save the document using a filter.
oDoc.storeToURL( cURL, Array(_
MakePropertyValue( "FilterName", "writer_pdf_Export" ),_
)
oDoc.close( True )
End Sub
Function MakePropertyValue( Optional cName As String, Optional uValue ) As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans.PropertyValue
If Not IsMissing( cName ) Then
oPropertyValue.Name = cName
EndIf
If Not IsMissing( uValue ) Then
oPropertyValue.Value = uValue
EndIf
MakePropertyValue() = oPropertyValue
End Function
|
This macro code is now part of OpenOffice.org and not specific to any document. That is, the macro is available at all times. Even if no documents are currently open.
Now write a Windows batch file. (Or a Linux shell script, let me know if I need to do this on Linux and post a followup.)
| Code: | @ECHO OFF
"c:\program files\OpenOffice.org1.1.0\program\soffice" -invisible "macro:///DannysLibrary.Conversion.ConvertWordToPDF(%1)"
rem "c:\program files\OpenOffice.org1.1.0\program\soffice" -invisible "macro:///DannysLibrary.Conversion.test(%1)"
|
Be sure that you do not have any spaces between the parenthesis and the %1. You can un-comment the DannysLibrary.Converstion.test() line if you would like to call the simpler test function. When you do so, OOo hangs while a dialog is displayed that you need to dismiss before the batch file will continue.
Now from the command line, run your BAT file like this...
| Code: | | convert c:\test.doc |
A new file c:\test.pdf should appear.
If you want to convert bunches of documents, I have written a document converter utility that you can get over on the web site OOoMacros.org. _________________ Want to make OOo Drawings like the colored flower design to the left? |
|
| Back to top |
|
 |
Guest
|
Posted: Fri Nov 21, 2003 10:41 pm Post subject: |
|
|
oDoc.storeToURL( cURL, Array(_
This line throws a com.sun.star.io.IOException in Linux. Any work arounds? |
|
| Back to top |
|
 |
DannyB Moderator


Joined: 02 Apr 2003 Posts: 4062 Location: Lawrence, Kansas, USA
|
Posted: Sat Nov 22, 2003 7:03 am Post subject: |
|
|
In my experience, there are two reasons for this exception.
1. Using a filter name that does not apply to the current document type. (i.e. use the Writer-PDF export filter from a spreadsheet document.)
2. Using an unrecognized PropertyValue parameter to a filter.
| Code: | oDoc.storeToURL( cURL, Array( MakePropertyValue( "FilterName", "SomeFilter" ),
MakePropertyValue( "FooBar", True ) ) ) |
Here the problem could either be that the current document does NOT recognize "SomeFilter" filter. Or if there really is a filter named "SomeFilter" that works for the current document type, then that filter does not like the "FooBar" parameter. _________________ Want to make OOo Drawings like the colored flower design to the left? |
|
| Back to top |
|
 |
Guest
|
Posted: Sun Nov 23, 2003 5:10 pm Post subject: |
|
|
What I'm looking for is a sxc->pdf from command line and sxw->pdf from command line. Here's the results I've gotten so far on Linux with the above code.
I tried to convert a actual doc and got this:
Fatal exception: Signal 11
and a bunch of debug stuff.
Trying to convert a sxc throws the IO error.
Trying to convert a sxw:
Fatal exception: Signal 11
and a bunch of debug stuff.
Now for the big list of debug stuff:
Fatal exception: Signal 11
Stack:
/usr/opt/OpenOffice.org1.1.0/program/libsal.so.3[0x40bc5e4a]
/usr/opt/OpenOffice.org1.1.0/program/libsal.so.3[0x40bc5fd4]
/usr/opt/OpenOffice.org1.1.0/program/libsal.so.3[0x40bc609a]
/lib/tls/libpthread.so.0[0x411368f8]
/usr/opt/OpenOffice.org1.1.0/program/libsw645li.so[0x46c3ec54]
/usr/opt/OpenOffice.org1.1.0/program/libpdffilter645li.so[0x47abdc5a]
/usr/opt/OpenOffice.org1.1.0/program/libpdffilter645li.so[0x47abb7ab]
/usr/opt/OpenOffice.org1.1.0/program/libpdffilter645li.so[0x47abba58]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN14SfxObjectShell8ExportToER9SfxMedium+0x110b)[0x44ad5f81]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN14SfxObjectShell11SaveTo_ImplER9SfxMediumPK10SfxItemSeth+0x10c0)[0x44ad21ec]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN14SfxObjectShell16PreDoSaveAs_ImplERK6StringS2_P10SfxItemSet+0x3e4)[0x44ad7902]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN14SfxObjectShell17CommonSaveAs_ImplERK13INetURLObjectRK6StringP10SfxItemSet+0x505)[0x44ad71d1]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN14SfxObjectShell14APISaveAs_ImplERK6StringP10SfxItemSet+0x2ad)[0x44adf355]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN12SfxBaseModel10impl_storeEP14SfxObjectShellRKN3rtl8OUStringERKN3com3sun4star3uno8SequenceINS8_5beans13PropertyValueEEEh+0x294)[0x44b25dae]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN12SfxBaseModel10storeToURLERKN3rtl8OUStringERKN3com3sun4star3uno8SequenceINS6_5beans13PropertyValueEEE+0x107)[0x44b218f7]
/usr/opt/OpenOffice.org1.1.0/program/libgcc3_uno.so[0x4563e899]
/usr/opt/OpenOffice.org1.1.0/program/libgcc3_uno.so[0x4563ec34]
/usr/opt/OpenOffice.org1.1.0/program/libgcc3_uno.so[0x4563f0f6]
/usr/opt/OpenOffice.org1.1.0/program/corereflection.uno.so[0x46320391]
/usr/opt/OpenOffice.org1.1.0/program/libsb645li.so(_ZN11SbUnoObject6NotifyER14SfxBroadcasterRK7SfxHint+0xef8)[0x44dd208a]
/usr/opt/OpenOffice.org1.1.0/program/libsvl645li.so(_ZN14SfxBroadcaster9BroadcastERK7SfxHint+0x4e)[0x40404f08]
/usr/opt/OpenOffice.org1.1.0/program/libsvt645li.so(_ZN11SbxVariable9BroadcastEm+0x151)[0x40724947]
/usr/opt/OpenOffice.org1.1.0/program/libsvt645li.so(_ZN8SbxValueC2ERKS_+0x97)[0x40720a59]
/usr/opt/OpenOffice.org1.1.0/program/libsvt645li.so(_ZN11SbxVariableC2ERKS_+0x30)[0x40724304]
/usr/opt/OpenOffice.org1.1.0/program/libsb645li.so(_ZN10SbiRuntime11FindElementEP9SbxObjectttmh+0x4e1)[0x44dfc2fd]
/usr/opt/OpenOffice.org1.1.0/program/libsb645li.so(_ZN10SbiRuntime8StepELEMEtt+0x163)[0x44dfd4a5]
/usr/opt/OpenOffice.org1.1.0/program/libsb645li.so(_ZN10SbiRuntime4StepEv+0x1b4)[0x44df6c48]
/usr/opt/OpenOffice.org1.1.0/program/libsb645li.so(_ZN8SbModule3RunEP8SbMethod+0x244)[0x44dc57d0]
/usr/opt/OpenOffice.org1.1.0/program/libsb645li.so(_ZN8SbModule6NotifyER14SfxBroadcasterRK7SfxHint+0xfb)[0x44dc4f39]
/usr/opt/OpenOffice.org1.1.0/program/libsvl645li.so(_ZN14SfxBroadcaster9BroadcastERK7SfxHint+0x4e)[0x40404f08]
/usr/opt/OpenOffice.org1.1.0/program/libsb645li.so(_ZN8SbMethod9BroadcastEm+0x1d9)[0x44dc92bf]
/usr/opt/OpenOffice.org1.1.0/program/libsvt645li.so[0x4072e300]
/usr/opt/OpenOffice.org1.1.0/program/libsvt645li.so(_ZN9SbxObject7ExecuteERK6String+0x5c)[0x4072e7e0]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN14SfxMacroLoader9loadMacroERKN3rtl8OUStringERN3com3sun4star3uno3AnyEP14SfxObjectShell+0xb8f)[0x44a11ca9]
/usr/opt/OpenOffice.org1.1.0/program/libsfx645li.so(_ZN14SfxMacroLoader24dispatchWithNotificationERKN3com3sun4star4util3URLERKNS2_3uno8SequenceINS2_5beans13PropertyValueEEERKNS7_9ReferenceINS2_5frame23XDispatchResultListenerEEE+0x171)[0x44a10d41]
/usr/opt/OpenOffice.org1.1.0/program/soffice.bin(_ZN7desktop15DispatchWatcher23executeDispatchRequestsERKN4_STL6vectorINS0_15DispatchRequestENS1_9allocatorIS3_EEEE+0x2d36)[0x8079d54]
/usr/opt/OpenOffice.org1.1.0/program/soffice.bin(_ZN7desktop15OfficeIPCThread22ExecuteCmdLineRequestsERNS_23ProcessDocumentsRequestE+0x17f)[0x80704a1]
/usr/opt/OpenOffice.org1.1.0/program/soffice.bin(_ZN7desktop7Desktop11OpenClientsEv+0x1aec)[0x8067bcc]
/usr/opt/OpenOffice.org1.1.0/program/soffice.bin(_ZN7desktop7Desktop16OpenClients_ImplEPv+0x11)[0x8065cf5]
/usr/opt/OpenOffice.org1.1.0/program/soffice.bin(_ZN7desktop7Desktop24LinkStubOpenClients_ImplEPvS1_+0x18)[0x8065ce0]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so[0x40228c5a]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_Z19ImplWindowFrameProcPvP8SalFrametPKv+0x437)[0x40229445]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN12SalFrameData19HandleClientMessageEP19XClientMessageEvent+0xb3)[0x402893f7]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN12SalFrameData8DispatchEP7_XEvent+0x4f2)[0x40289e40]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN10SalDisplay8DispatchEP7_XEvent+0x28f)[0x402b5811]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN10SalDisplay5YieldEh+0xf1)[0x402b555f]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so[0x402b153f]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN7SalXLib5YieldEh+0x39a)[0x402b0090]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN11SalInstance5YieldEh+0x34)[0x402b8e54]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN11Application5YieldEv+0x61)[0x400e58c9]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_ZN11Application7ExecuteEv+0x35)[0x400e57db]
/usr/opt/OpenOffice.org1.1.0/program/soffice.bin(_ZN7desktop7Desktop4MainEv+0x1b02)[0x8065258]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(_Z6SVMainv+0x49)[0x400ea697]
/usr/opt/OpenOffice.org1.1.0/program/libvcl645li.so(main+0x4c)[0x402aea94]
/lib/tls/libc.so.6(__libc_start_main+0xe4)[0x42015704]
/usr/opt/OpenOffice.org1.1.0/program/soffice.bin(_ZN6Window11RequestHelpERK9HelpEvent+0x3d)[0x805e651]
Aborted |
|
| Back to top |
|
 |
DannyB Moderator


Joined: 02 Apr 2003 Posts: 4062 Location: Lawrence, Kansas, USA
|
Posted: Mon Nov 24, 2003 9:00 am Post subject: |
|
|
| Quote: | | What I'm looking for is a sxc->pdf from command line and sxw->pdf from command line. Here's the results I've gotten so far on Linux with the above code. |
The code I gave above, with the batch file for Windows, was a quick actual working example I threw together for the purpose of posting it. That should solve the Word --> PDF problem. That is how I tested it. You mention Linux. In that case, you would, of course, write a bash script that is similar in concept to the bat file.
In order to get sxc -> pdf, a different pdf export filter would need to be used. In this particular case, use 'calc_pdf_Export' as the export filter.
The gist of the overall macro routine is pretty simple. Open the document. Then save the document, but specifying a particular filter to use to write it. Then close the document.
Let's try to narrow down the problem. I could suppose that the error occurs at one of the following points....
1. Error launching macro from command line in Linux.
2. Macro starts, but problem occurs loading the document.
3. Document opens, but problem saving it. (Likely)
4. Problem closing document.
5. Problem occurs immediately after last line of macro has executed and macro exits.
Both 1 and 5 are a bug in OOo.
2 is unlikely, as that is a very standard technique. One problem is if you are altering 2 to use additional parameters, filters, or filter options that lead to a problem.
3 is likely to be the problem.
4 is unlikely, due to its simplicity. You could try calling either the dispose() method, or the close( True ) to close the document.
A problem in 3 is very likely to be due to use of incorrect filter or option to the filter, as I explained previously.
If you want to narrow down where the problem occurs, try inserting a MsgBox call into the program. Star by putting this line...
MsgBox( "Here, at point 1." )
as the very first line of the macro. Now run the macro from the command line. When OOo launches, it's GUI should stop with a message box that must be dismissed. If this occurs, then you got to the MsgBox statement successfully.
Next, try moving the MsgBox right before the file is opened. Then right after the file is opened, etc. Even if OOo is totally crashing with Signal 11, you should be able to determine just how far into the macro it is getting, and which statement is likely to be at fault. _________________ Want to make OOo Drawings like the colored flower design to the left? |
|
| Back to top |
|
 |
Guest
|
Posted: Wed Nov 26, 2003 1:02 am Post subject: |
|
|
calc_pdf_Export works as expected and produces a nice pdf for sxc documents. writer_pdf_Export till throws signal 11s and the failure is at step 3. Did I just stumble on a bug?
The scw's and doc's I'm trying to export from command line do export from the actual program just fine.
Any suggestions? |
|
| Back to top |
|
 |
Guest
|
Posted: Wed Nov 26, 2003 1:55 am Post subject: |
|
|
| I should be more specific. If I export them manually from writer, they export fine. If I run the macro in the program, it throws signal 11 just like envolking it from the command line. |
|
| Back to top |
|
 |
Guest
|
Posted: Wed Nov 26, 2003 5:55 am Post subject: |
|
|
On another note, I can''t seem to convert a sxc to a text file. I'm using this line:
oDoc.storeToURL( cURL, Array(MakePropertyValue( "FilterName", "Text - txt - csv (StarCalc)" ),)
and it generates a file with 1 byte. Do I need to pass it any more options to get it work right? |
|
| Back to top |
|
 |
DannyB Moderator


Joined: 02 Apr 2003 Posts: 4062 Location: Lawrence, Kansas, USA
|
Posted: Wed Nov 26, 2003 6:34 am Post subject: |
|
|
Are you closing the command with the correct number of parenthesis? (Of course, in Basic, or some other languages, not doing so should result in a syntax error of some kind.)
I notice the comma at the end in between two parens, is this just a typo?
Other than that, it looks like you're using the right filter, and otherwise doing the storeToURL correctly.
Be aware that some filters work with storeToURL, but apparently not storeAsUrl. The storeAsUrl is like doing a File --> Save As...
The storeToUrl is sort of like doing a "save a copy.....but don't associate this document with that copy". _________________ Want to make OOo Drawings like the colored flower design to the left? |
|
| Back to top |
|
 |
Guest
|
Posted: Wed Nov 26, 2003 7:42 am Post subject: |
|
|
Talking about the sxc->text conversion----
>Are you closing the command with the correct number of parenthesis? (Of course, in Basic, or some other languages, not doing so should result in a syntax error of some kind.)
I'm a c++ programmer, and all of it looks odd to me. No I wasn't, but I just copy/pasted your code from up top, it's missing a ) too. Doesn't make a difference though, no warnings, no change in results.
>I notice the comma at the end in between two parens, is this just a typo?
Not a typo, just a copy/paste. Course I took out all the _'s cause I really don't like that formatting. Took that out too, no change in results.
>Be aware that some filters work with storeToURL, but apparently not storeAsUrl. >The storeAsUrl is like doing a File --> Save As...
Tried both ways, still getting the 1 byte file output. Very strange. I noticed in the gui it asked a few questions before actually saving as a text file. Wonder if that is causing it to fail.
scw->pdf conversion ----
Does it fail on your linux box? I got 2 installs on 2 redhat 9 boxes, both signal 11 out using the same code. |
|
| Back to top |
|
 |
DannyB Moderator


Joined: 02 Apr 2003 Posts: 4062 Location: Lawrence, Kansas, USA
|
Posted: Wed Nov 26, 2003 8:01 am Post subject: |
|
|
The comma at the end in between parens would NOT be a typo only in the case of the code comming from the Python language. In Python, an Uno <sequence> is represented as a Python tupple, and hence the extra comma.
In most other languages, Java, OOo Basic, Microsoft Visual Basic, an Uno <sequence> is represented by an array. In OOo Basic, you can instantly construct an anonymous array using the Array() function.
These two fragments would be equivalent...
One way to skin a cat...
| Code: | Dim aArray( 2 )
aArray(0) = 37
aArray(1) = 93
aArray(2) = 52 |
Another way to skin a cat...
| Code: | | aArray = Array( 37, 93, 52 ) |
I just had another thought. You mentioned that when saving a spreadsheet to text (really csv), you get another dialog box. This means that you do need to specify an additional property called FilterOptions. Something like...
| Code: | oDoc.storeToURL( cURL, _
Array(_
MakePropertyValue( "FilterName", "Text - csv - ......(StarCalc)" ),_
MakePropertyValeu( "FilterOptions", "....some options...." ) ) )
|
Sorry, I don't know the Text - csv - StarCalc filter name right off the top of my head.
Here is the real important point. I am pretty sure it is necessary to specify a string of FilterOptions for the CSV export filter. I don't know how to write this, but I know I've seen it somewhere. Maybe in the Developer's Guide. That may be why you are getting Signal 11. Lack of a FilterOptions string. A good confirmation of this would be if other "parameterless" export filters work, such as saving to PDF, DIF, SYLK, etc. _________________ Want to make OOo Drawings like the colored flower design to the left? |
|
| Back to top |
|
 |
DannyB Moderator


Joined: 02 Apr 2003 Posts: 4062 Location: Lawrence, Kansas, USA
|
|
| Back to top |
|
 |
Guest
|
Posted: Sat Nov 29, 2003 8:23 pm Post subject: |
|
|
Fixed..
Not as clean as I'd like, but it works so I'm happy with it.
I read some of your other conversion posts and came up with this:
' Convert a bunch of SXW Documents.
Sub Main
' This is the hardcoded pathname to a folder containing sxw files.
cFolder = "/home/someone/temp"
' Get the pathname of each file within the folder.
cFile = Dir$( cFolder + "/*.*" )
Do While cFile <> ""
' If it is not a directory...
If cFile <> "." And cFile <> ".." Then
' If it has the right suffix...
If LCase( Right( cFile, 4 ) ) = ".sxw" Then
' Open the document.
oDoc = StarDesktop.loadComponentFromURL( ConvertToUrl( cFolder + "/" + cFile ), "_blank", 0, Array() )
' Prepare new filename
cNewName = Left( cFile, Len( cFile ) - 4 )
' Save it in OOo format.
'oDoc.storeToURL( ConvertToUrl( cFolder + "/" + cNewName + ".sxW" ), Array() )
' Export it using a filter.
oDoc.storeToURL( ConvertToUrl( cFolder + "/" + cNewName + ".pdf" ),_
Array( MakePropertyValue( "FilterName", "writer_pdf_Export" ) ) )
' Close the document.
oDoc.dispose()
EndIf
EndIf
cFile = Dir$
Loop
End Sub
'----------
' Create and return a new com.sun.star.beans.PropertyValue.
'
Function MakePropertyValue( Optional cName As String, Optional uValue ) As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans.PropertyValue
If Not IsMissing( cName ) Then
oPropertyValue.Name = cName
EndIf
If Not IsMissing( uValue ) Then
oPropertyValue.Value = uValue
EndIf
MakePropertyValue() = oPropertyValue
End Function
Not really sure why this version works and the other bombs out, but I really don't have a time to figure it out - as long as it works.
This also works for the cvs export as well - with no filter options needed.
As for the pure command line stuff, this script runs things with just the frame buffer and cleans itself up:
#!/bin/sh
#Start fake xserver
nohup /usr/X11R6/bin/Xvfb :25 -screen scrn 800x600x32 &
#Run our script
/usr/bin/soffice -invisible -headless "macro:///Some.script.here" -display :25
#Kill the server
/usr/bin/killall Xvfb
Maybe that'll help someone out. |
|
| Back to top |
|
 |
Guest
|
Posted: Sat Dec 06, 2003 5:31 pm Post subject: |
|
|
Hi!
I'm trying to use this macro with OOo 1.1.0 on Linux, but when it gets to the command oDoc.storeToURL, i says the object is not set. It seems that the command StarDesktop.loadComponentFromURL is failing, but I don't know how to determine why. I tried printing the values of cFile and cURL, and they looked correct. The file I'm trying to open is a Word document, and it opens correctly in oowriter.
Thanks for any help.
Felipe |
|
| Back to top |
|
 |
DannyB Moderator


Joined: 02 Apr 2003 Posts: 4062 Location: Lawrence, Kansas, USA
|
Posted: Sun Dec 07, 2003 11:18 am Post subject: |
|
|
| Quote: | | I'm trying to use this macro with OOo 1.1.0 on Linux, but when it gets to the command oDoc.storeToURL, i says the object is not set. It seems that the command StarDesktop.loadComponentFromURL is failing, but I don't know how to determine why. I tried printing the values of cFile and cURL, and they looked correct. |
It sounds like oDoc does not contain a document. So you get an error when you oDoc.storeToURL. If oDoc does not contain a document, then the actual problem is higher up where oDoc is created.
What exactly does your loadComponentFromURL() statement look like? (Perhaps a bit of surrounding code as well.) _________________ Want to make OOo Drawings like the colored flower design to the left? |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|