Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Интеграция Java и 1С через IKVM.Net на примере Apache PDFBox

Anna | 4.06.2014 | нет комментариев
В сети Интернет немного информации по интеграции Java и 1С. Тем не менее, есть увлекательные Java-планы, работу которых хотелось бы оценить внутри 1С. Apache PDFBox – один из таких знаменитых планов. Так сложилось, что файлы pdf являются дюже распространенными, а 1С не имеет отличных средств работы с данным форматом. Предложенный тут метод состоит в том, Дабы через утилиту IKVM.NET перевести JAVA-библиотеку в .Net-сборку, а после этого применять эту сборку внутри 1С средствами интеграции.

Apache PDFBox– это библиотека Java для работы с PDF-документами. Разрешает исполнять операции: извлечение текста, печать PDF, слияние и распределение документов, реформирование в изображение, заполнение форм, создание PDF, проверка PDF/A, интеграция с Lucene Search Engine. В примере использована версия 1.8.2.

IKVM.Net – это виртуальная машина Java для Mono и .Net framework. IKVM.Net разрешает конвертировать библиотеку Java в сборку .Net и после этого обращаться к библиотеке средствами .Net framework. IKVM.Net содержит много вспомогательных сборок, отвечающих за разные классы Java. В примере применяется версия 7.2.4630.5.

Конвертация Jar в dll-сборку

На данном шаге предполагается, что IKVM.Net 7.2.4630.5 установлен на компьютере.

Перед конвертацией Jar-библиотеки в сборку .Net framework нужно установить Java Runtime Engine и прописать переменную окружения JAVA_HOME:

JAVA_HOME C:Progra~1Javajre6

Переменная окружения JAVA_HOME

Команда реформирования сборки имеет дальнейший вид:

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);

Нерешенная задача

Невзирая на то, что простейшие операции отработали удачно, осталась нерешенной задача реформирования страницы/документа в файлы изображений.

ТипИзображения = net.GetStatic("java.awt.image.BufferedImage", "TYPE_INT_ARGB");
imageWriter = net.New("org.apache.pdfbox.util.PDFImageWriter");
success = imageWriter.writeImage(pdf, "png", "", 1, 3, "document-img", ТипИзображения, 96);

Вышеприведенный код приводит к некорректному итогу текста в файл изображения. Результирующий png-файл выглядит дальнейшим образом. Текст выведен дюже мелким шрифтом в левом верхнем углу картинки.

Ошибка вывода PDFBox

Архив материалов к статье: Java1C.zip (14,36 mb)

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB