Apache FOP вызывает ошибку «Недостаточно памяти» при загрузке - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь сгенерировать PDF-файл, используя Apache FOP. В процессе я получаю ответ из базы данных в виде списка объектов. Проблема моего подхода в том, что мой XSL-файл работает нормально с небольшим набором данных, но не может генерировать PDF с большим DataSet я получаю OutOfMemoryError GC Превышен лимит перегрузки. В связи с этим я увеличил размер кучи с 512-4Gb, но проблема до сих пор не решена. Для получения дополнительной информации, пожалуйста, найдите мой фрагмент кода ниже

FOUserAgent userAgent = fopFactory.newFOUserAgent(); 
Fop fop = this.fopFactory.newFop(MimeConstants.MIME_PDF, userAgent, out); 
TransformerFactory factory = TransformerFactory.newInstance(); 
Transformer transformer = factory.newTransformer(new StreamSource(xslFile)); 
Source src = new StreamSource(xmlFile); 
Result res = new SAXResult(fop.getDefaultHandler()); 
transformer.transform(src, res); 

XSL-файл

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <xsl:template match="ticketVo">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="page"
                page-height="11in" page-width="8.5in" margin-left="0.45in"
                margin-right="0.6in" margin-top="0.25in" margin-bottom="0.25in">
                <fo:region-body region-name="xsl-region-body" />
                <fo:region-before region-name="xsl-region-before" />
                <fo:region-after region-name="xsl-region-after" />
            </fo:simple-page-master>
        </fo:layout-master-set>

        <fo:page-sequence master-reference="page"
            initial-page-number="1" id="myseq">
            <fo:static-content flow-name="xsl-region-after">
                <fo:block text-align="end" font-size="10pt" font-family="serif"
                    line-height="14pt">
                    Page
                    <fo:page-number />
                    of
                    <fo:page-number-citation-last ref-id="myseq" />
                </fo:block>
            </fo:static-content>
            <fo:flow flow-name="xsl-region-body">                    
                <fo:block>
                    <fo:block font-size="8pt">
                        <fo:table table-layout="fixed" width="100%"
                            border-collapse="collapse">                           
                            <fo:table-header border-bottom="1pt solid black">
                                <fo:table-row>
                                    <fo:table-cell padding-left="3pt"
                                    background-color="lightgrey" height="0.25in" display-align="center">
                                    <fo:block background-color="lightgrey" margin-bottom="1mm"
                                        font-weight="bold">T1</fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell background-color="lightgrey"
                                        height="0.25in" display-align="center">
                                        <fo:block background-color="lightgrey" margin-bottom="1mm"
                                            font-weight="bold">T2</fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell background-color="lightgrey"
                                        height="0.25in" display-align="center">
                                        <fo:block background-color="lightgrey" margin-bottom="1mm"
                                            font-weight="bold">T3</fo:block>
                                    </fo:table-cell>
                                    .
                                    .
                                    .
                                    .
                                    .
                                    .
                                    .
                                </fo:table-row>
                           </fo:table-header>

                            <fo:table-body>
                               <xsl:call-template name="cols"></xsl:call-template>
                            </fo:table-body>
                        </fo:table>
                    </fo:block>
                </fo:block>
            </fo:flow>
        </fo:page-sequence>
    </fo:root>
</xsl:template>

<xsl:template match="cols">
 <xsl:for-each select="obj">
    <fo:table-row>
       <fo:table-cell display-align="center" padding="0pt">
              <fo:block>
                <xsl:value-of select="t1" />
           </fo:block>
       </fo:table-cell>
        <fo:table-cell display-align="center" padding="0pt">
            <fo:block text-align="right">
               <xsl:value-of select="t2" />
            </fo:block>
        </fo:table-cell>
        . 
        .
        .
        .
        .

    </fo:table-row>
 </xsl:for-each>
</xsl:template>
</xsl: stylesheet>

И TicketVo для сопоставления xml

@XmlRootElement (name = "ticketVo")

    public class TicketVo
    {


        @XmlElement
        private List<Ticket> obj;

        //setters and getters


    }

Билет Модель

Class Ticket{

private String t1;
private String t2;
.
.
.
.
private String t100;
//setters & getters
}

ПРИМЕЧАНИЕ: Из базы данных я получаю тысячи записей, и моя таблица содержит более 80 столбцов версия apache-fop = 2.3

...