【问题标题】:streaming iText pdf directly to lotus email using xpages使用 xpages 将 iText pdf 直接流式传输到 Lotus 电子邮件
【发布时间】:2013-07-26 11:43:50
【问题描述】:

我正在尝试将新生成的 pdf(使用 itext)作为附件直接流式传输到 lotus notes 电子邮件的正文。但我在从字节设置电子邮件正文时遇到以下错误

"com.ibm.jscript.types.GeneratedWrapperObject$StaticField incompatible with com.ibm.jscript.types.FBSValue"

以下是我完成的代码(放置在 xpage 的按钮中)。任何帮助将不胜感激

    session.setConvertMIME(false);

outputStream:java.io.ByteArrayOutputStream = new java.io.ByteArrayOutputStream();
writePdf(outputStream);
var bytes = outputStream.toByteArray();
var inputStream:java.io.ByteArrayInputStream = new java.io.ByteArrayInputStream(bytes);

var db:NotesDatabase= session.getDatabase("","mail.box")

if (!db.isOpen()) {
    print ("No mailbox!")
}
else
{
    var doc:NotesDocument=db.createDocument()
    doc.replaceItemValue("Form","Memo")
    doc.replaceItemValue("From",context.getUser().getCommonName())
    doc.replaceItemValue("Principal",context.getUser().getCommonName())
    doc.replaceItemValue("SendTo","a@b.com");
    doc.replaceItemValue("Recipients","a@b.com");
    doc.replaceItemValue("CopyTo","a@b.com");

    doc.replaceItemValue("INetFrom","b@c.com");
    var strFileName="temp.pdf"

    var body:NotesMIMEEntity = doc.createMIMEEntity('Body');
    var hdr:NotesMIMEHeader = body.createHeader("Subject");
    hdr.setHeaderValAndParams("Subject")
    hdr=body.createHeader("MIME-Version")
    hdr.setHeaderValAndParams("1.0")
    body.setPreamble("multipart message in MIME")

    var child1:NotesMIMEEntity= body.createChildEntity()

    hdr = child1.createHeader("Content-Disposition")
    hdr.setHeaderValAndParams('attachment; filename="test.pdf"')
    var stream:NotesStream = session.createStream();
    stream.setContents(inputStream)
    child1.setContentFromBytes(stream, "application/pdf", body.ENC_IDENTITY_BINARY)
    child1.encodeContent(body.ENC_BASE64)
    doc.closeMIMEEntities(true,"Body")

    doc.save(true, true);
    // Restore conversion
    session.setConvertMIME(true);       
}
    function writePdf(outputStream) {

    var document:com.itextpdf.text.Document = new com.itextpdf.text.Document();
    var writer = com.itextpdf.text.pdf.PdfWriter.getInstance(document,outputStream);

    document.open();

    document.addTitle("Test PDF");
    document.addSubject("Testing email PDF");
    document.addKeywords("iText, email");
    document.addAuthor("Author");
    document.addCreator("Creator");

    var passChunk:com.itextpdf.text.Chunk = new com.itextpdf.text.Chunk("Hello");   
    document.add(new com.itextpdf.text.Paragraph(passChunk));

    document.close();
}

【问题讨论】:

    标签: xpages xpages-ssjs


    【解决方案1】:

    编写一个小型 Java 包装类可能会更好。 对于初学者,您需要:

       var stream:NotesStream = session.createStream();
       stream.setContents(inputStream);
       stream.setPosition(0);
    

    所以流在开头。

    更新
    你还有:
    var bytes = outputStream.toByteArray();
    var inputStream:java.io.ByteArrayInputStream = new java.io.ByteArrayInputStream(bytes); stream.setContents(inputStream);

    我要写的地方:

       var bytes = outputStream.toByteArray();
       stream.write(bytes);
    

    不过,还是用 Java 做一个助手。

    注意:iText 已获得 GPL 许可。除非您构建的应用程序仅供内部使用,否则您需要购买商业许可证或 GPL 您的代码。查看Apache PDFBox 的替代方法

    【讨论】:

    • 嗨斯蒂芬,感谢您的回答。我做了流的定位,但仍然在 child1.setContentfromByte(.... in stack trace.
    • 尝试使用简单的 Java 包装类,这样您就不会陷入 SSJS 的自动转换尝试中。并尝试从您的代码中删除流 - 上面更新了答案
    • 谢谢斯蒂芬。正如建议的那样,它确实通过使用 java wrapper 类从代码中切出流来工作
    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2018-02-15
    相关资源
    最近更新 更多