From abf2f24e5b58608bc6526a2703ef68c66ab1df0f Mon Sep 17 00:00:00 2001 From: Hossein Date: Thu, 4 Jul 2024 15:17:26 +0200 Subject: [PATCH] Add lokconvert odk example This exmaple converts a file to PDF using LibreOfficeKit library. Change-Id: Idc4afafc9541986617f0cc4d46cd89e25ae12051 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/169998 Tested-by: Jenkins Reviewed-by: Hossein --- odk/Package_examples.mk | 4 ++ odk/examples/cpp/lokconvert/Makefile | 75 +++++++++++++++++++++ odk/examples/cpp/lokconvert/lokconvert.cxx | 46 +++++++++++++ odk/examples/cpp/lokconvert/test.odt | Bin 0 -> 11176 bytes 4 files changed, 125 insertions(+) create mode 100644 odk/examples/cpp/lokconvert/Makefile create mode 100644 odk/examples/cpp/lokconvert/lokconvert.cxx create mode 100644 odk/examples/cpp/lokconvert/test.odt diff --git a/odk/Package_examples.mk b/odk/Package_examples.mk index 5588b74d7ea0..28d60b329016 100644 --- a/odk/Package_examples.mk +++ b/odk/Package_examples.mk @@ -427,6 +427,10 @@ $(eval $(call gb_Package_add_files_with_dir,odk_examples,$(SDKDIRNAME)/examples, basic/text/modifying_text_automatically/using_regular_expressions.odt \ cpp/Convertor/Convertor.cxx \ cpp/Convertor/Makefile \ + cpp/Convertor/test.odt \ + cpp/lokconvert/lokconvert.cxx \ + cpp/lokconvert/Makefile \ + cpp/lokconvert/test.odt \ cpp/Draw/Draw.cxx \ cpp/Draw/Makefile \ cpp/DocumentLoader/DocumentLoader.cxx \ diff --git a/odk/examples/cpp/lokconvert/Makefile b/odk/examples/cpp/lokconvert/Makefile new file mode 100644 index 000000000000..fa72a5256ebf --- /dev/null +++ b/odk/examples/cpp/lokconvert/Makefile @@ -0,0 +1,75 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t; fill-column: 100 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +# Builds the C++ lokconvert example of the SDK. + +PRJ=../../.. +SETTINGS=$(PRJ)/settings + +include $(SETTINGS)/settings.mk +include $(SETTINGS)/std.mk + +# Define non-platform/compiler specific settings +COMPONENT_NAME=lokconvert + +OUT_COMP_INC = $(OUT_INC)/$(COMPONENT_NAME) +OUT_COMP_GEN = $(OUT_MISC)/$(COMPONENT_NAME) +OUT_COMP_OBJ=$(OUT_OBJ)/$(COMPONENT_NAME) + +CXXFILES = lokconvert.cxx + +OBJFILES = $(patsubst %.cxx,$(OUT_SLO_COMP)/%.$(OBJ_EXT),$(CXXFILES)) + +# Targets +.PHONY: ALL +ALL : \ + CpplokconvertExample + +include $(SETTINGS)/stdtarget.mk + +$(OUT_COMP_OBJ)/%.$(OBJ_EXT) : %.cxx $(SDKTYPEFLAG) + -$(MKDIR) $(subst /,$(PS),$(@D)) + $(CC) $(CC_FLAGS) $(CC_INCLUDES) -I$(OUT_COMP_INC) $(CC_DEFINES) $(CC_OUTPUT_SWITCH)$(subst /,$(PS),$@) $< + +$(OUT_BIN)/lokconvert$(EXE_EXT) : $(OUT_COMP_OBJ)/lokconvert.$(OBJ_EXT) + -$(MKDIR) $(subst /,$(PS),$(@D)) + -$(MKDIR) $(subst /,$(PS),$(OUT_COMP_GEN)) +ifeq "$(OS)" "WIN" + $(LINK) $(EXE_LINK_FLAGS) /OUT:$@ /MAP:$(OUT_COMP_GEN)/$(basename $(@F)).map \ + $< $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB) +else + $(LINK) $(EXE_LINK_FLAGS) $(LINK_LIBS) -o $@ $< \ + $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB) $(STDC++LIB) +ifeq "$(OS)" "MACOSX" + $(INSTALL_NAME_URELIBS_BIN) $@ +endif +endif + +CpplokconvertExample : $(OUT_BIN)/lokconvert$(EXE_EXT) + @echo -------------------------------------------------------------------------------- + @echo The example loads the "$(QM)test.odt$(QM)" document in the lokconvert example directory + @echo and convert it to PDF + @echo - + @echo Use the following command to execute the example! + @echo - + @echo $(MAKE) lokconvert.run + @echo - + @echo -------------------------------------------------------------------------------- + +%.run: $(OUT_BIN)/lokconvert$(EXE_EXT) + cd $(subst /,$(PS),$(OUT_BIN)) && $(basename $@) $(subst \\,/,$(subst /,$(PS),"$(OO_SDK_HOME)/examples/cpp/lokconvert/test.odt" "$(PWD)/test.pdf")) + +.PHONY: clean +clean : + -$(DELRECURSIVE) $(subst /,$(PS),$(OUT_COMP_INC)) + -$(DELRECURSIVE) $(subst /,$(PS),$(OUT_COMP_GEN)) + -$(DELRECURSIVE) $(subst /,$(PS),$(OUT_COMP_OBJ)) + -$(DEL) $(subst \\,\,$(subst /,$(PS),$(OUT_BIN)/lokconvert*)) + +# vim: set noet sw=4 ts=4: diff --git a/odk/examples/cpp/lokconvert/lokconvert.cxx b/odk/examples/cpp/lokconvert/lokconvert.cxx new file mode 100644 index 000000000000..123d1190e040 --- /dev/null +++ b/odk/examples/cpp/lokconvert/lokconvert.cxx @@ -0,0 +1,46 @@ +#include +#include "LibreOfficeKit/LibreOfficeKit.hxx" + +int main(int argc, char* argv[]) +{ + if (argc < 3) + { + std::cout << "Usage: lokconvert \n"; + return 1; + } + const char* input = argv[1]; + const char* output = argv[2]; + + lok::Office* llo = NULL; + try + { + const char* lo_bin_dir = std::getenv("OO_SDK_URE_BIN_DIR"); + llo = lok::lok_cpp_init(lo_bin_dir); + if (!llo) + { + std::cerr << "Error: could not initialise LibreOfficeKit\n"; + return 1; + } + + lok::Document* lodoc = llo->documentLoad(input, NULL /* options */); + if (!lodoc) + { + std::cerr << "Error: could not load document: " << llo->getError() << "\n"; + return 1; + } + + if (!lodoc->saveAs(output, "pdf", NULL /* options */)) + { + std::cerr << "Error: could not export document: " << llo->getError() << "\n"; + return 1; + } + } + catch (const std::exception& e) + { + std::cerr << "Error: LibreOfficeKit exception: " << e.what() << "\n"; + return 1; + } + + std::cerr << "Success!\n"; + return 0; +} diff --git a/odk/examples/cpp/lokconvert/test.odt b/odk/examples/cpp/lokconvert/test.odt new file mode 100644 index 0000000000000000000000000000000000000000..dc4efecac07174281e7fb62cabcc641fbd7839b3 GIT binary patch literal 11176 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 BDs%t< literal 0 HcmV?d00001