Java로 OpenOffice를 불러오기

atie의 이미지

한글 오픈오피스 쪽에도 질문을 올렸지만 그 쪽의 사용자 수가 적어 여기에도 같은 질문을 올려 봅니다. 제가 뭘 하려는지 밑의 링크를 보시면 되겠고.
http://oooko.net/forums/viewtopic.php?t=281
오픈 오피스에서 제공하는 개발자 애플릿 예제는 이것입니다.

import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JTextField;

import com.sun.star.comp.beans.OOoBean;

/** A simple Applet that contains the SimpleBean.
*
* This applet is a sample implementation of the 
* OpenOffice.org bean. 
* When initally loaded the applet has two buttons
* one for opening an existant file and one to open 
* a blank document of a given type supported by
* OpenOffice.org eg. Writer, Calc, Impress, .....
*
*/

@SuppressWarnings("serial")
public class OOoBeanViewer extends java.applet.Applet
{
  
  /**
   * Private variables declaration - GUI components
   */
  private java.awt.Panel rightPanel;
  private java.awt.Panel bottomPanel;
  private javax.swing.JButton closeButton;
  private javax.swing.JButton terminateButton;
  private javax.swing.JButton newDocumentButton;
  private javax.swing.JPopupMenu documentTypePopUp;
  private javax.swing.JCheckBox menuBarButton;
  private javax.swing.JCheckBox mainBarButton;
  private javax.swing.JCheckBox toolBarButton;
  private javax.swing.JCheckBox statusBarButton;
  private javax.swing.JButton storeDocumentButton;
  private javax.swing.JButton loadDocumentButton;
  private javax.swing.JButton syswinButton;
  private JTextField documentURLTextField;
  private JMenuItem item;
  @SuppressWarnings("unused")
  private JFileChooser fileChooser;
  private byte buffer[];

  /**
   * Private variables declaration - SimpleBean variables
   */
  private OOoBean aBean;

  /**
   * Initialize the Appplet
   */
  @SuppressWarnings("deprecation")
public void init()
  {
		//The aBean needs to be initialized to add it to the applet
		aBean = new OOoBean(); 
      
       //Initialize GUI components
       rightPanel = new java.awt.Panel();
       bottomPanel = new java.awt.Panel();
       closeButton = new javax.swing.JButton("close");
       terminateButton = new javax.swing.JButton("terminate");
       newDocumentButton = new javax.swing.JButton("new document...");
       documentTypePopUp = new javax.swing.JPopupMenu();
       storeDocumentButton = new javax.swing.JButton("store to buffer");
       loadDocumentButton = new javax.swing.JButton("load from buffer");
       syswinButton = new javax.swing.JButton("release/aquire");

       menuBarButton = new javax.swing.JCheckBox("MenuBar");
		menuBarButton.setSelected( aBean.isMenuBarVisible() );
		
       mainBarButton = new javax.swing.JCheckBox("MainBar");
		mainBarButton.setSelected( aBean.isStandardBarVisible() );

       toolBarButton = new javax.swing.JCheckBox("ToolBar");
		toolBarButton.setSelected( aBean.isToolBarVisible() );

       statusBarButton = new javax.swing.JCheckBox("StatusBar");
		statusBarButton.setSelected( aBean.isStatusBarVisible() );

       documentURLTextField = new javax.swing.JTextField();
     
       //Set up the Popup Menu to create a blank document
       documentTypePopUp.setToolTipText("Create an empty document");
       
       item = documentTypePopUp.add("Text Document");
       item.addActionListener(new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               createBlankDoc("private:factory/swriter", 
                   "New text document");
           }
       });

       item = documentTypePopUp.add("Presentation Document");
       item.addActionListener(new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               createBlankDoc("private:factory/simpress", 
                   "New presentation document");
           }
       });

       item = documentTypePopUp.add("Drawing Document");
       item.addActionListener(new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               createBlankDoc("private:factory/sdraw", 
                  "New drawing document");
           }
       });

       item = documentTypePopUp.add("Formula Document");
       item.addActionListener(new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               createBlankDoc("private:factory/smath", 
                   "New formula document");
           }
       });

       item = documentTypePopUp.add("Spreadsheet Document");
       item.addActionListener(new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               createBlankDoc("private:factory/scalc", 
                   "New spreadsheet document");
           }
       });

       syswinButton.addActionListener(
				new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
				try 
				{
					aBean.releaseSystemWindow();
					aBean.aquireSystemWindow();
				}
				catch ( com.sun.star.comp.beans.NoConnectionException aExc )
				{}
				catch ( com.sun.star.comp.beans.SystemWindowException aExc )
				{}
			}
      });

       storeDocumentButton.addActionListener(
				new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
				try 
				{
					buffer = aBean.storeToByteArray( null, null );
				}
				catch ( Throwable aExc )
				{ 
					System.err.println( "storeToBuffer failed: " + aExc ); 
					aExc.printStackTrace( System.err );
				}
			}
      });

       loadDocumentButton.addActionListener(
				new java.awt.event.ActionListener()
       {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
				try 
				{
					aBean.loadFromByteArray( buffer, null );
				}
				catch ( Throwable aExc )
				{ 
					System.err.println( "loadFromBuffer failed: " + aExc ); 
					aExc.printStackTrace( System.err );
				}
			}
      });

      closeButton.addActionListener(new java.awt.event.ActionListener()
      {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               close();
           }
      });

      terminateButton.addActionListener(new java.awt.event.ActionListener()
      {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               terminate();
           }
      });

      newDocumentButton.addActionListener(new java.awt.event.ActionListener()
      {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
               documentTypePopUp.show((java.awt.Component)evt.getSource(), 0,0);
           }
      });

      menuBarButton.addActionListener(new java.awt.event.ActionListener()
      {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
				aBean.setMenuBarVisible( !aBean.isMenuBarVisible() );
           }
      });

      mainBarButton.addActionListener(new java.awt.event.ActionListener()
      {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
				aBean.setStandardBarVisible( !aBean.isStandardBarVisible() );
           }
      });

      toolBarButton.addActionListener(new java.awt.event.ActionListener()
      {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
				aBean.setToolBarVisible( !aBean.isToolBarVisible() );
           }
      });

      statusBarButton.addActionListener(new java.awt.event.ActionListener()
      {
           public void actionPerformed(java.awt.event.ActionEvent evt)
           {
				aBean.setStatusBarVisible( !aBean.isStatusBarVisible() );
           }
      });

      documentURLTextField.setEditable(false);
      documentURLTextField.setPreferredSize(new java.awt.Dimension(200, 30));

      rightPanel.setLayout( new java.awt.GridLayout(10,1) );
      rightPanel.add(closeButton);
      rightPanel.add(terminateButton);
      rightPanel.add(newDocumentButton);
      rightPanel.add(storeDocumentButton);
      rightPanel.add(loadDocumentButton);
      rightPanel.add(syswinButton);
      rightPanel.add(menuBarButton);
      rightPanel.add(mainBarButton);
      rightPanel.add(toolBarButton);
      rightPanel.add(statusBarButton);

      //bottomPanel.setLayout( new java.awt.GridLayout(1,1) );
      bottomPanel.setLayout( new java.awt.BorderLayout() );
      bottomPanel.add(documentURLTextField);

      setLayout(new java.awt.BorderLayout());

      add(aBean, java.awt.BorderLayout.CENTER);
      add(rightPanel, java.awt.BorderLayout.EAST);
      add(bottomPanel, java.awt.BorderLayout.SOUTH);
  }

  /**
   * Create a blank document of type <code>desc</code>
   *
   * @param url The private internal URL of the OpenOffice.org
   *            document describing the document
   * @param desc A description of the document to be created
   */
  private void createBlankDoc(String url, String desc)
  {
		//Create a blank document
		try
		{
           documentURLTextField.setText(desc);
           //Get the office process to load the URL
           aBean.loadFromURL( url, null );

	   		aBean.aquireSystemWindow(); 
		}
		catch ( com.sun.star.comp.beans.SystemWindowException aExc )
     	{
			System.err.println( "OOoBeanViewer.1:" );
  			aExc.printStackTrace();
		}
		catch ( com.sun.star.comp.beans.NoConnectionException aExc )
		{
			System.err.println( "OOoBeanViewer.2:" );
			aExc.printStackTrace();
		}
		catch ( Exception aExc )
		{
			System.err.println( "OOoBeanViewer.3:" );
			aExc.printStackTrace();
			//return;
		}
   }

	/** closes the bean viewer, leaves OOo running.
	 */
  private void close()
  {
			setVisible(false);
			aBean.stopOOoConnection(); 
			stop();
			System.exit(0);
  }

	/** closes the bean viewer and tries to terminate OOo.
	 */
  private void terminate()
  {
			setVisible(false);
			com.sun.star.frame.XDesktop xDesktop = null;
			try {
				xDesktop = aBean.getOOoDesktop();
			}
			catch ( com.sun.star.comp.beans.NoConnectionException aExc ) {} // ignore
			aBean.stopOOoConnection(); 
			stop();
			if ( xDesktop != null )
				xDesktop.terminate();
			System.exit(0);
  }

  /**
   * An ExitListener listening for windowClosing events
   */
  private class ExitListener extends java.awt.event.WindowAdapter
  {
       /**
        * windowClosed
        * 
        * @param e A WindowEvent for a closed Window event
        */
       public void windowClosed( java.awt.event.WindowEvent e)
       {
			close();
       }

       /**
        * windowClosing for a closing window event
        *
        * @param e A WindowEvent for a closing window event
        */
       public void windowClosing( java.awt.event.WindowEvent e)
       {
           ((java.awt.Window)e.getSource()).dispose();
       }
  }

  @SuppressWarnings("deprecation")
public static void main(String args[])
  {
      java.awt.Frame frame = new java.awt.Frame("OpenOffice.org Demo");
      OOoBeanViewer aViewer = new OOoBeanViewer();

      frame.setLayout(new java.awt.BorderLayout());

      frame.addWindowListener( aViewer.new ExitListener() );

      aViewer.init();
      aViewer.start();

      frame.add(aViewer);
      frame.setLocation( 200, 200 );
      frame.setSize( 800, 480 );
      frame.show();
  }
}


컴파일에 필요한 jar 파일들은 우분투의 경우는 /usr/share/java/openoffice2/ 밑에 있고, 실행에 필요한 파일들은 /usr/lib/openoffice2/program/ 밑에 있습니다.

사용하시는 리눅스에서 테스트를 해 봐주시고 결과를 알려 주시면 고맙겠습니다. 제 경우는 C [lib-gnu-java-awt-peer-gtk.so.6+0x4df5b] gdk_env+0x1b 여기서 JVM crash가 납니다.

File attachments: 
첨부파일 크기
Image icon SWT-OOo2.png121.36 KB
Image icon Applet-OOo2.png116.99 KB
Image icon oooswt.png268.15 KB
Image icon oooapplet.png214.05 KB
Image icon ooo2-appet.png172.09 KB
atie의 이미지

일단은 다른 os에서의 동작을 보기위해 xp에다 OOo2 rc2를 설치를 하고 위의 예제를 수행시킨 결과입니다. 아무 문제없이 동작을 하므로, 위의 문제는 우분투의 so파일들의 문제일 것으로 추측을 하는데, rc2 버전을 기존의 패키지를 고려하여 테스트를 위한 설치를 하는 것이 압박입니다.
페도라 등의 다른 배포판 쓰시는 분들 중에 테스트 해 주실 분이 있으면 고맙겠습니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트
Image icon 0바이트

----
I paint objects as I think them, not as I see them.
atie's minipage

lunarboy의 이미지

한소리 2005, JDK 1.5_04, Eclipse 3.1.1, ooo 2.0RC2입니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트
Image icon 0바이트
atie의 이미지

저도 OOo2 rc2를 우분투에 설치하여 일단 문제는 해결을 하였습니다. 우분투 정식 패키지로는 rc2 이상이 업데이트 될 때 다시 테스트를 해야겠습니다.

ps 1. drzzang님과 jeongkyu님, 고맙습니다.
ps 2. OOo2 cvs를 보다 보니 eclipse와 netbean에 integration 하는 플러그인 코드가 보이던데 그것을 살펴 봐야 하겠습니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트

----
I paint objects as I think them, not as I see them.
atie's minipage

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.