Save Lotus Notes Document to HTML


Сохранить документ Lotus Notes в формат HTML не открывая документ на просмотр оказалось задачей нетривиальной.

Первая очевидная проблема — наличие вычисляемого текста и полей вычисляемых при открытии документа. Имеется несколько способов конвертации документа стандартными средствами:

  1. Использовать DXL преобразование;
  2. Использовать команду notesDocument .RenderToRTItem( notesRichTextItem )
  3.  Использовать 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 или отправить на хранение в архив.