Перезапись файла другого формата в pdf (в процессе загрузки)

1. ovadia 21.02.21 11:17 Сейчас в теме
Подскажите, пожалуйста, как лучше решить следующую задачу.

Пользователь на форме приложения добавляет некоторые файлы (в основном форматов doc, docx, odt, но бывают и другие jpg, tiff, png). Необходимо, чтобы они конвертировались и перезаписывались в процессе загрузки в формат pdf. То есть, при добавлении в окне выбора файлов, пользователь, например, выбирает файл -- МойФайл.doc. Нажимает кнопку Выбрать. И файл попадает в конфигурацию уже в виде -- МойФайл.pdf.

Мое понимание идеи решения такое:
1) Для преобразования файлов word можно использовать COMОбъект Word.Application. Он вроде бы позволяет сохранять в pdf сразу, так как сохранение в pdf -- это типовая возможность MS Word.
2) Что делать с другими форматами, пока не очень понятно. Скорее всего нужно будет устанавливать конвертор toPDF и писать функцию fooConvertToPDF(myFile), где задействовать конвертер.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Aitbay 21.02.21 11:52 Сейчас в теме
устанавливать какой-нибудь pdf принтер типа biopdf подключаться к нему как к ком-обьекту и производить конвертацию
проблема возникнет со временем формирования т.е. юзеры со временем начнут жаловаться что происходят тормоза при выборе файлов. думаю затея не очень удачная то чтобы делать это на лету, лучше ночью потом уже регламентным заданием конвертировать все добавленные за день файлы
3. ovadia 21.02.21 14:22 Сейчас в теме
Попробовал первый вариант. Что-то не проходит.

1) Для преобразования файлов word можно использовать COMОбъект Word.Application. Он вроде бы позволяет сохранять в pdf сразу, так как сохранение в pdf -- это типовая возможность MS Word.

У меня MS Office 2007. Вордовский файл -- это ФайлКлиента.ПолноеИмя (размер 40Кб).


Word = Новый COMОбъект("Word.Application");
Word.Visible = 0;    
Word.Application.DisplayAlerts = False;
Документ = Word.Documents.Open(ФайлКлиента.ПолноеИмя);
Документ.Activate();
Word.Application.DisplayAlerts = -1;
ФайлДляЗаписи = ФайлКлиента.Путь + "testPDF.pdf";
Word.ActiveDocument.SaveAs(ФайлДляЗаписи);
Word.Application.Quit();
Word = NULL;
Показать


Файл PDF создается (появляется) по указанному пути. Не пустой, с размером 39Кб (что-то не то, размер pdf вроде бы должен быть больше исходника). Захожу в директорию с файлом. При попытке открыть файл выскакивает системная ошибка. См. скрин.
Прикрепленные файлы:
4. Aitbay 21.02.21 15:25 Сейчас в теме
https://yadi.sk/d/KzzY8ZtnuxMSog

загуглил конвертер с командной строки

Может работать в двух режимах:

Конвертирование текстового документа с картинками в PDF. В этом случае текст форматируется с учетом заданных габаритов листа. Шрифт не искажается.
Конвертирование картинки в PDF. В этом случае сначала будет создан текстовый документ нужного размера, а потом в его центр будет вклеена картинка.
Программа не может объединять несколько файлов в один. Если у вас много файлов, то, сначала вам придется сгенерировать из каждого отдельный PDF файл, затем склеить их одной из множества утилит, которые это могут делать.

Выгодные отличия от аналогов:

Позволяет задавать размер конечного документа.
Позволяет задавать отступ от краев.
Конвертирует также и картинки, вставляя их в листы документа.
Требования:

На сервере у вас должны стоять:

JRE (Java).
OpenOffice 3.x.
Как использовать:

В скачанном архиве есть как исходники проекта в NetBeans, так и готовый .jar файл, который можно запускать из командной строки.

Наберите в командной строке:

java -jar DocumentConverter

и получите список параметров, которые нужно задавать.

Все параметры обязательны.

Учтите, что пути к файлам задаются с префиксом: file:///

В корне архива есть файл doit.bat, в котором прописан пример вызова утилиты.

Пользуйтесь.
5. ovadia 21.02.21 19:49 Сейчас в теме
(4) Интересно. А как эту штуку прикрутить к конфигурации 1С?

1) Файловая ИБ. Устанавливаю на свою машину RE (Java), OpenOffice 3.x. Распаковываю на диск С:\ архив с конвертором.

В процедуре модуля &НаКлиенте:

RunApp("C:\mydir\doi.bat");


Так?

2) Серверная ИБ. Тогда все то же самое, только в процедуре &НаСервере?
6. user856012 13 21.02.21 20:53 Сейчас в теме
(5)
А как эту штуку прикрутить к конфигурации 1С?
Лучше прикрутить бесплатную ImageMagick:
https://infostart.ru/1c/articles/610230/
https://forum.infostart.ru/forum9/topic192766/
7. ovadia 21.02.21 20:58 Сейчас в теме
(6) ImageMagick вроде бы не всё умеет конвертировать, работает только с графическими форматами?

А вот утилита -- конвертирует DOC, RTF, TXT, HTML, ODT, XSL, JPG, PNG, GIF, TIFF и все остальное, что может открыть OpenOffice.
8. user856012 13 21.02.21 21:05 Сейчас в теме
(7)
ImageMagick вроде бы не всё умеет конвертировать, работает только с графическими форматами?
Вы по ссылкам ходили? В частности, в первой сказано:
ImageMagick конвертирует картинку в PDF, а PDFtk соединяет два файла PDF в один.

И пример кода такого преобразования там есть.

А вообще, PDF вполне может быть просто "оберткой" для картинки, что и делают большинство (если не все) конвертеров.
9. ovadia 21.02.21 21:09 Сейчас в теме
(8)
ImageMagick конвертирует картинку

Вот это мне не совсем подходит, так как мне нужно конвертировать не только картинки, а файлы DOC, RTF, TXT, HTML, ODT, XSL.
10. Aitbay 22.02.21 09:21 Сейчас в теме
в итоге получилось или нет?
если на сервере то нужно файл передавать с клиента на сервер там конвертировать, сохранять в базу (желательно в тома сохранения файлов) и потом возвращать на форму уже ссылку на файл.
11. ovadia 22.02.21 09:52 Сейчас в теме
(10) Пока экспериментирую на файловой базе. Установил JRE и OpenOffice. Однако DocumentConverter не пашет. Там по-видимому нужно какое-то шаманство. После нескольких часов безуспешных попыток запустить DocumentConverter из командной строки и батника, решил поискать другие утилиты. Или буду писать свой скрипт.
12. Aitbay 22.02.21 10:12 Сейчас в теме
а просто в командной строке проверял?
13. ovadia 22.02.21 10:19 Сейчас в теме
(12) Я пытался из cmd выполнить:
java -jar DocumentConverter
Не пошло.

Попробовал так (это у них написано в readme):
java -jar "DocumentConverter.jar"
Не пошло.
14. Aitbay 22.02.21 19:52 Сейчас в теме
java -jar dist\DocumentConverter.jar -h=300 -w=200 -m=5 -s=file:///D:/download/test.txt -d=file:///D:/test2.pdf -t=text
15. ovadia 22.02.21 20:46 Сейчас в теме
(14) Вываливается ошибка. См. скрин. Пока не пойму, как исправить.Скорее всего что-то не так с установленной JRE. Вот подобная проблема -- https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform

У меня 64-bit Windows 7. Ставил x64 JRE, которая установилась в C:\Program Files\Java\
Теперь попробую переустановить 32-bit JRE.

А дайте, пожалуйста, вывод (что у Вас на машине):
>where java
Прикрепленные файлы:
16. ovadia 22.02.21 21:27 Сейчас в теме
(15)
Теперь попробую переустановить 32-bit JRE

Супер! Заработало, если поставить обычную JRE. То есть, даже если система 64-bit, то ставить нужно НЕ 64-bit JRE.
Место установки должно быть, что-то вроде -- C:\Program Files (x86)\Java\jre1.8.0_281\bin\
После установки, нужно прописать путь в переменных окружения.
Далее проверить командой:
>where java
Нужно, чтобы в ответ была одна строка. В моем случае C:\Program Files (x86)\Java\jre1.8.0_281\bin\java.exe
Если система, кроме этой директории, обнаруживает другие директории с установленным java.exe, то нужно удалить эти директории. Чтобы в итоге команда >where java выводила ровно одну строку (один путь) с java.exe.
17. Aitbay 24.02.21 21:35 Сейчас в теме
ну отлично я у себя не проверял даже))
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот