有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache FOP PDF流式传输到Commons电子邮件附件

我使用ApacheFop和XSL-FO生成PDF。然后我尝试将pdf作为apache的附件进行流式传输。平民邮政HtmlEmail;我收到带有附件的电子邮件,但我收到以下错误。长度为0字节,无编码。我能够在文件系统上创建一个pdf,没有任何问题,所以我知道这段代码的FOP部分没有问题,所以我不确定为什么它不工作。有人能告诉我我错过了什么吗

我的密码

private void sendBroadcastNofications(PurchaseRequest pr) {
    try {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        //Fop sevice used to generate pdf.
        this.xmlPDFGeneratorService.generatePDF(pr, outputStream);
        byte[] bytes = outputStream.toByteArray();

        //I'm not sure if "application/pdf" would be an issue since fop is giving 
        //it the MimeConstants.MIME_PDF
        DataSource source = new ByteArrayDataSource(bytes, "application/pdf");            
        EmailAttachment attachment = new EmailAttachment(source, "purchase_requisition.pdf", "Broadcast Purcahse Requisition");

        Util.email("Purchase Request " + pr.getPrNumber(), getGenerateMessage(pr), pr.getAuthorizer().getEmail(), attachment);

    } catch (IOException ex) {
        Logger.getLogger(EmailServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
    }
}


public static void email(String subject, String message, String recipient, EmailAttachment attachment) {
    email(subject, message, Collections.singleton(recipient), Collections.singleton(attachment));
}

public static void email(String subject, String message, Set<String> recipients, Set<EmailAttachment> attachments) {
    try {
        HtmlEmail email = new HtmlEmail();

        email.setHostName("mailhost");
        email.setSubject(subject);
        email.setHtmlMsg(message);
        email.setFrom("company@domain.com");

        for (EmailAttachment attachment : attachments) {
            try {
                email.attach(attachment.getDataSource(), attachment.getName(), attachment.getDescription());
            } catch (EmailException ex) {
                System.err.println("Email Attachment Exception: " + ex.getMessage());
            }
        }

        for (String recipient : recipients) {
            email.addTo(recipient);
        }
        email.send();
    } catch (EmailException ex) {
        System.err.println("Email Failed to Send: " + ex.getMessage());
    }
}

Fop类

public class XMLPDFGeneratorServiceImpl implements XMLPDFGeneratorService {

private static final File baseDir = new File(".");
private static final File xsltfile = new File(baseDir, "./PurchaseRequestPDF.xsl");

// configure fopFactory as desired
private final FopFactory fopFactory = FopFactory.newInstance();

public void generatePDF(PurchaseRequest pr, ByteArrayOutputStream outStream) {

    // configure foUserAgent as desired
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

    try {

        // Setup output
        outStream = new ByteArrayOutputStream();

        // Construct fop with desired output format
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, outStream);

        // Setup XSLT
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));

        // Set the value of a <param> in the stylesheet
        transformer.setParameter("versionParam", "2.0");

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        generateXML(pr, stream);  

        byte[] out = stream.toByteArray(); 
        stream.close();

        ByteArrayInputStream in = new ByteArrayInputStream(out);
        // Setup input for XSLT transformation
        Source src = new StreamSource(in);

        // Resulting SAX events (the generated FO) must be piped through to FOP
        Result res = new SAXResult(fop.getDefaultHandler());

        // Start XSLT transformation and FOP processing
        transformer.transform(src, res);

    } catch (TransformerException ex) {
        Logger.getLogger(XMLPDFGeneratorServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(XMLPDFGeneratorServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
    } catch (FOPException ex) {
        Logger.getLogger(XMLPDFGeneratorServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void generateXML(PurchaseRequest pr, ByteArrayOutputStream stream) {
    try {
        // create JAXB context and instantiate marshaller
        JAXBContext context = JAXBContext.newInstance(PurchaseRequest.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        m.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
        m.marshal(pr, new PrintWriter(stream));
    } catch (JAXBException ex) {
        Logger.getLogger(XMLPDFGeneratorServiceImpl.class.getName()).log(Level.SEVERE, "JAXB Failed to produce xml stream", ex);
    }
}

}


共 (1) 个答案

  1. # 1 楼答案

    您正在覆盖generatePDF()中的扩展流,因此传入的扩展流保持为空。请删除该行,然后重试

    outStream = new ByteArrayOutputStream();