Статьи

ColdFusion + Java = Легко, Быстро и Мощно

Многие разработчики ColdFusion знают, что в основе ColdFusion лежит Java. Лично я никогда не писал ни одной строки Java, но я воспользовался этой возможностью, интегрировав некоторые проекты Java в мой код ColdFusion. Одним из примеров такой интеграции является мой проект PPTUtils . PPTUtils использует HSLF, который является подпроектом более крупного и широко признанного проекта Apache POI . Вот краткое определение HSLF со страницы проекта:

HSLF — это чистая Java-реализация проекта формата файлов Powerpoint ’97 (-2007) на Java. Он не поддерживает новый формат файлов PowerPoint 2007 .pptx, который не основан на OLE2.

HSLF позволяет читать презентации PowerPoint и извлекать из них текст. Он также предоставляет некоторые (в настоящее время ограниченные) возможности редактирования.

Таким образом, по своей сути HSLF позволяет пользователям взаимодействовать с файлами PowerPoint. Довольно круто, но становится круче.

Интеграция Java с ColdFusion довольно проста. Если у вас есть доступ, вы можете просто поместить файлы JAR в путь к классам ColdFusion и перезапустить ColdFusion. Вы также можете использовать Java Class Loader ( мой любимый был написан Марком Манделем ) для динамической загрузки ваших библиотек Java.

Использовать библиотеку HSLF Java в моем проекте было просто. Я удалил последнюю версию Apache POI в свой проект и создал простой ColdFusion Component (CFC), который загружает классы и предоставляет супер простой API для чтения файлов PowerPoint (включая подробное форматирование / макет) и извлечения простого текста или метаданных. По сравнению с примерами реализации в Java мне нравится думать, что код ColdFusion для преобразования / чтения файла PowerPoint теперь намного проще. Ниже приведен пример кода , показывающий , как легко создать результаты , как этого с помощью ColdFusion.

<!--- get the path to the ppt --->
<cfset pptFile = expandPath("verity.ppt") />
<!--- create the pptutils object --->
<cfset pptutils = createObject("component", "pptutils.com.pptutils").init() />
<!--- get the ppt in html format --->
<cfset ppt = pptutils.readPowerPoint(pathToPPT=pptFile) />
<html>
<head>
</head>
<body>
<!---
<cfdump var="#ppt#">
<cfabort>
--->

<cfset imgStruct = structNew() />

<cfoutput>
<cfloop from="1" to="#arrayLen(ppt)#" index="i">
<cfset slide = ppt[i] />
<cfset imgName = "" />

<cfif len(slide.slideBackgroundImage.imgData) and listFindNoCase(getWriteableImageFormats(), slide.slideBackgroundImage.imgType)>
<cfset imgAsBase64 = toBase64(slide.slideBackgroundImage.imgData) />
<cfset findImgArr = structFindValue(imgStruct, imgAsBase64) />

<cfif not arrayLen(findImgArr)>
<cfset imgName = "bg_" & structCount(imgStruct) + 1 & "." & slide.slideBackgroundImage.imgType />
<cfset structInsert(imgStruct, imgName, imgAsBase64)>
<cfset bgImg = imageNew(slide.slideBackgroundImage.imgData) />
<cfset ImageScaleToFit(bgImg, slide.slideWidth, slide.slideHeight) />
<cfset imgDest = expandPath(imgName) />
<cfimage action="write" source="#bgImg#" destination="#imgDest#" overwrite="true" />
<cfelse>
<cfset imgName = findImgArr[1].key />
</cfif>
</cfif>

<div style="position:relative; height:#slide.slideHeight#px;width:#slide.slideWidth#px;background: url(#imgName#) no-repeat;"><!--- this div represents a slide --->
<!--- textboxes --->
<cfloop from="1" to="#arrayLen(slide.textBoxes)#" index="j">
<cfset tBox = slide.textBoxes[j] />
<div style="position:absolute; left:#tBox.x#px; top:#tBox.y#px; height:#tBox.height#px; width:#tBox.width#px;">
<cfloop from="1" to="#arrayLen(tBox.textSpans)#" index="k">
<cfset tSpan = tBox.textSpans[k] />
<div style="color:rgb(#tSpan.fontColor#); font-family:#tSpan.fontFamily#; font-size:#tSpan.fontSize#; font-weight:#tSpan.fontWeight#; text-align:#tSpan.textAlign#; text-decoration:#tSpan.textDecoration#;">
#repeatString(repeatString(" ", 3), tSpan.indentLevel)#<!--- <cfif len(tSpan.bulletChar)>#chr(tSpan.bulletChar)#</cfif> --->
#tSpan.text#
</div>
</cfloop>
</div>
</cfloop>
<!--- images --->
<cfloop from="1" to="#arrayLen(slide.images)#" index="k">
<cfset img = slide.images[k] />
<cfif listFindNoCase(getReadableImageFormats(), img.imgType)>
<cfset i = imageNew(img.imgdata) />
<cfset imageResize(i,img.width, img.height )>
<div style="position:absolute; left:#img.x#px; top:#img.y#px;">
<cfimage action="writeToBrowser" source="#i#">
</div>
</cfif>
</cfloop>
</div><!--- end slide --->
</cfloop>
</cfoutput>

</body>
</html>

Помните, я говорил, что становится еще круче? В последнем крупном выпуске ColdFusion (версия 8) представлен простой набор тегов, упрощающий создание динамических SWF-презентаций. Набор тегов (<cfpresentation>, <cfpresenter> и <cfpresentationslide>) позволяет просто обернуть сгенерированный HTML и получить потрясающую презентацию SWF (которую можно записать на диск или сгенерировать на лету).

Ссылки на все мои демонстрации, показанные выше (плюс еще несколько), смотрите на моей демонстрационной странице . Проект PPTUtils можно загрузить с RIAForge .