Welcome to The Document Foundation Planet

This is a feed aggregator that collects what LibreOffice and Document Foundation contributors are writing in their respective blogs.

To have your blog added to this aggregator, please mail the website@global.libreoffice.org mailinglist or file a ticket in Redmine.


Saturday
06 December, 2025


[en] Michael Meeks: 2025-12-06 Saturday

21:00 UTC

face
  • Up earlyish, out to All Saints to play Guitar for a fun Local Houses of Prayer (LHOP) kick-off meeting. Home early.
  • Plugged away at E-mail, lunch with H. and E., slugged a bit. Back to the mail & admin backlog.
  • J. returned home, hair-cut, prepared music for evening service tomorrow.

face

La Conferencia Global de LibreOffice 2026 se llevará a cabo en Pordenone, Italia, organizada por el PNlug (Grupo de Usuarios de Linux de Pordenone) y la Universidad de Pordenone, dentro del campus universitario. El evento comenzará el jueves 9 de septiembre y finalizará la mañana del sábado 11 de septiembre,


face

A modern C++ wrapper for the Firebird database API.Documentation | Repositoryfb-cpp provides a clean, modern C++ interface to the Firebird database engine. It wraps the Firebird C++ API with RAII principles, smart pointers, and modern C++ features.Features Modern C++: Uses C++20 features for type safety and performanceRAII: Automatic resource management with smart pointersType Safety:


Friday
05 December, 2025


[en] Michael Meeks: 2025-12-05 Friday

21:00 UTC

face
  • Mail chew, worked through a growing admin backlog. Great TTT from Kendy on Collabora Office on Mac.
  • Published the next strip on trying to please everyone:
    The Open Road to Freedom - strip#46 - trying to please everyone
  • Couple of partner calls, sync with Miklos, worked late.

face

LibreOffice Conference 2026 in Pordenone, Italy, and LibreOffice Conference 2027 in Gothenburg, Sweden LibreOffice Conference 2026 will be organised by PNlug (Pordenone Linux User Group) and the University of Pordenone in the city of Pordenone, on the university campus. The conference will begin on Thursday, 10 September and will end


Thursday
04 December, 2025


face

After submitting a patch to LibreOffice Gerrit, one has to wait for the continuous integration (CI) to build and test the changed source code to make sure that the build is OK and the tests pass successfully. Here we discuss the situation when one or more CI builds fail, and how to handle that.

Why Build and Test on CI?

After you submit code to LibreOffice Gerrit, reviewers have to make sure that it builds, and the tests pass with the new source code. But, it is not possible for the reviewers to test the code on each and every platform that LibreOffice supports. Therefore, Jenkins CI does that job of building and testing LibreOffice on various platforms.

This can take a while, usually 1 hour or so, but sometimes can take longer than that. If everything is OK, then your submission will get     Verified +1    .

CI Platforms for LibreOffice

Currently, these are the platforms used in CI:

  • Linux / GCC:  gerrit_linux_gcc_release
  • Linux / Clang: gerrit_linux_clang_dbgutil
  • Android Viewer: gerrit_android_x86_64 and gerrit_android_arm
  • Windows: gerrit_windows_wsl
  • macOS: gerrit_mac

Some of the tests are more extensive, for example Linux / Clang also performs additional code quality checks with clang compiler plugins. Also, UITests are not run on each and every platform.

Jenkins LibreOffice CI

LibreOffice CI uses Jenkins

Why Failures Happen and How to Fix?

There can be multiple reasons for why a CI build fails, and give your submission    Verified -1   . These are some of the reasons, and depending on the reason, solution can be different.

1. Your code’s syntax is wrong and compile fails

In this case, you should fix your code, and then submit a new patch set. You have to wait again for a new CI build.

2. The code’s syntax is OK, but it is not properly formatted

You should refer to the below TDF Wiki article and use clang-format tool to format your code properly.

3. Your code’s syntax is OK, but it logically not OK and fails some tests.

In this case, you should try fixing your code logic, and run the tests that fail and make sure they pass. After that, you may send a new patch set and wait for a new CI build.

4. Your code’s syntax and logic is OK, but some machine fails for other reasons like their disk being full or other software/hardware failures or hiccups

In this case, usually resuming the build can be a good option. You may ask on #libreoffice-dev or #tdf-infra IRC rooms for such a resume, or request access, if you submit many patches.

Resume CI build

Resume build in LibreOffice CI

5. Your code’s syntax and logic is OK, but there are issues from other patches.

In this case, intervention from other LibreOffice developers is needed. Informing people on #libreoffice-dev can help, and then you have to re-base your submission in case new patches fix the build issue.

Final Notes

The best way to know the reason of the build failure is to look into


[en] Michael Meeks: 2025-12-04 Thursday

21:00 UTC

face
  • Mail chew, tech. planning call, new Collabora Office launch retrospective call. Lunch.
  • Sync with Lily, Laser, partner slide sync, drove to Cambridge, good to catch-up with people, finance team call. Christmas dinner with lots of the wider Collabora team, good to meet Tina.

face

The Document Foundation (TDF), la organización sin fines de lucro detrás de LibreOffice, continúa fortaleciendo su equipo de desarrollo con nuevos roles orientados a mejorar el diseño y la experiencia de usuario del proyecto. Hoy, nos complace presentar a Dan Williams, quien se suma a TDF para trabajar en mejoras


face

I fetched the release notes for FirebirdSQL/php-firebird and made a concise summary of the user-visible changes and upgrade impact for versions from PHP Firebird 5.0.2 up through 6.1.1-RC.2.I retrieved the release entries for 5.0.2, 6.1.1-RC.0, 6.1.1-RC.1 and 6.1.1-RC.2 and distilled the highlights and upgrade impact into a short, actionable summary below.Summary of changes (5.0.2 → 6.1.1-RC.2)-


face

The Document Foundation is the small non-profit entity behind LibreOffice. It oversees the project and community, and is now expanding with new developer roles. So let’s say hello to Dan Williams, who joins the team to work on design and user interface (UI) improvements, with an initial focus on macOS:


face

The Firebird Book, Second Edition is made publicly available via the IBPhoenix digital store. Everyone can download the complete edition free of charge — no strings attached.If you'd like to support Helen’s legacy and the Firebird community, there is an optional pay‑what‑you‑like contribution. Funds will support the organization of the Helen Borrie Memorial Award, recognizing individuals with


Wednesday
03 December, 2025


[en] Michael Meeks: 2025-12-03 Wednesday

21:00 UTC

face
  • Early partner call, sync with Dave, then Ben, then Patrick & Kevin.
  • E's maths progress review call. Interview, weekly sales call, sync with Philippe.
  • All Saints band practice in the evening.

face

LibreOffice 26.2 will be released as final at the beginning of February, 2026 ( Check the Release Plan ) being LibreOffice 26.2 Alpha1 the first pre-release since the development of version 26.2 started at the beginning of June, 2025. Since then, 4651 commits have been submitted to the code repository and 676 bugs were set to FIXED in Bugzilla. Check the release notes to find the new features included in this version of LibreOffice.

LibreOffice 26.2 Alpha1 can be downloaded for Linux, macOS and Windows, and it can be installed alongside the standard version.

In case you find any problem in this pre-release, please report it in Bugzilla ( You just need a legit email account in order to create a new account ).

For help, you can contact the QA Team directly in the QA IRC channel or via Matrix.

LibreOffice is a volunteer-driven community project, so please help us to test – we appreciate it!

Happy testing!!

Download it now!


face

Writer recently got a new markdown import option to take styles from a template, leading to much prettier output when converting markdown to PDF, DOCX or ODT.

This work is primarily for Collabora Online, but the templating feature is available in desktop Writer as well.

Motivation

A previous post mentioned recent improvements to the markdown import/export in Writer.

But if you convert some markdown to e.g. PDF, all the headings just have the default look, wouldn't it be nice to take your organization template and add colors and other formatting there, automatically?

Also, wouldn't it be nice if you could paste as markdown in COOL or copy the current selection as markdown? Which would enable all sorts of interesting use-cases, like using an external API to turn the selection into a summary or translating it to a different language.

Results so far

Here is a sample input markdown:

# heading 1

body text

Here is how it looks like if you template it using the core.git sw/qa/filter/md/data/template.docx sample:

PDF result: templated

curl invocation for this:

curl -k -F "data=@/path/to/test.md" -F "template=@/path/to/template.docx" -F "format=pdf" -o out.pdf https://localhost:9980/cool/convert-to

Or example desktop command-line:

soffice --infilter='Markdown:{"TemplateURL":{"type":"string","value":"./template.ott"}}' test.md

While it would look like this by default:

PDF result: default

The other part is the PostMessage API of COOL, if you want to copy and paste as markdown. What's newly possible:

  • Copy the current selection: set MessageId to Action_Copy and the value to {"Mimetype": "text/markdown;charset=utf-8"}
  • Paste at the current cursor position: set MessageId to Action_Paste and the value to something like {"Mimetype": "text/markdown;charset=utf-8", "Data": "foo _bar_ baz"}

You can read more about the PostMessage API in the COOL SDK.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

As usual, the high-level problem was addressed by a series of small changes. Core side:

Online side:

Want to start using this?

You can get a development edition of Collabora Online 25.04 and try it out yourself right now: try the development edition. Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect the core of this


Tuesday
02 December, 2025


[en] Michael Meeks: 2025-12-02 Tuesday

21:00 UTC

face
  • Up early, new Collabora Office team call - nice. Planning call, sync with Laser, lunch.
  • Call with Jim, sync with Anna, chart team call, sync with Laser.

Sunday
16 November, 2025


face

avtor: Italo Vignoli (objavljeno 14. novembra 2025 v LibreOffice, Open Document Format)

Digitalna suverenost ali sposobnost narodov, organizacij in posameznikov, da nadzirajo svojo digitalno usodo je temeljno vprašanje 21. stoletja. V središču tega izziva je na vi dez nepomembno vprašanje: kdo nadzira vrsto zapisa dokumentov, ki vsebujejo našo intelektualno lastnino ali osebne podatke?


V tem kontekstu je standardni in odprti zapis Open Document Format (ODF) – izvorni zapis dokumentov LibreOffice, ki ga podpirajo tudi drugi paketi – temeljna tehnologija za tiste, ki si prizadevajo za resnično digitalno neodvisnost.
Digitalna suverenost vključuje sposobnost nadzora dostopa do lastnih informacij brez odvisnosti od tretjih oseb, neodvisno izbiro tehnologije na podlagi lastnih potreb, zagotavljanje neodvisnega dostopa do strateških podatkov brez odvisnosti od komercialnih interesov velikih tehnoloških podjetij in ohranjanje te tehnološke samoodločbe kljub konsolidaciji trga.
Ko vladne agencije, podjetja ali državljani shranjujejo svoje dokumente v lastniških zapisih, ki jih nadzirajo velika tehnološka podjetja, se odpovedujejo delu svoje suverenosti in so odvisni od teh zunanjih subjektov za dostop do lastnih informacij.

Zakaj so zapisi dokumentov pomembni za suverenost

Oblika zapisa dokumentov je infrastruktura, ki je – podobno kot ceste, električna omrežja ali telekomunikacijska omrežja – temeljna za delovanje sodobnih družb. Premislite, kaj se zgodi, ko strateški dokumenti obstajajo le v zapisih, ki jih nadzira en sam ponudnik:
  • zavezanost ponudniku: organizacije se znajdejo v pasti, saj ne morejo preiti na alternativno programsko opremo brez dragih procesov pretvorbe in morebitne izgube podatkov.
  • izguba nadzora: oblike zapisa se lahko spremenijo brez predhodnega obvestila in brez nadzora uporabnikov, kar poveča učinek zavezanosti ponudniku.
  • ranljivost dostopa: če dobavitelj, ki nadzira obliko zapisa, spremeni zapis ali preneha z njegovo podporo, kot se je zgodilo v primeru Windows 10, dostop do dokumentov postane problematičen ali nemogoč.
  • ekonomska odvisnost: stroški licence, potrebne za izvajanje posodobitev programske opreme, ustvarjajo odnos ekonomske odvisnosti za dostop do lastnih podatkov in dejansko prenašajo lastništvo nad podatki na dobavitelja, ki nadzira obliko zapisa.

Zakaj je ODF edino orodje za digitalno suverenost?

Z ODF upravlja OASIS, mednarodna organizacija za standardizacijo, ki varuje njegov pregleden razvoj. Objavljen je kot standard ISO/IEC 26300-2015 (in kmalu ISO/IEC 26300-2025). Za razliko od lastniških oblik zapisa so specifikacije ODF javne in se lahko prosto izvajajo, razvijajo se v preglednem procesu, v katerem sodelujejo različne zainteresirane strani, ne nadzira jih ena sama vlada ali podjetje in so predmet mednarodnih organov za standardizacijo.
Izvajanje politik, usmerjenih v digitalno suverenost, zahteva jasno zavezo vodstva, ki mora dati prednost dolgoročni neodvisnosti pred kratkoročno udobnostjo.
Vse te izzive je mogoče obvladati in se sčasoma zmanjšujejo, medtem ko omejitve in stroški odvisnosti od lastniških oblik zapisov postajajo vse hujši.
To pomeni, da lahko vlade in podjetja sodelujejo pri opredeljevanju specifikacij oblike zapisa, namesto da so prisiljena pasivno sprejemati spremembe, ki jih vsiljuje en sam prodajalec na podlagi svojih poslovnih strategij.
Tako specifikacije ODF omogočajo komur koli, da

Thursday
06 November, 2025


face

General Activities

  1. LibreOffice 25.8.2 was announced on October 9
  2. LibreOffice 25.2.7 was announced on October 30
  3. Olivier Hallot (TDF) added help pages for R1C1 Calc formula syntax and DOI citation recognition and improved and updated help on dimension lines, form properties, master documents, command line operations, online update, text boundaries and VBA constants. He also adapted the helper script used for patch submission to a version that works with Help
  4. Gábor Kelemen (Collabora) improved the script for finding unneeded includes in the code and did many code cleanups
  5. Tomaž Vajngerl (Collabora) continued working on sheet view functionality in Calc
  6. Pranam Lashkari, Dennis Francis, Szymon Kłos, Jaume Pujantell and Gülşah Köse (Collabora) worked on LOKit/jsdialog used by Collabora Online
  7. Rashesh Padia (Collabora) made the revamped Impress transition list more robust
  8. Michael Meeks (Collabora) did code cleanups and optimisations in PPTX export code
  9. Miklós Vajna (Collabora) improved image handling in Markdown import and export, continued improving the handling of tracked changes that depend on each other and fixed issues with handling of bulleted lists in PPTX files
  10. Xisco Faulí (TDF) added sqlite3, dbm and pythonw.exe to the internal Python, fixed an Impress printing crash, added a few new automated tests and upgraded many dependencies
  11. Michael Stahl (Collabora) implemented per-line paragraph properties for Word Compatibility Mode, fixed a PDF export issue involving variable fields and hidden text and fixed automatic captioning of images in Writer in the case of a single pasted image
  12. Mike Kaganski (Collabora) improved help for inserting page numbers and accessing remote files, made Google Drive two-factor authentication work on Windows, made date and time arithmetic more robust, made the loading of macro class modules happen in the correct order, preventing name conflicts, made it so the automatic updater does not run in headless mode, made the display of empty hidden paragraphs between tables match that of Microsoft Word, improved text property handling in PPTX files, reduced console noise in debug builds by marking menu items without icons, fixed an issue with Writer column separator colour sometimes not being saved, made shape identification in ODF export more robust and improved the behaviour of conditional hiding of sections. He also did many code cleanups and optimisations
  13. Caolán McNamara (Collabora) added Adobe Font Development Kit for OpenType (AFDKO) library for converting and merging Type 1 fonts to OTF when importing PDFs via pdfium and fixed an (unreleased) issue with scrolling the Calc formula input box. He also fixed crashes and many issues found by static analysers and did code cleanups and optimisations
  14. Stephan Bergmann (Collabora) did build fixes, adapted the code to compiler changes and did code cleanups
  15. Noel Grandin (Collabora) made it faster to reject tracked changes in Calc, export EPUB files and render SVGs with pattern fills. He also did many code cleanups and optimisations, especially in the area of transparency handling
  16. Justin Luth (Collabora) made it so undoing an autocorrection triggered by a newline does not

Tuesday
04 November, 2025


face

Writer has some support for interdependent (or hierarchical) tracked changes: e.g. the case when you have a delete on top of an insert. See the third post for background.

This work is primarily for Collabora Online, but the feature is available in desktop Writer as well.

Motivation

Interdependent changes mean that the UI shows one type of change on top of another change, e.g. formatting on top of insert. Writer knows the priority of each type, so in case you have an insert or delete change and on top of that you have a formatting, then the UI will look "through" the formatting and work on the underlying insert or delete when you navigate with your cursor to a position with multiple changes and you press Accept on the Review tab of the notebookbar.

Usually this is what you mean, but what if you want to work on the formatting at the top, directly? You can now open the Manage Changes dialog using the Manage button on the Review tab of the notebookbar and if you go to the formatting change row of the dialog, then pressing Accept there will accept the formatting change, not the insert or delete change. This is possible, because the dialog gives you a way to precisely select which tracked change you want to work with, even if a specific cursor position has multiple tracked changes.

Results so far

Here is a sample ins-then-format.docx document from the core.git testcases, the baseline has an insertion, and part of that is covered by an additional formatting change on top:

Interdependent tracked change: baseline

If you just go in the middle of the document and press Accept, that will work with the more important insert change, so the result looks like this:

Interdependent tracked change: default accept result

But now you can also open the Manage Changes dialog, to be more specific by directly selecting the formatting change:

Interdependent tracked change: direct accept via the dialog

And when you accept the formatting change directly, the result will be just the insert change:

Interdependent tracked change: direct accept result

You can save and load the results in both DOCX and ODT, as usual.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

As usual, the high-level problem was addressed by a series of small changes. Core side:

Want to start using this?

You can get a development edition of Collabora Online 25.04 and try it out yourself right now: try the development edition. Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF's next release too (26.2).


Wednesday
22 October, 2025


face

In LibreOffice C++ code, there are many cases where developers have string literals that should be used in the code. If these are messages in the graphical user interface (GUI), they should be added to the translatable messages. But, there are many cases where the string literals has nothing to do with other languages, and they should be used as they are. In this case, enumarray is helpful. Although they are not limited to string literals, and can be used for any data.

Using Symbolic Constants

In old C code, using #define was the preferred way one could give a name to a string literal or other kinds of data. For example, consider this code:

const char[] FRAME_PROPNAME_ASCII_DISPATCHRECORDERSUPPLIER = "DispatchRecorderSupplier";
const char[] FRAME_PROPNAME_ASCII_ISHIDDEN = "IsHidden";
inline constexpr OUString FRAME_PROPNAME_ASCII_LAYOUTMANAGER = "LayoutManager";
const char[] FRAME_PROPNAME_ASCII_TITLE = "Title"_ustr;
const char[] FRAME_PROPNAME_ASCII_INDICATORINTERCEPTION = "IndicatorInterception";
const char[] FRAME_PROPNAME_ASCII_URL = "URL";

And also, the relevant states:

#define FRAME_PROPHANDLE_DISPATCHRECORDERSUPPLIER 0
#define FRAME_PROPHANDLE_ISHIDDEN 1
#define FRAME_PROPHANDLE_LAYOUTMANAGER 2
#define FRAME_PROPHANDLE_TITLE 3
#define FRAME_PROPHANDLE_INDICATORINTERCEPTION 4
#define FRAME_PROPHANDLE_URL 5

Although this C code still works in C++, it is not the desired approach in modern C++.

Using enumarrays

In modern C++ code, you can use enumarry, which is defined in o3tl in LibreOffice. The above code becomes:

enum class FramePropNameASCII
{
    DispatcherRecorderSupplier,
    IsHidden,
    LayoutManager,
    Title,
    IndicatorInterception,
    URL,
    LAST=URL
};

And also, the string literal definitions:

constexpr o3tl::enumarray<FramePropNameASCII, OUString> FramePropName = {
    u"DispatchRecorderSupplier"_ustr,
    u"IsHidden"_ustr,
    u"LayoutManager"_ustr,
    u"Title"_ustr,
    u"IndicatorInterception"_ustr,
    u"URL"_ustr
};

Why an enumarray?

The names are much more readable, as they do not have to be ALL_CAPPS, as per convention for symbolic constants in C. Their usage is also quite easy. For example, one can use [] to access the relevant string literal:

- xPropSet->getPropertyValue( FRAME_PROPNAME_ASCII_LAYOUTMANAGER ) >>= xLayoutManager;
+ xPropSet->getPropertyValue( FramePropName[FramePropNameASCII::LayoutManager] ) >>= xLayoutManager;

Final Notes

In LibreOffice, enumarrays are not limited to string literals, and they can be used with other data. This task is filed as tdf#169155, and if you like, you may try finding some instances in the code and modernize it using enumarrays.

To learn more about LibreOffice development, you can refer to TDF Wiki. You may follow this blog to read about EasyHacks, tutorials and announcements related to LibreOffice development.


Tuesday
21 October, 2025


face

General Activities

  1. LibreOffice 25.2.6 was announced on September 8
  2. Olivier Hallot (TDF) improved the help for Select Function in Calc’s formula bar, expanded help for the selection of chart data sources, added AutoFilter and Pivot Table/Chart to the help page on sheet protection, added information about summary above/below to the help of Calc’s SUBTOTAL() function, documented sensitivity in the help page for Solver and added the description meta element to the Help page templates
  3. Gábor Kelemen (Collabora) improved the script for finding unneeded includes in the code and did many code cleanups
  4. Tomaž Vajngerl (Collabora) implemented a sheet view functionality in Calc allowing to manipulate AutoFilters in one view without affecting other views
  5. Pranam Lashkari, Maya Stephens, Gökay Şatır, Rashesh Padia and Mohit Marathe (Collabora) worked on LOKit used by Collabora Online. Maya also fixed an issue with Ctrl+clicking hyperlinked objects
  6. Miklós Vajna (Collabora) expanded Writer Markdown export support, worked on change tracking of formatting, continued improving the handling of tracked changes that depend on each other and fixed bullet list style going missing with PPTX export
  7. Xisco Faulí (TDF) implemented right-to-left text direction and bidirectional text support in SVG import, added venv to the internal Python, fixed crashes, added several new automated tests, upgraded many dependencies and did many code cleanups and optimisations
  8. Michael Stahl (Collabora) improved the DOCX compatibility of floating tables, helped Miklós with interdependent change tracking in Writer and fixed an issue with document compression
  9. Mike Kaganski (Collabora) fixed Help for BASIC’s Str function, adapted Writer’s change tracking to DOCX’s inability to track the deletion of comments, made date handling code more robust, improved the Visual Studio IDE integration, made the handling of double variables in BASIC more robust, replaced dtoa library with fast_float for faster string-to-float parsing and fixed an RTF import issue with some paragraphs appearing outside of their frames. He also did many code cleanups and optimisations
  10. Caolán McNamara (Collabora) fixed many issues found by static analysers and did code cleanups and optimisations
  11. Stephan Bergmann (Collabora) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  12. Noel Grandin (Collabora) fixed an (unreleased) issue with image fills disappearing at lower zoom levels, improved the performance of spreadsheets with thousands of shapes, improved the performance of 3D charts, fixed a performance issue with importing SVGs with small scaling, improved the performance of Calc’s Remove Duplicates, implemented Skia native rendering of bitmap tiling to improve the performance of filled polygons and fixed an issue with Insert Special Character dialog not being available with mergedlibs builds (Windows releases). He also did many code cleanups and optimisations, especially in the area of transparency handling
  13. Justin Luth (Collabora) fixed an issue with the alignment setting in Page Number Wizard, fixed localised accelerator shortcut conflicts, fixed many issues with page styles, page breaks and spell checking, improved the Bullets and Numbering dialog by showing the currently

Thursday
16 October, 2025


face

Since C++11 when enum class (also named scoped enum) is introduced, it is preferred to plain enum which is inherited from C programming languages. The task here is to convert the old enum instances to enum class.

Rationale

enum class has many benefits when compared to plain enum, as it provides better type safety among other things. Implicit conversion to integers, lack of ability to define the underlying data type and compatibility issues were some of the problems with plain enum that enum class solved in C++11. Although since then enum has improved and one can specify underlying type in the scoped enumerations.

Plain enums pollute namespace, and you have to pick names that are too long, and have to carry the context inside their names. For example: INETMSG_RFC822_BEGIN inside enum _ImplINetRFC822MessageHeaderState. With an enum class, it is simply written as HeaderState::BEGIN. When placed inside a file/class/namespace that makes it relevant, it is much easier to use: it is more readable, and causes no issues for other identifiers with possible similar names.,

See this change:

You can read more about that in:

Finding Instances

You may find some of the instances with:

$ git grep -w enum *.cxx *.hxx|grep -v "enum class"

When you count it with wc -l, it shows something more than 2k instances.

Examples Commits

You can see some of the previous conversions here, which is around 1k changes:

$ git log --oneline -i -E --grep="convert enum|scoped enum"

This is a good, but lengthy example of such a conversion:

Implementation

First of all, please choose good names for the new enum class and values. For example, you may convert APPLICATION_WINDOW_TITLE into Application::WindowTitle. Therefore, do not use the old names as they were.

Converting enum to enum class is not always straightforward. You should try to understand the code using the enum, and then try to replace it with enum class. You may need to add extra state/values for situations where 0 or -1 or some default value was used. There are cases where a numerical value is used for different conflicting purposes, and then you have to do some sort of conflict resolution to separate those cases.

You may end up modifying more and more files, and a few static_casts where they are absolutely necessary because you are interpreting some integer value read from input. These are the places where you should check the values yourself in the code. You have to make sure that the numerical value is appropriate before casting it to the enum class.

If you want to do bitwise operations, you should use o3tl::typed_flags, for example:

enum class FileViewFlags
{
    None = 0x00,
    MultiSelection = 0x02,
    ShowType = 0x04,
    ShowNone = 0x20,
};

template<> struct o3tl::typed_flags : o3tl::is_typed_flags<FileViewFlags, 0x26> {}

Then, you may use it like this:

    if (nFlags & FileViewFlags::MULTISELECTION)
        mxTreeView->set_selection_mode(SelectionMode::Multiple 

Tuesday
07 October, 2025


face

Writer recently got a Markdown import & export filter and there were a number of improvements to that.

This work is primarily for Collabora Online, but the feature is available in desktop Writer as well.

Motivation

Ujjawal Kumar contributed a markdown import to Writer, as part of Google Summer of Code (GSoC) this summer. Mike Kaganski of Collabora also created a minimal markdown export in Writer. I looked at the feature differences between the two, and filled in various gaps in the markdown export. I also added a few general markdown import/export improvements relevant for normal Writer documents, like embedded image support.

Results so far

Here is a sample case of a document using inline code spans:

Code span: baseline

Exporting this to markdown & loading back to Writer, the code span was lost:

Code span: old result

And now it's preserved:

Code span: new result

This also works with code blocks.

Second, here is a document with lists:

Lists: baseline

Exporting this to markdown & loading back to Writer, the lists were lost:

Lists: old result

And now they are preserved:

Lists: new result

This also works with nested lists.

Third, here is a document with an image:

Image: baseline

Exporting this to markdown & loading back to Writer, the image was lost:

Image: old result

And now it's preserved:

Image: new result

This also works with embedded and anchored images.

Fourth, here is a document with a table:

Table: baseline

Exporting this to markdown & loading back to Writer, the table was lost:

Table: old result

And now it's preserved:

Table: new result

This also works with table alignments and nested tables (to the extent the markdown markup allows that).

Fifth, here is a document with a quote block:

Quote: baseline

Exporting this to markdown & loading back to Writer, the quote's paragraph indentation was lost:

Quote: old result

And now it's preserved:

Quote: new result

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

As usual, the high-level problem was addressed by a series of small changes. Core side:

Want to start


Thursday
18 September, 2025


face

If you are working with LibreOffice code, trying to understand the code, fix bugs, or implement new features, you will need to debug the code at some point. Here are some general tips for a good debugging experience. Let’s start from the platform

Choose the Right Debug Platform

Choosing a platform to debug usually depends on the nature of the problem. If the problem is Windows-only, you need a Windows environment to build and debug the problem. But, if the problems can be reproduced everywhere, then you can choose the platform of your choice with the debugging tools that you prefer to debug the problem.

On Linux, it matters if you are running X11 or Wayland. Also, as there are multiple graphical back-ends available for LibreOffice, it matters if you are using X11, GTK3/4, or Qt5/6 back-end for your debugging. Some bugs are specific to GTK, then you should use GTK3 UI for testing. In 2025, GTK4 UI of LibreOffice is still experimental, so it is better to work with GTK3. For making the debugging easier, many developers work on X11 (gen) UI for debugging.

Debugging Tools

Various debugging tools can be used to debug the soffice.bin/soffice.exe LibreOffice binary that you have built. For the common debuggers, you can use GDB on Linux, lldb on macOS, and WinDbg or Visual Studio on Windows.

For using the above debuggers, you can use the IDE or front-end that support them. Various IDEs are usable with LibreOffice code. For a detailed explanation, refer to this Wiki article:

Make sure that you can build and debug a simple program before trying to build and debug LibreOffice.

Environment Variables

To have a better debugging experience, or to avoid problems you may have to customize the debugging session with environment variables. A complete article of the TDF Wiki is dedicated to discuss the environment variables that can be used with LibreOffice:

Here is some of the most important ones:

1) Using the X11 user interface:

If you want to use the X11 back-end that is simpler, and usually easier to work with on debug sessions, you have to set SAL_USE_VCLPLUGIN environment variable:

export SAL_USE_VCLPLUGIN=gen
That is specially useful when you are debugging graphical problems. But in some cases, you may need to avoid it or at least customize it. For example, while debugging mouse-related problems you may need to tell LibreOffice to avoid mouse grabbing this way:

export SAL_NO_MOUSEGRABS=1

2) Using GTK user interface

If you are using GTK user interface, then you may use GTK inspector to interactively debug LibreOffice GUI. You can use it this way:

export GTK_DEBUG=interactive

Pretty Printers

In solenv/gdb/ inside LibreOffice source code, you may find pretty printers for GDB. This is helpful when debugging LibreOffice with GDB, to be able to see data in a more readable way.

Dumping Data

Sometimes when you debug a LibreOffice application, it is easier to


Tuesday
16 September, 2025


face

General Activities

  1. LibreOffice 25.8.0 and LibreOffice 25.8.1 were announced on August 20 and August 29 respectively
  2. Olivier Hallot (TDF) updated help for the option to load printer settings with document, sorting blocks of cells in Calc, hyphenation, statistical functions, number of lines in charts, exponentiation operator in Calc, remote files, Edit menu in Calc, object rotation, Math options and MATCH function in Calc
  3. Celia Palacios added help for the new Intersect() method in ScriptForge
  4. Gábor Kelemen (Collabora) did many code cleanups
  5. Tomaž Vajngerl (Collabora) did many code cleanups and added OOXML test documents for text fitting / scaling
  6. Pranam Lashkari and Marco Cecchetti (Collabora) worked on LOKit used by Collabora Online. Marco also made it so hovering with the mouse over Chart data range colour palette entries in the Sidebar shows a live preview in the active chart
  7. Miklós Vajna (Collabora) added list and inline code block support for Markdown export and continued improving the handling of tracked changes that depend on each other
  8. Xisco Faulí (TDF) fixed crashes, added over a dozen new automated tests, upgraded many dependencies and did many code cleanups and optimisations
  9. Michael Stahl (Collabora) made it so pasted anchored objects are no longer selected by default while adding an expert configuration option for the behaviour, added overline support to XHTML export and worked around a dbus bug affecting the build process on some Linux systems
  10. Mike Kaganski (Collabora) fixed an issue with embedded fonts getting dropped from opened files in certain scenarios on Windows, made it so the user can choose to either discard license-restricted embedded fonts in an opened document or switch to read-only mode, improved PPTX compatibility with trailing empty lines in automatically shrinking text boxes, fixed long links getting truncated when exporting to XLSX, fixed issues with inserting hyperlinks in Calc via the API, made Calc text insertion API methods more robust, fixed inserting PDFs into spreadsheets, fixed a string handling issue in Basic’s Format function, fixed a VBA macro issue with dates and fixed processing of escaped backslashes in RTF files. He also did many code cleanups and optimisations
  11. Caolán McNamara (Collabora) fixed many issues found by static analysers and did code cleanups and optimisations
  12. Stephan Bergmann (Collabora) worked on the WASM build. He also adapted the code to compiler changes and did code cleanups
  13. Noel Grandin (Collabora) improved the scrolling speed in Writer documents with lots of comments. He also did many code cleanups and optimisations, especially in the area of transparency handling
  14. Justin Luth (Collabora) improved DOCX compatibility with margins of aligned floating objects, fixed right/left only page breaks going missing with DOC/DOCX export, fixed a DOCX indentation issue, fixed column breaks going missing in certain DOCX files, fixed an issue with numbered lists created by AutoCorrect, made it so justified text with section breaks in saved DOC files no longer triggers an MS Word bug and fixed numbering or bullets getting lost when applying a paragraph style
  15. Michael Weghorn

Monday
15 September, 2025


face

Once upon a time, there was a girl, who used WhatsApp in her iPhone. She was rather active there, and collected quite some important data in the app over time. But some things in her iPhone were inconvenient; and the phone was slowly aging. So she wanted to change her phone some day.

For her birthday, a fairy, who learned somehow about the girl’s wish, presented her a new Android phone. That was a nice new phone, and the girl was so happy! She decided to move everything from the old phone to the new one immediately.

She was worrying about how to move the precious data between the devices; but she felt a huge relief, when the phone spoke: “The fairy told me how important your data is to you; and I have magic powers to handle it all. Just connect the old phone to me with a cord”. So she did.

The new phone started its work; and the girl could see how the progress bar was gradually moving to completion; but suddenly it stopped; minutes passed, but the bar was motionless. The girl was impatient to start using her new shiny device, but she knew that she needs to wait. And she waited; and waited; but after an hour passed, she noticed something horrible: the old phone was sucking the life out of the new device through the cable!

The scared girl could only hope that the process would resume, and finish before the new phone is out of power. She searched and learned, that iPhones are known for their insatiable hunger, and whenever they are connected to anything with energy, they start sucking it. She couldn’t even ask the new phone to shine less brightly to save the energy – because it wasn’t ready for such things yet. She used her wireless charger, but its powers were fewer than the hunger of iPhone, combined with the hard work done by Android. The energy level still decreased too fast.

In the end, when the hope almost vanished, the progress resumed moving! But immediately, the new phone said: “When I collected your data from your old phone, something bad happened, and I failed to collect something. I will continue, but please check later, what’s missing!”.

Only a couple of energy drops were remaining in the new phone, when it finished its task, and could be disconnected from the vampire. But the girl was terrified, when she opened WhatsApp, connected to it (using a magic SMS confirmation), only to see that all her data is lost! She tried to open WhatsApp on the old phone to check if something is still there, and saw that the app had disconnected her. So she used the SMS magic again, and – to her great relief – everything was there!

She askes WhatsApp, how to move the data; and it answered, that if she moved from iPhone to iPhone, or from Android to Android, she could use a backup; but from


Thursday
11 September, 2025


face

C++ Standard library, which resides in std:: namespace provides common classes and functions which can be used by developers. Among them, Standard Template Library (STL) provides classes and functions to better manage data through data structures named containers. Here I discuss how to use STL functions for better processing of data, and avoid loops.

Checking Conditions

To iterate over a container to see if some specific condition is valid for all, any, or none of the elements in that container, C/C++ developers traditionally used loops.

On the other hand, since C++11, there are functions that can handle such cases: all_of, any_of and none_of. These functions process STL containers, and can replace loops. If you want to know if a function returns true for all, any, or none of the items of the container, then you can simply use these functions. This is the EasyHack dedicated to such a change:

Here is an example patch which uses any_of instead of a loop:

-    bool bFound = false;
     // convert ASCII apostrophe to the typographic one
     const OUString aText( rOrig.indexOf( '\'' ) > -1 ? rOrig.replace('\'', u'’') : rOrig );
-    size_t nCnt = aVec.size();
-    for (size_t i = 0;  !bFound && i < nCnt;  ++i)
-    {
-        if (aVec[i] == aText)
-            bFound = true;
-    }
+    const bool bFound = std::any_of(aVec.begin(), aVec.end(),
+        [&aText](const OUString& n){ return n == aText; });

As you can see, the new code is more concise, and avoids using loops.

Conditional Copying, Removing and Finding

If you want to copy, remove or simply find a value in a container which conforms to a specific functions, you may use copy_if, remove_if or find_if.

Again, this is an example patch:

-  for ( size_t i = 0; i < SAL_N_ELEMENTS( arrOEMCP ); ++i )
-        if ( arrOEMCP[i] == codepage )
-            return true;
-
-    return false;
+    return std::find(std::begin(arrOEMCP), std::end(arrOEMCP), codepage) != std::end(arrOEMCP);

Final Words

Refactoring code is a good way to improve knowledge on LibreOffice development. The above EasyHacks are among EasyHacks that everyone can try.

More information about EasyHacks, and how to start working on them can be found on TDF Wiki:


Tuesday
09 September, 2025


face

Writer has some support for interdependent (or hierarchical) tracked changes: e.g. the case when you have a delete on top of an insert. See the second post for background.

This work is primarily for Collabora Online, but the feature is available in desktop Writer as well.

Motivation

With the already mentioned improvements in place, the area of format redlines with character style or direct formatting changes were still lacking: Writer's original model here was just marking a text range as "formatted" and then either accept the format redline as-is, or reject reverting back to the paragraph style (default formatting), losing the old character style or old direct formatting.

Results so far

Here is a sample case of a document where the old character style is Strong (~bold) and the font size is 24pt, while the new character style is Quote (~italic) and the font size is 36pt. The rest of the document uses no specific character styles and has the font size of 12pt:

Interdependent tracked change: improved format, after document load

Rejecting that format redline resulted in just the defaults, i.e. no character style and 12pt font size:

Interdependent tracked change: old reject, lost character style / direct format

But now we track the old character style & direct format:

Interdependent tracked change: new reject, handled character style / direct format

This required changes in the DOCX import, ODF import and ODF export, too.

How is this implemented?

If you would like to know a bit more about how this works, continue reading... :-)

As usual, the high-level problem was addressed by a series of small changes. Core side:

Want to start using this?

You can get a development edition of Collabora Online 25.04 and try it out yourself right now: try the development edition. Collabora intends to continue supporting and contributing to LibreOffice, the code is merged so we expect all of this work will be available in TDF's next release too (26.2).


Monday
01 September, 2025


face

LibreOffice 25.8 krepi digitalno suverenost

LibreOffice 25.8: strateška dobrina za vlade in podjetja, usmerjena v digitalno suverenost in zasebnost

Pregled

V času, ko geopolitične napetosti, zakoni o lokalizaciji podatkov in tveganja v zvezi s skladnostjo spreminjajo IT-okolje, se LibreOffice 25.8 (izšel je konec avgusta 2025) izkazuje kot strateška izbira. Gre za popolnoma odprtokodni, krajevno delujoč pisarniški paket, zasnovan za organizacije, ki potrebujejo popoln nadzor nad svojo programsko opremo, podatki in infrastrukturo.

Ta različica neposredno temelji na prednostnih nalogah, ki so jih izrazile javne uprave in velika podjetja po vsem svetu: zaščita podatkov uporabnikov, zmanjšanje odvisnosti od tujih dobaviteljev in krepitev digitalne avtonomije.

Zakaj je digitalna suverenost pomembna?

Za vlade in podjetja digitalna suverenost ni le filozofija. Gre za:

  • nacionalno varnost: zmanjšanje izpostavljenosti ekstrateritorialnemu nadzoru in varnostnim luknjam v programski opremi;
  • skladnost z zakonodajo: izpolnjevanje zakonskih zahtev, kot so GDPR, nacionalni zakoni o javnih naročilih in predpisi o lokalizaciji IT;
  • neodvisnost od dobaviteljev: izogibanje prisilnim migracijam, agresivnim modelom licenciranja ali nepredvidljivim cenam dobaviteljev lastniške opreme;
  • strateško odpornost: ohranjanje delovanja sistemov, ki so ključni za poslovanje, brez odvisnosti od oblaka.

LibreOffice 25.8 je bil razvit posebej za te namene.

Ključne prednosti LibreOffice 25.8 za ustanove

Arhitektura, ki daje prednost zasebnosti

  • Brez telemetrije: brez zbiranja podatkov v ozadju. LibreOffice je popolnoma transparenten in deluje neopazno.
  • Popolna zmogljivost brez internetne povezave: vse funkcije delujejo brez internetne povezave, kar je idealno za varna, izolirana ali kritična okolja.
  • Šifriranje OpenPGP: dokumente je mogoče šifrirati s ključi, ki jih upravlja uporabnik, kar zagotavlja skladnost z notranjimi varnostnimi politikami.

Odprti standardi in medsebojna povezljivost

  • Domorodna podpora za odprti zapis dokumentov (ODF), standard ISO, ki zagotavlja dolgoročen dostop in odpravlja lastniško vezanost.
  • Izboljšana združljivost z zapisi Microsoft Office/365 (.docx, .xlsx, .pptx) in zapisi OpenOffice (.doc, .xls, .ppt).

Prilagodljiva namestitev in integracija

  • Na voljo je za Windows, Linux in macOS: podpira heterogena IT-okolja.
  • Brezhibna integracija z Nextcloud, ownCloud in samostojnimi platformami za sodelovanje.
  • Skalabilen od ene same varne delovne postaje do celovitih namestitev v podjetju s centralizirano konfiguracijo in izvajanjem politik.

Strateške prednosti za javni in podjetniški IT

  • Nadzor stroškov: brez licenčnin. LibreOffice lahko zmanjša IT-stroške in je hkrati skladen z javnimi naročili, ki zahtevajo odprte standarde in pošteno konkurenco.
  • Revizijska sledljivost: popolnoma odprtokoden. Vsaka vrstica kode je vidna in preverljiva, kar podpira revizijske zahteve in zmanjšuje tveganja v dobavni verigi.
  • Lokalna opolnomočenost: spodbuja nacionalne in regionalne IT-ekosisteme z omogočanjem pogodb za lokalno podporo, prilagajanjem in strokovnimi storitvami, kar spodbuja domači tehnološki sektor.

Uporaba v praksi

Vlade in velike institucije po Evropi, Latinski Ameriki in Aziji so LibreOffice sprejele kot del pobud za digitalno suverenost. Vladni organi v Nemčiji, na Danskem in v Franciji ter nacionalna ministrstva v Italiji in Braziliji so se obrnili k LibreOffice, da bi ponovno prevzeli nadzor nad svojo digitalno infrastrukturo. LibreOffice podpira The Document Foundation, nevtralna, neprofitna organizacija z globalno


Thursday
28 August, 2025


face

LibreOffice handles different input and output formats, and also displays text and graphics alongside inside the GUI on computer displays. This requires LibreOffice to understand various different measurement units, and convert values from one to another.

Unit selection

Unit selection

The unit conversion can be done by writing extra code, where one should know the units, and calculate factor to convert them to each other.

For example, consider that we want to convert width from points into 1/100 mm, which is used in page setup.

We know that:

1 point = 1/72 inch
1 inch = 25.4 mm = 25400 microns
factor = 25400/(72*10) ≈ 35.27777778

Then, it is possible to write the conversion as:

static int PtTo10Mu( int nPoints )
{
return static_cast<int>((static_cast<double>(nPoints)*35.27777778)+0.5);
}

A separate function that casts integer nPoints to double, then multiplies it by the factor which has 8 decimal points, and then rounds the result by adding 0.5 and then truncates it and stores it in an integer. This approach is not always desirable. It is error-prone, and lacks enough accuracy. For big values, it can calculates values off by one.

Another approach is to use o3tl (OpenOffice.org template library) convert function. It is as simple as writing:

int nResult = o3tl::convert(nPoint, o3tl::Length::pt, o3tl::Length::mm100)

As you can see, it is much cleaner, and gives the output, properly rounded as an integer!

You need a double? No problem! You can use appropriate template to achieve that:

double fResult = o3tl::convert<double>(nPoint, o3tl::Length::pt, o3tl::Length::mm100)

These are the supported units, defined in the header include/o3tl/unit_conversion.hxx:

mm100 – 1/100th mm = 1 micron

mm10 – 1/10 mm

mm – millimeter

cm – centimeter

m – meter

km – kilometer

emu – English Metric Unit (1/360000 cm)

twip – Twentieth of a point (1/20 pt)

pt – Point (1/72 in)

pc – Pica (1/6 in)

in1000 – 1/1000 in

in100 – 1/100 in

in10 – 1/10 in

in – inch

ft – foot

mi – mile

master – PPT Master Unit (1/576 in)

px – Pixel unit (15 twip, 96 ppi)

ch – Char unit (210 twip, 14 px)

line – Line unit (312 twip)

Handling Overflows

If you are doing a conversion, it is possible that the result overflows. With o3tl::convert() you can handle it this way:

sal_Int64 width = o3tl::convert(nPoint, o3tl::Length::pt, o3tl::Length::mm100, overflow, 0);
if (overflow)
{
...
}

Code Pointers

To to find instances to change, one can try finding some magic numbers listed here. For example, consider measuring a line based on twips:

line – Line unit (312 twip)

If you search for 312, you may find some examples:

$ git grep -w 312 *.cxx

Final Words

The task described here is filed as tdf#168226:

EasyHacks are well-defined small tasks that are designed to help newcomers begin LibreOffice programming. If you like it, you can start working on it!

Using o3tl::convert() not only simplifies the


Wednesday
20 August, 2025


face

Najboljši odprto-kodni pisarniški paket se še naprej razvija, hkrati pa ohranja svoj poudarek na zasebnosti in digitalni suverenosti


LibreOffice 25.8 je tukaj

Berlin, 20. avgust 2025 – TDF (The Document Foundation) objavlja izid izdaje LibreOffice 25.8. Ta najnovejša različica brezplačnega odprto-kodnega pisarniškega paketa, ki je vodilni na trgu, se še naprej osredotoča na digitalno suverenost in zaščito zasebnosti Posameznikom, organizacijam in vladam ponuja popoln nadzor nad njihovimi podatki in najobsežnejša orodja za produktivnost.

V globalnem kontekstu naraščajoče zaskrbljenosti glede zasebnosti podatkov, zaklepanja v oblaku in kapitalizma nadzorovanja ravno LibreOffice 25.8 ponuja konkretne rešitve.

Odprta koda: Izvorna koda je na voljo za pregled in je popolnoma brez lastniških tehnoloških omejitev.

Zasebnost in nadzor: LibreOffice ne zbira osebnih podatkov, metrik uporabe ali diagnostičnih informacij in je v skladu s predpisi o varstvu podatkov, ki jih zahtevajo implementacije javne uprave (GDPR).

Krajevno izvajanje: vse funkcije se izvajajo krajevno na uporabnikovem računalniku, brez potrebe po internetni ali oblačni povezavi.

Sodelovanje ob lastnem gostovanju: integracija s krajevnimi rešitvami v oblaku, kot je Nextcloud, omogoča ekipam, da sodelujejo, ne da bi delile svoje informacije z velikimi tehnološkimi podjetji.

LibreOffice 25.8: nove zmogljivosti in funkcije

Uporabniški vmesnik: pogovorno okno Dobrodošli/Novosti zdaj ponuja dostop do izbirnika uporabniškega vmesnika in možnosti videza, kar novim uporabnikom omogoča, da izkoristijo prilagodljiv uporabniški vmesnik LibreOffice in prilagodijo videz in uporabnost glede na svoje želje.

Zmogljivost: vse je hitrejše, od zagona do pomikanja po velikih dokumentih – z znatnim povečanjem hitrosti na manj zmogljivih računalnikih.

  • Glede na primerjalne preizkuse Writer in Calc odpreta datoteke do 30 % hitreje.
  • Optimizirano upravljanje pomnilnika omogoča nemoteno delovanje na virtualnih namizjih in tankih odjemalcih.

Boljša medopravilnost z datotekami Microsoft Office, z natančnejšo obdelavo datotek DOCX, XLSX in PPTX ter manj težav z oblikovanjem, zahvaljujoč spremembam, kot so:

  • popolna prenova deljenja besed in razmika;
  • upravljanje pisav v programu Impress, ki je združljivo z datotekami PowerPoint;
  • dodane nove funkcije v Calc: CHOOSECOLS, CHOOSEROWS, DROP, EXPAND, HSTACK, TAKE, TEXTAFTER, TEXTBEFORE, TEXTSPLIT, TOCOL, TOROW, VSTACK, WRAPCOLS in WRAPROWS.

Seveda ponuja tudi druge pomembne nove funkcije, kot je možnost izvoza v zapisu PDF 2.0 in več novih storitev knjižnice ScriptForge. Seznam vseh novosti se nahaja tukaj: https://wiki.documentfoundation.org/ReleaseNotes/25.8/sl

Kar zadeva spremembe podpore za operacijske sisteme, LibreOffice 25.8 ne bo več deloval v sistemih Windows 7, 8/8.1 ali (32-bitnih) različicah x86. To je tudi zadnja različica, ki jo lahko izvajate na macOS 10.15.

LibreOffice 25.8 za poslovno rabo

Organizacija TDF sodeluje z globalno mrežo certificiranih partnerjev, ki nudijo podporo in vzdrževanje za poslovno rabo v podjetjih, prilagojene funkcije in integracije ter pomoč pri migraciji in usposabljanju uporabnikov. Celoten seznam partnerjev najdete tukaj: https://sl.libreoffice.org/po-pomoc/profesionalna-podpora/

Kam se umešča LibreOffice 25.8?


25.8

LibreOffice 25.8 je popolnoma brezplačen

<- Current blog entries