

<!--#include virtual="/doctype.html" -->
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <link href="/css/ooo.css" rel="stylesheet" type="text/css">
    
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta property="og:title" content="Download Apache OpenOffice" />
  <meta property="og:description" content="Join the OpenOffice revolution, the free office productivity suite with over 375 million trusted downloads." />
  <meta property="og:image" content="https://www.openoffice.org/images/AOO_logos/AOO-Logo-Download.png" />
  <meta name="description" content="Official Apache OpenOffice download page. Join the OpenOffice revolution, the free office productivity suite with over 375 million trusted downloads." />
  <title>Apache OpenOffice 다운로드 - 공식 웹사이트</title>
  <script type="text/javascript" src="/download/globalvars.js"></script>
  <script type="text/javascript" src="/download/msg_prop_l10n_en.js"></script>
  <script type="text/javascript" src="./msg_prop_l10n_ko.js"></script>
  <script type="text/javascript" src="/download/languages.js"></script>
  <script type="text/javascript" src="/download/release_matrix.js"></script>
  <script type="text/javascript" src="/download/boxed_download.js"></script>
  <script type="text/javascript" src="/download/download.js"></script>
  <style type="text/css">
  /* <![CDATA[ */
  /*-------------------- Exceptions on standard css -----------------------*/
  @import "/download/styles.css";
  @import "/download/exceptions.css";
  /* ]]> */
  </style>
  <script>
    if ( window.document.referrer.indexOf( "shell.windows.com" ) != -1 ) {
       location.href = "/why/why_odf.html";
    }

    function share( platform ) {
      // _gaq.push( ['_trackEvent', 'social', 'shareDownload', platform] );

      if ( platform == 'apacheblog' ) {
        window.open( 'https://blogs.apache.org/OOo/', '_blank' );
      } else if ( platform == 'facebook' ) {
        window.open( 'https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.openoffice.org%2Fdownload%2F', '_blank', 'toolbar=0, status=0, width=580, height=325' );
      } else if ( platform == 'twitter' ) {
        window.open( 'https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.openoffice.org%2Fko%2Fdownload%2F&text=Join+the+OpenOffice+revolution%2C+the+free+office+productivity+suite+with+over+375+million+trusted+downloads.', '_blank', 'toolbar=0, status=0, width=580, height=325' );
      }
    }
  </script>

    
    <script src="https://www.apachecon.com/event-images/snippet.js"></script>
  </head>
  <body>
    <!--#include virtual="/ko/brand.html" -->
    <div id="topbara">
      <!--#include virtual="/ko/topnav.html" -->
      <div id="breadcrumbsa"><a href="/">home</a>&nbsp;&raquo;&nbsp;<a href="/ko/">ko</a>&nbsp;&raquo;&nbsp;<a href="/ko/download/">download</a></div>
    </div>
    <div id="clear"></div>
      
      
    <div id="content">
      
      

<div itemscope>
  <span itemprop="name" content="Download Apache OpenOffice"></span>
  <span itemprop="description" content="Join the OpenOffice revolution, the free office productivity suite with over 375 million trusted downloads."></span>
  <span itemprop="keywords" content="Apache OpenOffice, OpenOffice, Apache Open Office, Download, Official, Official Download, Open Office, OpenOffice.org"></span>
  <span itemprop="image" content="https://www.openoffice.org/images/AOO_logos/AOO-Logo-Download.png"></span>
</div>

<div class="overall_optionset">

  <div class="optionset">

    <!-- Text above the first colored box -->
    <script type="text/javascript">
    <!--
    // The text in the H1 tag is intentionally shown as "display: none" (do not display).
    // This is to please accessibility tools like a screen reader.
    document.write( "<h1 style='display: none;'>" + l10n.dl_headline_text + "</h1>" );
    //-->
    </script>

    <!-- Green: Stable release -->
    <!-- Download via select boxes -->
    <script type="text/javascript">
    <!--

    // Set a specific language ISO code to force to assemble a certain localized build as download link.
    // Changed: The variable can now be found in the "msg_prop_l10n_<ISO_code>.js".

    // Get the download box from a separate file.
    DL.createDownloadBox();

    // Fill the select boxes and wait for the user's choice.
    DL.init( 1 );

    // entourage.initialize();

    //-->
    </script>

    <!-- Green: Stable release: No JavaScript enabled -->
    <noscript>
    <div class="first button green-sel" id="optionitem2">
      <div class="green-sel-icon"></div>
      <h2>
        <a style="cursor: pointer;" href="https://sourceforge.net/projects/openofficeorg.mirror/files/"
          title="Select from all platforms, languages, language packs to download">
          Apache OpenOffice Downloads - Official Site
        </a>
      </h2>
      <p>
        <a style="cursor: pointer;" href="https://sourceforge.net/projects/openofficeorg.mirror/files/"
          title="Select from all platforms, languages and language packs to download">The browser seems to have JavaScript
          disabled. This technique is used for showing the actual download link. If you want to download Apache
          OpenOffice anyway, click this text to choose from the alternative download webpage. You will have to navigate to
          the <em>version</em>/binaries/<em>language</em> subfolder and download the file named
          Apache_OpenOffice_<em>version</em>_<em>os</em>_<em>platform</em>_<em>package</em>_<em>language</em>.<em>ext</em>.
          Our apologies for the inconvenience.
        </a>
      </p>
    </div>
    </noscript>

    <!-- Light Blue: Share download with social networks -->
    <script type="text/javascript">
    <!--
    // Get the share box from a separate file.
    DL.createShareBox();
    //-->
    </script>

    <!-- Blue: Extensions -->
    <script type="text/javascript">
    <!--
    // Get the extensions box from a separate file.
    DL.createExtensionsBox();
    //-->
    </script>

    <!-- Blue: Templates -->
    <script type="text/javascript">
    <!--
    // Get the templates box from a separate file.
    DL.createTemplatesBox();
    //-->
    </script>

  </div> <!-- class "optionset" -->

  <div class="additionalinformation">

    <!-- Navigation bar -->
    <script type="text/javascript">
    <!--
    // Get the navigation bar from a separate file.
    DL.createNavigationBar();
    //-->
    </script>

    <br /><br />

    <!-- Logo section -->
    <script type="text/javascript">
    <!--
    // Get the logo section from a separate file.
    DL.createLogoSection();
    //-->
    </script>

  </div> <!-- class: additionalinformation -->

</div> <!-- class: overall_optionset -->


      
    </div>
    <!--#include virtual="/footer.html" -->
  </body>
</html>
