Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheFop可以';无法获取写入正确字节的pdf_Java_Apache Fop_Websphere Portal - Fatal编程技术网

Java ApacheFop可以';无法获取写入正确字节的pdf

Java ApacheFop可以';无法获取写入正确字节的pdf,java,apache-fop,websphere-portal,Java,Apache Fop,Websphere Portal,我正在尝试生成一个pdf下载文件。我有以下代码从xml和xsl-fo生成pdf。谁能告诉我代码中缺少了什么。当我打开pdf时,它会显示已损坏,如果我使用notepad++打开该文件,所有内容都会显示为[B@4bf24bf2在文件中 public void generatePDF(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException { PortletConte

我正在尝试生成一个
pdf
下载文件。我有以下代码从
xml
xsl-fo
生成pdf。谁能告诉我代码中缺少了什么。当我打开pdf时,它会显示已损坏,如果我使用
notepad++
打开该文件,所有内容都会显示为
[B@4bf24bf2
在文件中

public void generatePDF(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException {

        PortletContext portletContext = resourceRequest.getPortletSession().getPortletContext();

        URL url = portletContext.getResource("/WEB-INF/xsd/xsl-fo.xsl");

        File xsltfile = new File(url.getPath());

        StreamSource source = new StreamSource(new File(portletContext.getResource("/WEB-INF/xsd/service.xml").getPath()));

        StreamSource transformSource = new StreamSource(xsltfile);

        // Construct FopFactory
        FopFactory fopFactory = FopFactory.newInstance();

        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

        // Create ByteArrayOutputStream
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();

        // Setup JAXP using identity transformer
        TransformerFactory tfactory = TransformerFactory.newInstance();             
        Transformer xslfoTransformer;

        try {           

            xslfoTransformer = tfactory.newTransformer(transformSource); // identity transformer            

            Fop fop;

            try {

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

                Result res = new SAXResult(fop.getDefaultHandler());

                try {
                    xslfoTransformer.transform(source, res);

                    byte[] pdfBytes = outStream.toByteArray();
                    resourceResponse.setContentLength(pdfBytes.length);
                    resourceResponse.setContentType("application/pdf");
                    resourceResponse.addProperty("Content-Disposition", "attachment;filename=fleetevents.pdf");                 
                    resourceResponse.getWriter().print(pdfBytes);
                    resourceResponse.getWriter().flush();

                } catch (TransformerException exception ) {
                    logger.log(Level.SEVERE, exception.getMessage(), exception);

                }

            } catch (FOPException fopException) {
                logger.log(Level.SEVERE, fopException.getMessage(), fopException);

            }
        }  catch(TransformerConfigurationException exception) {
            logger.log(Level.SEVERE, exception.getMessage(), exception);

        } catch(TransformerFactoryConfigurationError  exception) {
            logger.log(Level.SEVERE, exception.getMessage(), exception);

        } 

    }
我的示例xml

<?xml version="1.0" encoding="iso-8859-1"?>
<services>
    <service>
        <serviceId>11111</serviceId>
        <openDate>2012-02-16</openDate>
        <closeDate>2012-02-16</closeDate>
        <orderStatus>Status2</orderStatus>
        <description>INSPECT MACHINE</description>
        <repairCost>$266.76</repairCost>
    </service>
    <service>
        <serviceId>11111</serviceId>
        <openDate>2012-02-16</openDate>
        <closeDate>2012-02-16</closeDate>
        <orderStatus>Status1</orderStatus>
        <description>INSPECT MACHINE</description>
        <repairCost>$266.76</repairCost>
    </service>
</services>

11111
2012-02-16
2012-02-16
状态2
检查机器
$266.76
11111
2012-02-16
2012-02-16
状态1
检查机器
$266.76
还有我的示例xsf-fo.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output encoding="iso-8859-1" />
<xsl:template match ="services">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="service">
                <fo:region-body></fo:region-body>
            </fo:simple-page-master>
        </fo:layout-master-set>

        <fo:page-sequence master-reference="service">
            <fo:flow flow-name="xsl-region-body">
                <fo:block>
                    <fo:table>
                        <fo:table-body>
                            <fo:table-row>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Service Id</fo:block>
                                </fo:table-cell>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Open Date</fo:block>
                                </fo:table-cell>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Close Date</fo:block>
                                </fo:table-cell>                                    
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Order Status</fo:block>
                                </fo:table-cell>                                    
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Description</fo:block>
                                </fo:table-cell>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Repair Cost</fo:block>
                                </fo:table-cell>
                            </fo:table-row>
                            <xsl:for-each select="./service">
                                <fo:table-row>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="serviceId" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="openDate" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="closeDate" /></fo:block>
                                    </fo:table-cell>                                
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="orderStatus" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="description" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="repairCost" /></fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </xsl:for-each>
                        </fo:table-body>
                    </fo:table>
                </fo:block>
            </fo:flow>
        </fo:page-sequence>
    </fo:root>
</xsl:template>
</xsl:stylesheet>

服务Id
开放日期
截止日期
订单状态
描述
修理费
更新

我想我明白了,我需要使用
resourceResponse.getPortletOutputStream().write(pdfBytes);

resourceResponse.getPortletOutputStream().flush();
而不是
resourceResponse.getWriter().print(pdfBytes);resourceResponse.getWriter().flush();

查看getWriter()与getPortletOutputStream()的定义,getWriter似乎将返回一个只向响应写入文本的PrintWriter

而PortletOutputStream将写入二进制数据。由于您的xml中有许多特殊字符,我猜Printwriter可能无法完成此工作,PortletOutputStream将成功: