В сети Интернет мало информации по интеграции Java и 1С. Тем не менее, есть интересные Java-проекты, работу которых хотелось бы оценить внутри 1С. Apache PDFBox – один из таких популярных проектов. Так сложилось, что файлы pdf являются очень распространенными, а 1С не имеет хороших средств работы с данным форматом. Предложенный здесь способ состоит в том, чтобы через утилиту IKVM.NET перевести JAVA-библиотеку в .Net-сборку, а затем использовать эту сборку внутри 1С средствами интеграции.
Apache PDFBox – это библиотека Java для работы с PDF-документами. Позволяет выполнять операции: извлечение текста, печать PDF, слияние и разделение документов, преобразование в изображение, заполнение форм, создание PDF, проверка PDF/A, интеграция с Lucene Search Engine.
IKVM.Net – это виртуальная машина Java для Mono / .Net framework и позволяет конвертировать библиотеку Java в сборку .Net, а затем обращаться к библиотеке средствами .Net framework. IKVM.Net содержит много вспомогательных сборок, отвечающих за различные классы Java.
Конвертация Jar в dll-сборку
На данном шаге предполагается, что IKVM.Net установлен на компьютере.
Перед конвертацией Jar-библиотеки в сборку .Net framework необходимо установить Java Runtime Engine ипрописать переменную окружения JAVA_HOME:
JAVA_HOME C:\Progra~1\Java\jre6
Команда преобразования сборки имеет следующий вид:
ikvmc.exe -out:pdfbox.dll pdfbox-app-1.8.2.jar
На выходе получается сборка pdfbox.dll, зависящая от сборок:
IKVM.OpenJDK.Beans.dll
IKVM.OpenJDK.Core.dll
IKVM.OpenJDK.Jdbc.dll
IKVM.OpenJDK.Media.dll
IKVM.OpenJDK.Naming.dll
IKVM.OpenJDK.Security.dll
IKVM.OpenJDK.SwingAWT.dll
IKVM.OpenJDK.Text.dll
IKVM.OpenJDK.Util.dll
IKVM.OpenJDK.XML.API.dll
IKVM.Runtime.dll
На этом этапе виден недостаток способа, связанный с большим объемом совместно поставляемых сборок. PDFBox.dll занимает около 10 МБ, и вспомогательные сборки занимают около 18 МБ.
Выполнение простейших операций PDFBox внутри 1С
Запуск сконвертированной из JAVA сборки PDFBox.dll будет осуществляться внутри 1С через .Net Bridge.
Загрузка всех необходимых сборок:
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.AWT.WinForms.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Beans.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Core.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Jdbc.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Media.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Naming.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Security.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.SwingAWT.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Text.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Util.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.XML.API.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.Runtime.dll");
net.LoadAssemblyFrom(ПутьКСборкам + "pdfbox.dll");
Открыть файл Pdf:
pdf = net.CallStatic("org.apache.pdfbox.pdmodel.PDDocument", "load", ПутьКФайлу);
Получить текст из Pdf:
stripper = net.New("org.apache.pdfbox.util.PDFTextStripper");
текстИзPdf = stripper.getText(pdf);
Разделить документ на одностраничные Pdf:
splitter = net.New("org.apache.pdfbox.util.Splitter");
splitter.setSplitAtPage(1);
массивДокументов = splitter.split(pdf).toArray();
Для Индекс = 0 по массивДокументов.Length - 1 цикл
массивДокументов.GetValue(Индекс).save(ПутьКФайлу + (Индекс + 1) + ".pdf");
КонецЦикла;
Создать новый документ из нечетных страниц исходного Pdf:
страницы = pdf.getDocumentCatalog().getAllPages();
newPdf = net.New("org.apache.pdfbox.pdmodel.PDDocument");
Для Индекс = 0 по страницы.size() - 1 цикл
Если Индекс % 2 = 1 Тогда
Продолжить;
КонецЕсли;
newPdf.addPage(страницы.get(Индекс));
КонецЦикла;
newPdf.save(НовыйФайлPdf);
Оставьте свой комментарий!
Добавить комментарий
|