一直在解决PDF文档转换的问题,今天无意中搜索到老外的一段代码,好象可以解决,先记下来.
好象注释还不是英文的,有明白的解释一下
代码
1
using
System;
2 using System.Text;
3 using System.Diagnostics;
4 using System.Threading;
5 using Tyma.ToPDF.Support;
6 //
7 using unoidl.com.sun.star.lang;
8 using unoidl.com.sun.star.uno;
9 using unoidl.com.sun.star.bridge;
10 using unoidl.com.sun.star.frame;
11
12 namespace Tyma.Support.OpenOffice
13 {
14 /*
15 pri konverzi pres Open Office se skryva hlavni okno aplikace, zustava zobrazen jen splash screen,
16 ktery lze vypnout v souboru program/soffice.ini nastavenim promene Logo=0
17 */
18
19 /// <summary>
20 /// Predstavuje stav timeru.
21 /// </summary>
22 internal class TimerStateOO
23 {
24 private int count;
25 private int endCount;
26 private Timer timer = null ;
27
28 /// <summary>
29 /// Urcuje kolikrat byla metoda timeru spustena
30 /// </summary>
31 internal int Count
32 {
33 get { return count; }
34 set { count = value; }
35 }
36
37 /// <summary>
38 /// Pocet kolikrat ma byt metoda timeru vykonana
39 /// </summary>
40 internal int EndCount
41 {
42 get { return endCount; }
43 set { endCount = value; }
44 }
45
46 /// <summary>
47 /// Odkaz na timer (bude mozne s nim manipulovat v timer metode)
48 /// </summary>
49 internal Timer Timer
50 {
51 get { return timer; }
52 set { timer = value; }
53 }
54 }
55
56 internal static class TimerForOpenOffice
57 {
58 private static GDebug log = null ;
59 private static Timer m_oTimer = null ;
60
61 public static void Init(GDebug dbg)
62 {
63 log = dbg;
64 }
65
66 /// <summary>
67 /// Run timer
68 /// </summary>
69 /// <param name="EndCount"> Pocet zavolani obsluzne funkce casovace v definovanem intervalu </param>
70 /// <returns></returns>
71 internal static void RunTimer()
72 {
73 int EndCount = 50 , interval = 200 ;
74 TimerStateOO lState = new TimerStateOO();
75 lState.EndCount = EndCount;
76 //
77 m_oTimer = new Timer( new TimerCallback(DoTestWarningOODialog), lState, 0 , interval);
78 lState.Timer = m_oTimer;
79
80 // dokud beh timeru ukoncen cekame
81 while (lState.Timer != null )
82 {
83 Thread.Sleep( 100 );
84 }
85 //
86 log.WriteLn( " - timer was terminated " );
87 }
88
89 internal static void StopTimer()
90 {
91 m_oTimer.Dispose();
92 m_oTimer = null ;
93 log.WriteLn( " - timer was stopped. " );
94 }
95
96 private static bool FindWarningWindow()
97 {
98 int l_nHandle = 0 ;
99 l_nHandle = Win32.FindWindow( " SALSUBFRAME " , " Chyby během exportu PDF " ); // TODO: prelozit i pro anglickou
100
101 verzi windows
102
103 log.WriteLn(String.Format( " - handle: {0} " , l_nHandle));
104
105 if (l_nHandle == 0 )
106 {
107 log.WriteLn( " - Window handle not found. [FALSE] " );
108 return false ;
109 }
110
111 // IntPtr hwndChild = Win32.FindWindowEx((IntPtr)l_nHandle, IntPtr.Zero, "Button", "&Tisk");
112
113 if (Win32.SendMessage(( int )l_nHandle, Win32.WM_CLOSE, 0 , 0 ) == 0 )
114 log.WriteLn( " - Warning dialog was closed [OK] " );
115 else
116 log.WriteLn( " - Warning dialog wasn't closed [FALSE] " );
117
118 return true ;
119 }
120
121 /// <summary>
122 /// event of timer
123 /// </summary>
124 /// <param name="state"></param>
125 private static void DoTestWarningOODialog( object state)
126 {
127 TimerStateOO lState = (TimerStateOO)state;
128 lState.Count ++ ;
129 log.WriteLn(String.Format( " Actual state timer is {0}: {1} " , lState.EndCount, lState.Count));
130
131 if (lState.Count == lState.EndCount || FindWarningWindow())
132 {
133 log.WriteLn( " - timer was stoped. " );
134 lState.Timer.Dispose();
135 lState.Timer = null ;
136 }
137 }
138 }
139
140 /// <summary>
141 /// Converter to pdf with application OpenOffice
142 /// </summary>
143 sealed public class TOpenOffice : IGExternalConverter
144 {
145 private const string m_csOpenOffice = " OpenOffice " ;
146
147 public TOpenOffice()
148 {
149 AppDomain.CurrentDomain.AssemblyResolve -= _searchAssembly; // cleans up previous events, may not be needed.
150 AppDomain.CurrentDomain.AssemblyResolve += _searchAssembly; // registered the event
151 }
152
153 public static bool Is64bitOS
154 {
155 get { return (Environment.GetEnvironmentVariable( " ProgramFiles(x86) " ) != null ); }
156 }
157
158 private static System.Reflection.Assembly _searchAssembly(Object o, ResolveEventArgs e)
159 {
160 // TODO: overit, odmaZat staticke reference potom!
161 GDebug l_oLog = new GDebug(m_csOpenOffice);
162 l_oLog.WriteLn( " - class: GOpenOffice, method: _searchAssembly(Object o, ResolveEventArgs e) " );
163
164 string l_sName = e.Name.Split( ' , ' )[ 0 ] + " .dll " ;
165 if (l_sName.StartsWith( " cli_ " ))
166 return System.Reflection.Assembly.LoadFrom(GetDirfromRegistry() + @" ToPDF\ " + l_sName);
167 else
168 return null ;
169 }
170
171 private static string GetDirfromRegistry()
172 {
173 try
174 {
175 // TODO: 64bit udelat
176 Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(Is64bitOS ?
177
178 @" SOFTWARE\Wow6432Node\Tyma\SHARED\INSTALL32\ " :
179 @" SOFTWARE\Tyma\SHARED\INSTALL32\ " );
180
181 return (rk != null ) ? (rk.GetValue( " ADRTOPDF " , String.Empty) as string ).Trim() + @" TOPDF\ " :
182
183 String.Empty;
184 }
185 catch
186 {
187 return String.Empty;
188 }
189 }
190
191 private struct SUPPORTED_TYPE
192 {
193 public const string m_csSUPPORTED_TYPES = @" .docx|.doc|.rtf|.txt|.xls|.xlsx|.odt|.sxw| " +
194 " .sdw|.vor|.out|.ods|.ots|.sxc|.stc|.xlt|.odp|.otp|.sxi|.sti|.ppt|.odg|.sxd|.std|.sda| " +
195 " .jpg|.jpeg|.tif|.tiff|.bmp|.png|.gif|.txt|.html|.htm " ;
196
197 /*
198 case ".odt":
199 case ".sxw":
200 case ".sdw":
201 case ".vor":
202 case ".out":
203 case ".ods":
204 case ".ots":
205 case ".sxc":
206 case ".stc":
207 case ".xlt":
208 case ".odp":// open office kresba format
209 case ".otp":
210 case ".sxi":
211 case ".sti":
212 case ".ppt":
213 case ".odg":// open office prezentace format
214 case ".otg":
215 case ".sxd":
216 case ".std":
217 case ".sda":
218 */
219 public const string DOC = " .doc " ;
220 public const string DOCX = " .docx " ;
221 public const string RTF = " .rtf " ;
222 public const string TXT = " .txt " ;
223 public const string XLS = " .xls " ;
224 public const string XLSX = " .xlsx " ;
225 }
226
227 #region Implements method interface IGExternalConverter
228 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
229 public bool Initialise( out string ErrText, GDebug debug)
230 {
231 ErrText = String.Empty;
232 GDebug l_oLog = new GDebug(m_csOpenOffice);
233
234 try
235 {
236 lock ( this )
237 {
238 GCommon.Init(l_oLog);
239 l_oLog.WriteLn( " ------------------------------------------------------------------------------------
240
241 ------- " );
242 l_oLog.WriteLn( " - Tyma.Support.PDFCreator.dll, class: GOpenOffice, method:
243
244 IGExternalConverter.Initialise " );
245
246 if (GCommon.IsInstalledOO())
247 {
248 l_oLog.WriteLn( " - OpenOffice is instaled [OK] " );
249 return true ;
250 }
251 else
252 {
253 l_oLog.WriteLn( " - is not instaled OpenOffice. [FALSE] " );
254 ErrText = " - is not instaled OpenOffice. [FALSE] " ;
255 return false ;
256 }
257 } // end lock
258 }
259 catch (System.Exception exp)
260 {
261 ErrText = exp.Message;
262 return false ;
263 }
264 }
265
266 public bool IsSupportedType( string extens)
267 {
268 return (SUPPORTED_TYPE.m_csSUPPORTED_TYPES.IndexOf(extens, StringComparison.OrdinalIgnoreCase) >= 0 );
269 }
270
271 public void ToPdf( byte [] sourcedata, string sourcefilename, out byte [] destdata, GDebug debug)
272 {
273 debug.WriteLn( " - PDFCreator: this method is not supported. [FALSE] " );
274 destdata = null ;
275 }
276
277 public void ToPdf( string sourcefile, string destinfile, GDebug debug)
278 {
279 debug.WriteLn( " - PDFCreator: this method is not supported. [FALSE] " );
280 }
281
282 public bool ToPdf( string sourcefile, ref string destinfile, out string errortext)
283 {
284 return all2PDF(sourcefile, ref destinfile, out errortext);
285 }
286
287 public void Done() { }
288 #endregion
289
290
291 /// <summary>
292 /// Starts the open office.
293 /// </summary>
294 /// <returns></returns>
295 private bool StartOpenOffice( out string errortext)
296 {
297 errortext = String.Empty;
298 GDebug l_oLog = new GDebug(m_csOpenOffice);
299
300 try
301 {
302 ProcessStartInfo theProcess = new ProcessStartInfo( " soffice.exe " );
303 theProcess.WindowStyle = ProcessWindowStyle.Hidden;
304 Process.Start(theProcess);
305 l_oLog.WriteLn( " - OpenOffice proces is running. " );
306
307 return true ;
308 }
309 catch (System.Exception exp)
310 {
311 l_oLog.WriteLn( " - OpenOffice proces is not running. EXCEPTION: " + exp.Message);
312 errortext = " - OpenOffice proces is not running. EXCEPTION: " + exp.Message;
313 return false ;
314 }
315 }
316
317 /// <summary>
318 /// convert all support types
319 /// </summary>
320 /// <param name="sourcefile"></param>
321 /// <param name="destinationfile"></param>
322 /// <param name="errortext"></param>
323 /// <returns></returns>
324 public bool all2PDF( string sourcefile, ref string destinationfile, out string errortext)
325 {
326 GDebug l_oLog = new GDebug(m_csOpenOffice);
327 // -----------init log support:
328 GCommon.Init(l_oLog);
329 TimerForOpenOffice.Init(l_oLog);
330 // ----------------------------
331
332
333 l_oLog.WriteLn( " ------------------------------ " );
334 l_oLog.WriteLn( " - Converter2PDFWidthOO.all2pdf " );
335 errortext = String.Empty;
336
337 string l_sExtension = System.IO.Path.GetExtension(sourcefile);
338 l_oLog.WriteLn( " - converting type file: " + l_sExtension);
339
340 switch (l_sExtension.ToLower())
341 {
342 case " .docx " :
343 case " .doc " :
344 case " .rtf " :
345 case " .odt " :
346 case " .sxw " :
347 case " .sdw " :
348 case " .vor " :
349 case " .html " :
350 case " .txt " :
351 case " .jpg " :
352 case " .tif " :
353 case " .bmp " :
354 case " .png " :
355 case " .gif " :
356 case " .xls " :
357 case " .ods " :
358 case " .ots " :
359 case " .sxc " :
360 case " .stc " :
361 case " .xlt " :
362 case " .odp " : // open office kresba
363 case " .otp " :
364 case " .sxi " :
365 case " .sti " :
366 case " .ppt " :
367 case " .odg " : // open office prezentace
368 case " .otg " :
369 case " .sxd " :
370 case " .std " :
371 case " .sda " :
372
373 return file2pdf(sourcefile, ref destinationfile, out errortext);
374
375 default :
376 errortext = " Daný typ souboru ke konverzi není podporován. " ;
377 return false ;
378 }
379 }
380
381 private bool file2pdf( string sourcefilename, ref string destinationfile, out string errortext)
382 {
383 GDebug l_oLog = new GDebug(m_csOpenOffice);
384 l_oLog.WriteLn( " - ----------------------------- " );
385 l_oLog.WriteLn( " - GConverter2PDFWithOO.file2pdf " );
386
387 errortext = String.Empty;
388
389 lock ( this )
390 {
391 try
392 {
393 StartOpenOffice( out errortext);
394
395 // Get a ComponentContext
396 unoidl.com.sun.star.uno.XComponentContext xLocalContext = uno.util.Bootstrap.bootstrap();
397 // Get MultiServiceFactory
398 unoidl.com.sun.star.lang.XMultiServiceFactory xRemoteFactory =
399
400 (unoidl.com.sun.star.lang.XMultiServiceFactory)xLocalContext.getServiceManager();
401
402 // Get a CompontLoader
403 XComponentLoader aLoader = (XComponentLoader)xRemoteFactory.createInstance
404
405 ( " com.sun.star.frame.Desktop " );
406 l_oLog.WriteLn( " - init Loader. [OK] " );
407
408 // Load the sourcefile
409 XComponent xComponent = initDocument(aLoader, PathConverter(sourcefilename), " _blank " );
410 l_oLog.WriteLn( " - init document. [OK] " );
411
412 // Wait for loading
413 while (xComponent == null )
414 {
415 System.Threading.Thread.Sleep( 500 );
416 }
417
418 destinationfile = System.IO.Path.GetDirectoryName(sourcefilename) + destinationfile + " .tmp " ;
419 // sourcefilename
420
421 saveDocument(xComponent, PathConverter(destinationfile));
422 // Wait for input
423 l_oLog.WriteLn( " - conversation completed! [OK] " );
424
425 // Close OpenOffice
426 xComponent.dispose();
427 xComponent = null ;
428
429 XDesktop xDesk = (XDesktop)aLoader;
430 xDesk.terminate();
431
432 GC.Collect();
433 GC.WaitForPendingFinalizers();
434 l_oLog.WriteLn( " - application OO is closed. [OK] " );
435
436 return true ;
437 }
438
439 /*
440 catch (unoidl.com.sun.star.uno.Exception exp)
441 {
442 throw exp;
443 }
444 */
445
446 catch (System.Exception exp)
447 {
448 l_oLog.WriteLn( " - OpenOffice [FALSE] err: " + exp.Message);
449 errortext = exp.Message;
450 return false ;
451 }
452
453 } // end lock
454 }
455
456 /// <summary>
457 /// Load a given file or create a new blank file
458 /// </summary>
459 /// <param name="aLoader"> A ComponentLoader </param>
460 /// <param name="file"> The file </param>
461 /// <param name="target"> The target </param>
462 /// <returns> Th Component </returns>
463 private XComponent initDocument(XComponentLoader aLoader, string file, string target)
464 {
465 unoidl.com.sun.star.beans.PropertyValue[] Args = new unoidl.com.sun.star.beans.PropertyValue[ 1 ];
466 Args[ 0 ] = new unoidl.com.sun.star.beans.PropertyValue();
467 Args[ 0 ].Name = " Hidden " ;
468 Args[ 0 ].Value.setValue( typeof (Boolean), true );
469
470 XComponent xComponent = aLoader.loadComponentFromURL(file, target, 0 , Args);
471 return xComponent;
472 }
473
474 /// <summary>
475 /// Convert into OO file format
476 /// </summary>
477 /// <param name="file"> The file. </param>
478 /// <returns> The converted file </returns>
479 private string PathConverter( string file)
480 {
481 try
482 {
483 GDebug l_oLog = new GDebug(m_csOpenOffice);
484 l_oLog.WriteLn( " - there is tmp file: " + file);
485 file = file.Replace( @" \ " , " / " );
486
487 return " file:/// " + file;
488 }
489 catch (System.Exception ex)
490 {
491 throw ex;
492 }
493 }
494
495 /// <summary>
496 /// Saves the document.
497 /// </summary>
498 /// <param name="xComponent"> The x component. </param>
499 /// <param name="fileName"> Name of the file. </param>
500 private void saveDocument(XComponent xComponent, string fileName)
501 {
502 Thread l_oVlakno = null ;
503 GDebug l_oLog = new GDebug(m_csOpenOffice);
504
505 try
506 {
507 unoidl.com.sun.star.beans.PropertyValue[] propertyValue = new unoidl.com.sun.star.beans.PropertyValue[ 1 ];
508
509 propertyValue[ 0 ] = new unoidl.com.sun.star.beans.PropertyValue();
510 propertyValue[ 0 ].Name = " FilterName " ;
511 propertyValue[ 0 ].Value = new uno.Any( " writer_pdf_Export " );
512
513
514 // timer zjistuje zda se neobjevi dialog s warovanim pri prevodu, pokud ano obsluha zajisti stisk
515
516 tlacitka OK
517 l_oVlakno = new Thread(TimerForOpenOffice.RunTimer);
518 l_oVlakno.Start();
519 ((XStorable)xComponent).storeToURL(fileName, propertyValue);
520 }
521 catch (System.Exception exp)
522 {
523 l_oLog.WriteLn(exp.Message);
524 throw new System.Exception( " Exception in saveDocument. " );
525 }
526 finally
527 {
528 TimerForOpenOffice.StopTimer();
529 l_oVlakno.Abort(); // aby se vlakno dalo zastavit tak se musi zastavit v nem bezici timer
530 }
531 }
532 }
533 }
2 using System.Text;
3 using System.Diagnostics;
4 using System.Threading;
5 using Tyma.ToPDF.Support;
6 //
7 using unoidl.com.sun.star.lang;
8 using unoidl.com.sun.star.uno;
9 using unoidl.com.sun.star.bridge;
10 using unoidl.com.sun.star.frame;
11
12 namespace Tyma.Support.OpenOffice
13 {
14 /*
15 pri konverzi pres Open Office se skryva hlavni okno aplikace, zustava zobrazen jen splash screen,
16 ktery lze vypnout v souboru program/soffice.ini nastavenim promene Logo=0
17 */
18
19 /// <summary>
20 /// Predstavuje stav timeru.
21 /// </summary>
22 internal class TimerStateOO
23 {
24 private int count;
25 private int endCount;
26 private Timer timer = null ;
27
28 /// <summary>
29 /// Urcuje kolikrat byla metoda timeru spustena
30 /// </summary>
31 internal int Count
32 {
33 get { return count; }
34 set { count = value; }
35 }
36
37 /// <summary>
38 /// Pocet kolikrat ma byt metoda timeru vykonana
39 /// </summary>
40 internal int EndCount
41 {
42 get { return endCount; }
43 set { endCount = value; }
44 }
45
46 /// <summary>
47 /// Odkaz na timer (bude mozne s nim manipulovat v timer metode)
48 /// </summary>
49 internal Timer Timer
50 {
51 get { return timer; }
52 set { timer = value; }
53 }
54 }
55
56 internal static class TimerForOpenOffice
57 {
58 private static GDebug log = null ;
59 private static Timer m_oTimer = null ;
60
61 public static void Init(GDebug dbg)
62 {
63 log = dbg;
64 }
65
66 /// <summary>
67 /// Run timer
68 /// </summary>
69 /// <param name="EndCount"> Pocet zavolani obsluzne funkce casovace v definovanem intervalu </param>
70 /// <returns></returns>
71 internal static void RunTimer()
72 {
73 int EndCount = 50 , interval = 200 ;
74 TimerStateOO lState = new TimerStateOO();
75 lState.EndCount = EndCount;
76 //
77 m_oTimer = new Timer( new TimerCallback(DoTestWarningOODialog), lState, 0 , interval);
78 lState.Timer = m_oTimer;
79
80 // dokud beh timeru ukoncen cekame
81 while (lState.Timer != null )
82 {
83 Thread.Sleep( 100 );
84 }
85 //
86 log.WriteLn( " - timer was terminated " );
87 }
88
89 internal static void StopTimer()
90 {
91 m_oTimer.Dispose();
92 m_oTimer = null ;
93 log.WriteLn( " - timer was stopped. " );
94 }
95
96 private static bool FindWarningWindow()
97 {
98 int l_nHandle = 0 ;
99 l_nHandle = Win32.FindWindow( " SALSUBFRAME " , " Chyby během exportu PDF " ); // TODO: prelozit i pro anglickou
100
101 verzi windows
102
103 log.WriteLn(String.Format( " - handle: {0} " , l_nHandle));
104
105 if (l_nHandle == 0 )
106 {
107 log.WriteLn( " - Window handle not found. [FALSE] " );
108 return false ;
109 }
110
111 // IntPtr hwndChild = Win32.FindWindowEx((IntPtr)l_nHandle, IntPtr.Zero, "Button", "&Tisk");
112
113 if (Win32.SendMessage(( int )l_nHandle, Win32.WM_CLOSE, 0 , 0 ) == 0 )
114 log.WriteLn( " - Warning dialog was closed [OK] " );
115 else
116 log.WriteLn( " - Warning dialog wasn't closed [FALSE] " );
117
118 return true ;
119 }
120
121 /// <summary>
122 /// event of timer
123 /// </summary>
124 /// <param name="state"></param>
125 private static void DoTestWarningOODialog( object state)
126 {
127 TimerStateOO lState = (TimerStateOO)state;
128 lState.Count ++ ;
129 log.WriteLn(String.Format( " Actual state timer is {0}: {1} " , lState.EndCount, lState.Count));
130
131 if (lState.Count == lState.EndCount || FindWarningWindow())
132 {
133 log.WriteLn( " - timer was stoped. " );
134 lState.Timer.Dispose();
135 lState.Timer = null ;
136 }
137 }
138 }
139
140 /// <summary>
141 /// Converter to pdf with application OpenOffice
142 /// </summary>
143 sealed public class TOpenOffice : IGExternalConverter
144 {
145 private const string m_csOpenOffice = " OpenOffice " ;
146
147 public TOpenOffice()
148 {
149 AppDomain.CurrentDomain.AssemblyResolve -= _searchAssembly; // cleans up previous events, may not be needed.
150 AppDomain.CurrentDomain.AssemblyResolve += _searchAssembly; // registered the event
151 }
152
153 public static bool Is64bitOS
154 {
155 get { return (Environment.GetEnvironmentVariable( " ProgramFiles(x86) " ) != null ); }
156 }
157
158 private static System.Reflection.Assembly _searchAssembly(Object o, ResolveEventArgs e)
159 {
160 // TODO: overit, odmaZat staticke reference potom!
161 GDebug l_oLog = new GDebug(m_csOpenOffice);
162 l_oLog.WriteLn( " - class: GOpenOffice, method: _searchAssembly(Object o, ResolveEventArgs e) " );
163
164 string l_sName = e.Name.Split( ' , ' )[ 0 ] + " .dll " ;
165 if (l_sName.StartsWith( " cli_ " ))
166 return System.Reflection.Assembly.LoadFrom(GetDirfromRegistry() + @" ToPDF\ " + l_sName);
167 else
168 return null ;
169 }
170
171 private static string GetDirfromRegistry()
172 {
173 try
174 {
175 // TODO: 64bit udelat
176 Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(Is64bitOS ?
177
178 @" SOFTWARE\Wow6432Node\Tyma\SHARED\INSTALL32\ " :
179 @" SOFTWARE\Tyma\SHARED\INSTALL32\ " );
180
181 return (rk != null ) ? (rk.GetValue( " ADRTOPDF " , String.Empty) as string ).Trim() + @" TOPDF\ " :
182
183 String.Empty;
184 }
185 catch
186 {
187 return String.Empty;
188 }
189 }
190
191 private struct SUPPORTED_TYPE
192 {
193 public const string m_csSUPPORTED_TYPES = @" .docx|.doc|.rtf|.txt|.xls|.xlsx|.odt|.sxw| " +
194 " .sdw|.vor|.out|.ods|.ots|.sxc|.stc|.xlt|.odp|.otp|.sxi|.sti|.ppt|.odg|.sxd|.std|.sda| " +
195 " .jpg|.jpeg|.tif|.tiff|.bmp|.png|.gif|.txt|.html|.htm " ;
196
197 /*
198 case ".odt":
199 case ".sxw":
200 case ".sdw":
201 case ".vor":
202 case ".out":
203 case ".ods":
204 case ".ots":
205 case ".sxc":
206 case ".stc":
207 case ".xlt":
208 case ".odp":// open office kresba format
209 case ".otp":
210 case ".sxi":
211 case ".sti":
212 case ".ppt":
213 case ".odg":// open office prezentace format
214 case ".otg":
215 case ".sxd":
216 case ".std":
217 case ".sda":
218 */
219 public const string DOC = " .doc " ;
220 public const string DOCX = " .docx " ;
221 public const string RTF = " .rtf " ;
222 public const string TXT = " .txt " ;
223 public const string XLS = " .xls " ;
224 public const string XLSX = " .xlsx " ;
225 }
226
227 #region Implements method interface IGExternalConverter
228 // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
229 public bool Initialise( out string ErrText, GDebug debug)
230 {
231 ErrText = String.Empty;
232 GDebug l_oLog = new GDebug(m_csOpenOffice);
233
234 try
235 {
236 lock ( this )
237 {
238 GCommon.Init(l_oLog);
239 l_oLog.WriteLn( " ------------------------------------------------------------------------------------
240
241 ------- " );
242 l_oLog.WriteLn( " - Tyma.Support.PDFCreator.dll, class: GOpenOffice, method:
243
244 IGExternalConverter.Initialise " );
245
246 if (GCommon.IsInstalledOO())
247 {
248 l_oLog.WriteLn( " - OpenOffice is instaled [OK] " );
249 return true ;
250 }
251 else
252 {
253 l_oLog.WriteLn( " - is not instaled OpenOffice. [FALSE] " );
254 ErrText = " - is not instaled OpenOffice. [FALSE] " ;
255 return false ;
256 }
257 } // end lock
258 }
259 catch (System.Exception exp)
260 {
261 ErrText = exp.Message;
262 return false ;
263 }
264 }
265
266 public bool IsSupportedType( string extens)
267 {
268 return (SUPPORTED_TYPE.m_csSUPPORTED_TYPES.IndexOf(extens, StringComparison.OrdinalIgnoreCase) >= 0 );
269 }
270
271 public void ToPdf( byte [] sourcedata, string sourcefilename, out byte [] destdata, GDebug debug)
272 {
273 debug.WriteLn( " - PDFCreator: this method is not supported. [FALSE] " );
274 destdata = null ;
275 }
276
277 public void ToPdf( string sourcefile, string destinfile, GDebug debug)
278 {
279 debug.WriteLn( " - PDFCreator: this method is not supported. [FALSE] " );
280 }
281
282 public bool ToPdf( string sourcefile, ref string destinfile, out string errortext)
283 {
284 return all2PDF(sourcefile, ref destinfile, out errortext);
285 }
286
287 public void Done() { }
288 #endregion
289
290
291 /// <summary>
292 /// Starts the open office.
293 /// </summary>
294 /// <returns></returns>
295 private bool StartOpenOffice( out string errortext)
296 {
297 errortext = String.Empty;
298 GDebug l_oLog = new GDebug(m_csOpenOffice);
299
300 try
301 {
302 ProcessStartInfo theProcess = new ProcessStartInfo( " soffice.exe " );
303 theProcess.WindowStyle = ProcessWindowStyle.Hidden;
304 Process.Start(theProcess);
305 l_oLog.WriteLn( " - OpenOffice proces is running. " );
306
307 return true ;
308 }
309 catch (System.Exception exp)
310 {
311 l_oLog.WriteLn( " - OpenOffice proces is not running. EXCEPTION: " + exp.Message);
312 errortext = " - OpenOffice proces is not running. EXCEPTION: " + exp.Message;
313 return false ;
314 }
315 }
316
317 /// <summary>
318 /// convert all support types
319 /// </summary>
320 /// <param name="sourcefile"></param>
321 /// <param name="destinationfile"></param>
322 /// <param name="errortext"></param>
323 /// <returns></returns>
324 public bool all2PDF( string sourcefile, ref string destinationfile, out string errortext)
325 {
326 GDebug l_oLog = new GDebug(m_csOpenOffice);
327 // -----------init log support:
328 GCommon.Init(l_oLog);
329 TimerForOpenOffice.Init(l_oLog);
330 // ----------------------------
331
332
333 l_oLog.WriteLn( " ------------------------------ " );
334 l_oLog.WriteLn( " - Converter2PDFWidthOO.all2pdf " );
335 errortext = String.Empty;
336
337 string l_sExtension = System.IO.Path.GetExtension(sourcefile);
338 l_oLog.WriteLn( " - converting type file: " + l_sExtension);
339
340 switch (l_sExtension.ToLower())
341 {
342 case " .docx " :
343 case " .doc " :
344 case " .rtf " :
345 case " .odt " :
346 case " .sxw " :
347 case " .sdw " :
348 case " .vor " :
349 case " .html " :
350 case " .txt " :
351 case " .jpg " :
352 case " .tif " :
353 case " .bmp " :
354 case " .png " :
355 case " .gif " :
356 case " .xls " :
357 case " .ods " :
358 case " .ots " :
359 case " .sxc " :
360 case " .stc " :
361 case " .xlt " :
362 case " .odp " : // open office kresba
363 case " .otp " :
364 case " .sxi " :
365 case " .sti " :
366 case " .ppt " :
367 case " .odg " : // open office prezentace
368 case " .otg " :
369 case " .sxd " :
370 case " .std " :
371 case " .sda " :
372
373 return file2pdf(sourcefile, ref destinationfile, out errortext);
374
375 default :
376 errortext = " Daný typ souboru ke konverzi není podporován. " ;
377 return false ;
378 }
379 }
380
381 private bool file2pdf( string sourcefilename, ref string destinationfile, out string errortext)
382 {
383 GDebug l_oLog = new GDebug(m_csOpenOffice);
384 l_oLog.WriteLn( " - ----------------------------- " );
385 l_oLog.WriteLn( " - GConverter2PDFWithOO.file2pdf " );
386
387 errortext = String.Empty;
388
389 lock ( this )
390 {
391 try
392 {
393 StartOpenOffice( out errortext);
394
395 // Get a ComponentContext
396 unoidl.com.sun.star.uno.XComponentContext xLocalContext = uno.util.Bootstrap.bootstrap();
397 // Get MultiServiceFactory
398 unoidl.com.sun.star.lang.XMultiServiceFactory xRemoteFactory =
399
400 (unoidl.com.sun.star.lang.XMultiServiceFactory)xLocalContext.getServiceManager();
401
402 // Get a CompontLoader
403 XComponentLoader aLoader = (XComponentLoader)xRemoteFactory.createInstance
404
405 ( " com.sun.star.frame.Desktop " );
406 l_oLog.WriteLn( " - init Loader. [OK] " );
407
408 // Load the sourcefile
409 XComponent xComponent = initDocument(aLoader, PathConverter(sourcefilename), " _blank " );
410 l_oLog.WriteLn( " - init document. [OK] " );
411
412 // Wait for loading
413 while (xComponent == null )
414 {
415 System.Threading.Thread.Sleep( 500 );
416 }
417
418 destinationfile = System.IO.Path.GetDirectoryName(sourcefilename) + destinationfile + " .tmp " ;
419 // sourcefilename
420
421 saveDocument(xComponent, PathConverter(destinationfile));
422 // Wait for input
423 l_oLog.WriteLn( " - conversation completed! [OK] " );
424
425 // Close OpenOffice
426 xComponent.dispose();
427 xComponent = null ;
428
429 XDesktop xDesk = (XDesktop)aLoader;
430 xDesk.terminate();
431
432 GC.Collect();
433 GC.WaitForPendingFinalizers();
434 l_oLog.WriteLn( " - application OO is closed. [OK] " );
435
436 return true ;
437 }
438
439 /*
440 catch (unoidl.com.sun.star.uno.Exception exp)
441 {
442 throw exp;
443 }
444 */
445
446 catch (System.Exception exp)
447 {
448 l_oLog.WriteLn( " - OpenOffice [FALSE] err: " + exp.Message);
449 errortext = exp.Message;
450 return false ;
451 }
452
453 } // end lock
454 }
455
456 /// <summary>
457 /// Load a given file or create a new blank file
458 /// </summary>
459 /// <param name="aLoader"> A ComponentLoader </param>
460 /// <param name="file"> The file </param>
461 /// <param name="target"> The target </param>
462 /// <returns> Th Component </returns>
463 private XComponent initDocument(XComponentLoader aLoader, string file, string target)
464 {
465 unoidl.com.sun.star.beans.PropertyValue[] Args = new unoidl.com.sun.star.beans.PropertyValue[ 1 ];
466 Args[ 0 ] = new unoidl.com.sun.star.beans.PropertyValue();
467 Args[ 0 ].Name = " Hidden " ;
468 Args[ 0 ].Value.setValue( typeof (Boolean), true );
469
470 XComponent xComponent = aLoader.loadComponentFromURL(file, target, 0 , Args);
471 return xComponent;
472 }
473
474 /// <summary>
475 /// Convert into OO file format
476 /// </summary>
477 /// <param name="file"> The file. </param>
478 /// <returns> The converted file </returns>
479 private string PathConverter( string file)
480 {
481 try
482 {
483 GDebug l_oLog = new GDebug(m_csOpenOffice);
484 l_oLog.WriteLn( " - there is tmp file: " + file);
485 file = file.Replace( @" \ " , " / " );
486
487 return " file:/// " + file;
488 }
489 catch (System.Exception ex)
490 {
491 throw ex;
492 }
493 }
494
495 /// <summary>
496 /// Saves the document.
497 /// </summary>
498 /// <param name="xComponent"> The x component. </param>
499 /// <param name="fileName"> Name of the file. </param>
500 private void saveDocument(XComponent xComponent, string fileName)
501 {
502 Thread l_oVlakno = null ;
503 GDebug l_oLog = new GDebug(m_csOpenOffice);
504
505 try
506 {
507 unoidl.com.sun.star.beans.PropertyValue[] propertyValue = new unoidl.com.sun.star.beans.PropertyValue[ 1 ];
508
509 propertyValue[ 0 ] = new unoidl.com.sun.star.beans.PropertyValue();
510 propertyValue[ 0 ].Name = " FilterName " ;
511 propertyValue[ 0 ].Value = new uno.Any( " writer_pdf_Export " );
512
513
514 // timer zjistuje zda se neobjevi dialog s warovanim pri prevodu, pokud ano obsluha zajisti stisk
515
516 tlacitka OK
517 l_oVlakno = new Thread(TimerForOpenOffice.RunTimer);
518 l_oVlakno.Start();
519 ((XStorable)xComponent).storeToURL(fileName, propertyValue);
520 }
521 catch (System.Exception exp)
522 {
523 l_oLog.WriteLn(exp.Message);
524 throw new System.Exception( " Exception in saveDocument. " );
525 }
526 finally
527 {
528 TimerForOpenOffice.StopTimer();
529 l_oVlakno.Abort(); // aby se vlakno dalo zastavit tak se musi zastavit v nem bezici timer
530 }
531 }
532 }
533 }