Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MacOS scripts for Excel and Word #142

Merged
merged 18 commits into from Nov 17, 2022
Merged

Conversation

jposterloh
Copy link
Contributor

Here my changes for Issue #126, Support for MacOS.

I've added .applescripts for Word and Excel. These work on the command line. I've also added the code for execution in documents4j, plus retrieval of the return value as you proposed.

I still have problems running the test-cases (on windows and mac), however in my own application the conversion works as intended.

@raphw
Copy link
Contributor

raphw commented Nov 16, 2022

Two minor nits, but otherwise this is looking good!

@jposterloh
Copy link
Contributor Author

Glad you like it! What nits? I tested a lot, so there might be some leftovers or so... ;-)

@raphw
Copy link
Contributor

raphw commented Nov 16, 2022

I commented inline in the code, above.

@jposterloh
Copy link
Contributor Author

jposterloh commented Nov 16, 2022

I don't see any comments??

They should show up in "Conversations" right? For me it's empty.

@raphw
Copy link
Contributor

raphw commented Nov 16, 2022

Weird, they are right there for me. I was wondering if you:

  • Could mark OsUtil.myOs as final.
  • Could remove or explain the comments in AbstractExternalConverter.

- OsUtils.myos made final
- fixed comments in AbstractExternalConverter
- fixed missing else part in MicrosoftOfficeAssertionEngine
@jposterloh
Copy link
Contributor Author

The comments was a left over, is fixed. OsUtils.myOs is now final.

@raphw raphw merged commit 2fa72e0 into documents4j:master Nov 17, 2022
@vedranstanic82
Copy link

vedranstanic82 commented Dec 6, 2023

Hi guys,

So how do you use this on Mac now? I have Mac, Word, and these dependencies, but it is defaulting to cmd/vbs (windows)

<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-api</artifactId>
    <version>1.1.12</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.1.12</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.0.3</version>
</dependency>

this code:
// Create a converter
IConverter converter = LocalConverter.builder().build();

        // Convert the document
        Future<Boolean> conversion = converter
                .convert(docxInputStream).as(DocumentType.MS_WORD)
                .to(outputStream).as(DocumentType.PDF)
                .schedule();

but it is defaulting to vbs cmd...

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
�[2m2023-12-07T00:19:31.134+01:00�[0;39m �[31mERROR�[0;39m �[35m13046�[0;39m �[2m---�[0;39m �[2m[ main]�[0;39m �[36mo.s.boot.SpringApplication �[0;39m �[2m:�[0;39m Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ~[spring-boot-3.1.6.jar:3.1.6]
at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:755) ~[spring-boot-3.1.6.jar:3.1.6]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:750) ~[spring-boot-3.1.6.jar:3.1.6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:323) ~[spring-boot-3.1.6.jar:3.1.6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.6.jar:3.1.6]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.6.jar:3.1.6]
Caused by: java.lang.IllegalStateException: class com.documents4j.conversion.msoffice.MicrosoftWordBridge could not be created by a (File, long, TimeUnit) constructor
at com.documents4j.conversion.ExternalConverterDiscovery.make(ExternalConverterDiscovery.java:33) ~[documents4j-transformer-1.1.12.jar:na]
at com.documents4j.conversion.ExternalConverterDiscovery.makeAll(ExternalConverterDiscovery.java:43) ~[documents4j-transformer-1.1.12.jar:na]
at com.documents4j.conversion.ExternalConverterDiscovery.loadConfiguration(ExternalConverterDiscovery.java:86) ~[documents4j-transformer-1.1.12.jar:na]
at com.documents4j.conversion.DefaultConversionManager.(DefaultConversionManager.java:22) ~[documents4j-transformer-1.1.12.jar:na]
at com.documents4j.job.LocalConverter.makeConversionManager(LocalConverter.java:79) ~[documents4j-local-1.1.12.jar:na]
at com.documents4j.job.LocalConverter.(LocalConverter.java:51) ~[documents4j-local-1.1.12.jar:na]
at com.documents4j.job.LocalConverter$Builder.build(LocalConverter.java:186) ~[documents4j-local-1.1.12.jar:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) ~[spring-boot-3.1.6.jar:3.1.6]
... 14 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
at com.documents4j.conversion.ExternalConverterDiscovery.make(ExternalConverterDiscovery.java:31) ~[documents4j-transformer-1.1.12.jar:na]
... 24 common frames omitted
Caused by: com.documents4j.throwables.ConverterAccessException: Unable to run script: /var/folders/bj/qz0h21d50tb1b5dx0cfh6grw0000gn/T/tmp10123923728112475785/word_start1713687405.vbs
at com.documents4j.conversion.AbstractExternalConverter.runNoArgumentScript(AbstractExternalConverter.java:76) ~[documents4j-util-transformer-process-1.0.3.jar:na]
at com.documents4j.conversion.msoffice.AbstractMicrosoftOfficeBridge.runNoArgumentScript(AbstractMicrosoftOfficeBridge.java:51) ~[documents4j-transformer-msoffice-base-1.0.3.jar:na]
at com.documents4j.conversion.msoffice.AbstractMicrosoftOfficeBridge.tryStart(AbstractMicrosoftOfficeBridge.java:34) ~[documents4j-transformer-msoffice-base-1.0.3.jar:na]
at com.documents4j.conversion.msoffice.MicrosoftWordBridge.startUp(MicrosoftWordBridge.java:44) ~[documents4j-transformer-msoffice-word-1.0.3.jar:na]
at com.documents4j.conversion.msoffice.MicrosoftWordBridge.(MicrosoftWordBridge.java:39) ~[documents4j-transformer-msoffice-word-1.0.3.jar:na]
... 30 common frames omitted
Caused by: org.zeroturnaround.exec.ProcessInitException: Could not execute [cmd, /S, /C, ""/var/folders/bj/qz0h21d50tb1b5dx0cfh6grw0000gn/T/tmp10123923728112475785/word_start1713687405.vbs""] in /var/folders/bj/qz0h21d50tb1b5dx0cfh6grw0000gn/T/tmp10123923728112475785. Error=2, No such file or directory
at org.zeroturnaround.exec.ProcessInitException.newInstance(ProcessInitException.java:80) ~[zt-exec-1.11.jar:na]
at org.zeroturnaround.exec.ProcessExecutor.invokeStart(ProcessExecutor.java:1002) ~[zt-exec-1.11.jar:na]
at org.zeroturnaround.exec.ProcessExecutor.startInternal(ProcessExecutor.java:970) ~[zt-exec-1.11.jar:na]
at org.zeroturnaround.exec.ProcessExecutor.execute(ProcessExecutor.java:906) ~[zt-exec-1.11.jar:na]
at com.documents4j.conversion.AbstractExternalConverter.runNoArgumentScript(AbstractExternalConverter.java:72) ~[documents4j-util-transformer-process-1.0.3.jar:na]
... 34 common frames omitted
Caused by: java.io.IOException: Cannot run program "cmd" (in directory "/var/folders/bj/qz0h21d50tb1b5dx0cfh6grw0000gn/T/tmp10123923728112475785"): error=2, No such file or directory
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143) ~[na:na]
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073) ~[na:na]
at org.zeroturnaround.exec.ProcessExecutor.invokeStart(ProcessExecutor.java:997) ~[zt-exec-1.11.jar:na]
... 37 common frames omitted
Caused by: java.io.IOException: error=2, No such file or directory
at java.base/java.lang.ProcessImpl.forkAndExec(Native Method) ~[na:na]
at java.base/java.lang.ProcessImpl.(ProcessImpl.java:314) ~[na:na]
at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:244) ~[na:na]
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110) ~[na:na]
... 39 common frames omitted

�[2m2023-12-07T00:19:31.137+01:00�[0;39m �[32m INFO�[0;39m �[35m13046�[0;39m �[2m---�[0;39m �[2m[.LocalConverter]�[0;39m �[36mcom.documents4j.job.ConverterAdapter �[0;39m �[2m:�[0;39m Tried to deregister shut down hook in shut down period

java.lang.IllegalStateException: Shutdown in progress
at java.base/java.lang.ApplicationShutdownHooks.remove(ApplicationShutdownHooks.java:82) ~[na:na]
at java.base/java.lang.Runtime.removeShutdownHook(Runtime.java:245) ~[na:na]
at com.documents4j.job.ConverterAdapter.deregisterShutdownHook(ConverterAdapter.java:121) ~[documents4j-util-conversion-1.1.12.jar:na]
at com.documents4j.job.ConverterAdapter.cleanUp(ConverterAdapter.java:107) ~[documents4j-util-conversion-1.1.12.jar:na]
at com.documents4j.job.ConverterAdapter.shutDown(ConverterAdapter.java:98) ~[documents4j-util-conversion-1.1.12.jar:na]
at com.documents4j.job.LocalConverter.shutDown(LocalConverter.java:109) ~[documents4j-local-1.1.12.jar:na]
at com.documents4j.job.ConverterAdapter$ConverterShutdownHook.run(ConverterAdapter.java:134) ~[documents4j-util-conversion-1.1.12.jar:na]

Exception in thread "Shutdown hook: com.documents4j.job.LocalConverter" java.lang.NullPointerException: Cannot invoke "java.util.concurrent.ExecutorService.shutdown()" because "this.executorService" is null
at com.documents4j.job.LocalConverter.shutDown(LocalConverter.java:100)
at com.documents4j.job.ConverterAdapter$ConverterShutdownHook.run(ConverterAdapter.java:134)

UPDATE:
I've added the following dependencies as well:

com.documents4j
documents4j-util-transformer-process
1.1.12


com.documents4j
documents4j-util-all
1.1.12

But it's still failing here:
} else if (OsUtils.isMac()) {
command = new String[]{"/usr/bin/osascript", script.getAbsolutePath()};
ProcessResult res = makePresetProcessExecutor().command(command).execute();
ToIntFunction extractor = result -> Integer.parseInt(new String(result.output(), StandardCharsets.UTF_8).replaceAll("\n", ""));
exitCode = extractor.applyAsInt(res);
}

with res being empty ""

command is: [/usr/bin/osascript, /var/folders/bj/qz0h21d50tb1b5dx0cfh6grw0000gn/T/tmp15971541498883610131/word_start1394010188.vbs]

@raphw
Copy link
Contributor

raphw commented Dec 10, 2023

Can you check what OSUtil produces on your system?

@vedranstanic82
Copy link

@raphw I've switched over to another solution (openoffice jodconverter), but if you look at the end of my comment you will notice the path the code took on my mac, i went into isMac and then res was empty while command variable had a vbs script reference:

But it's still failing here:
} else if (OsUtils.isMac()) {
command = new String[]{"/usr/bin/osascript", script.getAbsolutePath()};
ProcessResult res = makePresetProcessExecutor().command(command).execute();
ToIntFunction extractor = result -> Integer.parseInt(new String(result.output(), StandardCharsets.UTF_8).replaceAll("\n", ""));
exitCode = extractor.applyAsInt(res);
}

with res being empty ""

command is: [/usr/bin/osascript, /var/folders/bj/qz0h21d50tb1b5dx0cfh6grw0000gn/T/tmp15971541498883610131/word_start1394010188.vbs]

sorry for not being of more help since i had to move on. Cheers and good luck!

@raphw
Copy link
Contributor

raphw commented Dec 21, 2023

I do not own a Mac, so this is hard to debug for me. Could you attempt s fix? It does not seem there's a lot øot missing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants