Сохранить документ Lotus Notes в формат HTML не открывая документ на просмотр оказалось задачей нетривиальной.
Первая очевидная проблема — наличие вычисляемого текста и полей вычисляемых при открытии документа. Имеется несколько способов конвертации документа стандартными средствами:
- Использовать DXL преобразование;
- Использовать команду notesDocument .RenderToRTItem( notesRichTextItem )
- Использовать Domino сервер скачав документ по HTTP
Первые два пункта достаточно трудоемки, Вам надо перед преобразованием, найти все поля которые вычисляются при открытии и вычислить их, потом скопировать все переменные из основного документа во временный, а только потом, сделать преобразование.
Рассмотрим третий вариант, при доступе к документу по HTTP выполняются все вычисления, но тут тоже есть момент, агент выполняется от имени того, кто его подписал, а следовательно если есть секции или поля вычисляемые на основании роли пользователя, то документ будет отображать неверно. Обычно, если планируют использовать архивирование, то при проектировании закладывают роль [AdminArchiv] для разрешения этой проблемы.
Для решения задачи получения документа по HTTP мы пишем java библиотеку. Одним из плюсов, это возможность использовать логин и пароль, что позволяет получить документ под разными уровнями доступа.
import java.io.*; import java.net.*; import sun.misc.BASE64Encoder; public class GetHTML { public String getHTML(String urlToRead, String username, String password) { URL url; // The URL to read HttpURLConnection conn; // The actual connection to the web page BufferedReader rd; // Used to read results from the web page String line; // An individual line of the web page HTML String result = ""; // A long string containing all the HTML try { url = new URL(urlToRead); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); String userpass = username + ":" + password; BASE64Encoder encoder = new BASE64Encoder(); String encodedStr = encoder.encode(userpass.getBytes()); String basicAuth = "Basic " + encodedStr; conn.setRequestProperty ("Authorization", basicAuth); rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); while ((line = rd.readLine()) != null) { result += line; } rd.close(); } catch (Exception e) { e.printStackTrace(); } return result; } }
Далее пишем LotusScript агент
Use "GetHTML" Sub Initialize Dim js As JAVASESSION Dim getHTMLClass As JAVACLASS Dim getHTMLObject As JavaObject Dim html As String Dim url As String Set js = New JAVASESSION Set getHTMLClass = js.GetClass("GetHTML") Set getHTMLObject = getHTMLClass.CreateObject url = "http://server/replicid/0/" & doc.Universalid html = getHTMLObject.getHTML(url, "UserName", "Password") Dim fileNum As Integer Dim fileName As String fileName = "c:\\temp\\demo.html" fileNum% = FreeFile() Open fileName$ For Output As fileNum% Print #fileNum%, html Close fileNum% End Sub
После получения HTML файла можно его преобразовать в PDF или отправить на хранение в архив.