Текущие просмотрщики Synergy корректно отображают файлы наиболее часто используемых форматов, таких как txt, odt/doc/docx, ods/xls/xlsx, pps/ppt/pptx, pdf, png/jpg, mp3 и т.п. Для корректного отображения более редких и специфичных форматов, например, msg, msh, dwg и т.п., а также в отдельных случаях, когда возникают проблемы с отображением файлов распространённых форматов, можно подключить собственный конвертер файлов.
Требования к конвертеру:
Вызов конвертера описывается из конфигурационного файла с параметрами:
расширение исходного файла, для которого необходима конвертация;
путь до исполняемого файла-конвертера;
расширение файла, получаемого в результате конвертации;
идентификатор внешнего модуля;
таймаут выполнения операции.
Итоговое расширение должно быть одним из указанных - pdf / htd / png / tiff / mp3 / mp4.
На одно расширение необходимо использовать только 1 конвертер.
Форматы конфигурации:
Формат конфигурационного файла
Путь к конфигурационному файлу:
/opt/synergy/jboss/standalone/configuration/ai/converter.json
{
"dwg": {
"path": "/opt/dwgconverter/bin/dwgconv.sh",
"outFormat": "pdf",
"moduleID": "6b13459e-aa3c-4a5a-94db-bb64f328e30c",
"timeout": 10,
"timeoutSinceChange": 2
},
"msg": {
"path": "/opt/msgconverter/bin/msgconv.sh",
"outFormat": "htd",
"moduleID": "6b13459e-aa3c-4a5a-94db-bb64f328e30c",
"timeout": 10,
"timeoutSinceChange": 2
}
}
где:
path - путь до исполняемого
файла-конвертера;
outFormat - расширение файла, получаемого
в результате конвертации;
moduleID - идентификатор внешнего модуля
(используется для авторизации пользователя вне сессии);
timeout - максимальное время выполнения
утилиты (в секундах);
timeoutSinceChange - максимальное время с
последнего изменения (в секундах).
Формат передачи параметров исполняемому файлу-конвертеру
util path/input.txt uuid token
где:
path/input.txt - путь до исходного файла;
uuid - идентификатор исходного файла;
token - ключ для авторизации пользователя
вне сессии, полученный из метода API rest/api/person/generate_auth_key.
Каждый параметр отделен от предыдущего пробелом. Соблюдение порядка следования параметров обязательно.
Для авторизации по Basic HTTP используются закодированные в Base64 логин и пароль, разделенные знаком “двоеточие”. Подробнее про авторизацию по ключам написано в руководстве по интеграции.
Алгоритм работы внешнего конвертера на примере
Конфигурационный файл настроен таким образом, что для расширения dwg должен вызываться конвертер dwgconv.sh.
Пользователь загружает файл somefile.dwg
в папку хранилища.
Считав с конфигурационного файла параметры и передав необходимые параметры, запускается утилита.
На каждый вызов утилиты создается своя папка в файловой системе, куда в
кладется результирующий файл out.pdf.
После окончания конвертации файл out.pdf
копируется в отдельную ноду хранилища.
При следующем открытии файла подгружается его сконвертированная версия соответствующим просмотрщиком Synergy.
При конвертации возможна запись нескольких вспомогательных файлов, из
которых и будет составлен итоговый out.pdf. В этом случае лучше использовать
timeoutSinceChange вместо timeout.
Если выполнение записи одного такого файла займет больше, чем указанное в
таймауте timeoutSinceChange время, то
процессу отправится sigterm (сигнал о прерывании).
Кроме того, если выполнение утилиты в целом займет больше, чем указанное в
таймауте timeout время, то процессу
отправится sigterm (сигнал о прерывании).
Пример
Данный конвертер переписывает все PDF-файлы, исправляя некорректные. Решение взято отсюда.
Конвертер
Конвертер нужно положить в папку, указанную в конфигурационном файле (см. ниже).
#!/bin/sh
## Setup
TMPDIR="/tmp"
# Input parameters
INFILE="$1"
OUTFILE="$(dirname $INFILE)/out/out.pdf"
# Ghostscript path
GS="/usr/bin/gs"
# Logs
LOG_MAIN="/var/log/synergy/converters.log"
LOG_STDOUT="$TMPDIR/conv-stdout$$.log"
LOG_STDERR="$TMPDIR/conv-stderr$$.log"
## Actions
# Set up logs
exec 1> "$LOG_STDOUT"
exec 2> "$LOG_STDERR"
# Create output directory
mkdir -p "$(dirname $OUTFILE)"
# Convertation
$GS \
-o "$OUTFILE" \
-sDEVICE=pdfwrite \
-dPDFSETTINGS=/prepress \
"$INFILE"
if [ $? -ne 0 ]; then
# If anything failed, append stdout to main log
cat "$LOG_STDOUT" >> "$LOG_MAIN"
fi
cat "$LOG_STDERR" >> "$LOG_MAIN"
# Cleanup
rm -f "$LOG_STDOUT" "$LOG_STDERR"
Конфигурационный файл
{
"pdf": {
"path": "/opt/synergy/utils/converters/fix-pdf.sh",
"outFormat": "pdf",
"timeout": 30,
"timeoutSinceChange": 2
}
}