

<!--#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 itemprop="name" content="Download Apache OpenOffice" />
  <meta itemprop="description" content="Join the OpenOffice revolution, the free office productivity suite with over 375 million trusted downloads." />
  <meta itemprop="image" content="https://www.openoffice.org/images/AOO_logos/AOO-Logo-Download.png" />
  <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 Downloads - Official Site</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_ca.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%2Fca%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="/brand.html" -->
    <div id="topbara">
      <!--#include virtual="/topnav.html" -->
      <div id="breadcrumbsa"><a href="/">home</a>&nbsp;&raquo;&nbsp;<a href="/ca/">ca</a>&nbsp;&raquo;&nbsp;<a href="/ca/download/">download</a></div>
    </div>
    <div id="clear"></div>
      
      
    <div id="content">
      
      

<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>
