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

от автора

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

В сети Интернет мало информации по интеграции 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~1\Java\jre6

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

Команда преобразования сборки имеет следующий вид:

ikvmc.exe -out:pdfbox.dll pdfbox-app-1.8.2.jar

На выходе получается сборка pdfbox.dll, зависящая от сборок:

IKVM.OpenJDK.Beans.dll<br /> IKVM.OpenJDK.Core.dll<br /> IKVM.OpenJDK.Jdbc.dll<br /> IKVM.OpenJDK.Media.dll<br /> IKVM.OpenJDK.Naming.dll<br /> IKVM.OpenJDK.Security.dll<br /> IKVM.OpenJDK.SwingAWT.dll<br /> IKVM.OpenJDK.Text.dll<br /> IKVM.OpenJDK.Util.dll<br /> IKVM.OpenJDK.XML.API.dll<br /> IKVM.Runtime.dll

На этом этапе виден недостаток способа, связанный с большим объемом совместно поставляемых сборок. PDFBox.dll занимает около 10 МБ, и вспомогательные сборки занимают около 18 МБ.

Выполнение простейших операций PDFBox внутри 1С

Запуск сконвертированной из JAVA сборки PDFBox.dll будет осуществляться внутри 1С через .Net Bridge.

Загрузка всех необходимых сборок:

net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.AWT.WinForms.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Beans.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Core.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Jdbc.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Media.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Naming.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Security.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.SwingAWT.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Text.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.Util.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.OpenJDK.XML.API.dll");<br /> net.LoadAssemblyFrom(ПутьКСборкам + "IKVM.Runtime.dll");<br /> <br /> net.LoadAssemblyFrom(ПутьКСборкам + "pdfbox.dll");<br />

Открыть файл Pdf:

pdf = net.CallStatic("org.apache.pdfbox.pdmodel.PDDocument", "load", ПутьКФайлу);

Получить текст из Pdf:

stripper = net.New("org.apache.pdfbox.util.PDFTextStripper");<br /> текстИзPdf = stripper.getText(pdf);

Разделить документ на одностраничные Pdf:

splitter = net.New("org.apache.pdfbox.util.Splitter");<br /> splitter.setSplitAtPage(1);<br /> массивДокументов = splitter.split(pdf).toArray();<br /> Для Индекс = 0 по массивДокументов.Length - 1 цикл<br />     массивДокументов.GetValue(Индекс).save(ПутьКФайлу + (Индекс + 1) + ".pdf");<br /> КонецЦикла;

Создать новый документ из нечетных страниц исходного Pdf:

страницы = pdf.getDocumentCatalog().getAllPages();<br /> newPdf = net.New("org.apache.pdfbox.pdmodel.PDDocument");<br /> Для Индекс = 0 по страницы.size() - 1 цикл<br />     Если Индекс % 2 = 1 Тогда<br />         Продолжить;<br />     КонецЕсли;<br />     newPdf.addPage(страницы.get(Индекс));<br /> КонецЦикла;<br /> newPdf.save(НовыйФайлPdf);

Известная проблема

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

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

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

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

Если вы знаете, пожалуйста, отпишитесь в комментариях, почему может проявляться такая проблема, и как ее можно устранить.

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

ссылка на оригинал статьи http://habrahabr.ru/post/193212/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *