Exportar tabela como arquivo PDF no ADF

Tweet about this on TwitterShare on Facebook0Share on LinkedIn6Share on Google+0

Você já aprendeu a exportar tabela como arquivos Excel e XML, agora você vai aprender a exportar tabela como um arquivo PDF usando o Apache FOP. Apache FOP (Formatting Objects Processor) é um formatador de impressão orientada por objetos de formatação XSL (XSL-FO) e um formatador independente de saída. Os formatos de saída atualmente suportados incluem PDF, PS, PCL, AFP, XML, Print, AWT, PNG, RTF e TXT.

Faça o download do aplicativo de amostra: ADFPDFApp.zip.

Antes de tudo, precisamos transformar os dados de funcionários para XML.
Para conseguir isso, olhe este post: Export table as XML file in ADF.

Com algumas mudanças, nós seremos capazes de exportar a tabela como um arquivo PDF.
Vá para as propriedades do projeto ViewController e adicione as libs do Apache FOP.

export-table-as-a-pdf-file-in-adf1

export-table-as-a-pdf-file-in-adf2

Crie um PDF Template (XML file) na pasta Web Content/stylesheets e nomeie como employeesfo.xsl.
Copie o seguinte código dentro do arquivo employeesfo.xsl.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" exclude-result-prefixes="fo" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
  <!--=========================-->
  <!--root element: Employees-->
  <!--=========================-->
  <xsl:template match="Employees">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="simpleA4">
        <fo:flow flow-name="xsl-region-body">
          <fo:block font-size="16pt" font-weight="bold" space-after="5mm">Employees</fo:block>
          <fo:block font-size="10pt">
            <fo:table table-layout="fixed" width="100%" border-collapse="separate">
              <fo:table-column column-width="4cm"/>
              <fo:table-column column-width="4cm"/>
              <fo:table-column column-width="4cm"/>
              <fo:table-column column-width="4cm"/>
              <fo:table-header text-align="center" background-color="silver" font-weight="bold">
                <fo:table-row>
                  <fo:table-cell padding="1mm" border-style="solid">
                    <fo:block>ID</fo:block>
                  </fo:table-cell>
                  <fo:table-cell padding="1mm" border-style="solid">
                    <fo:block>First Name</fo:block>
                  </fo:table-cell>
                  <fo:table-cell padding="1mm" border-style="solid">
                    <fo:block>Last Name</fo:block>
                  </fo:table-cell>
                  <fo:table-cell padding="1mm" border-style="solid">
                    <fo:block>Job Id</fo:block>
                  </fo:table-cell>
                </fo:table-row>
              </fo:table-header>
              <fo:table-body>
                <xsl:apply-templates select="Employee"/>
              </fo:table-body>
            </fo:table>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
  <!--=========================-->
  <!--child element: Employee-->
  <!--=========================-->
  <xsl:template match="Employee">
    <fo:table-row>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="EmployeeId"/>
        </fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="FirstName"/>
        </fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="LastName"/>
        </fo:block>
      </fo:table-cell>
      <fo:table-cell>
        <fo:block>
          <xsl:value-of select="JobId"/>
        </fo:block>
      </fo:table-cell>
    </fo:table-row>
  </xsl:template>
</xsl:stylesheet>

export-table-as-a-pdf-file-in-adf3

Adicione dois métodos dentro classe EmployeesBean para obter o template do PDF e gerar o arquivo PDF.
Abra a classe EmployeesBean e adicione o seguinte código:

private static String TEMPLATE_PDF_EMPLOYEES = "stylesheets/employeesfo.xsl";

private static FopFactory fopFactory = FopFactory.newInstance();

private static TransformerFactory tFactory = TransformerFactory.newInstance();

private InputStream getTemplate(String template) {
  FacesContext facesContext = FacesContext.getCurrentInstance();
  return facesContext.getExternalContext().getResourceAsStream(template);
}

private void convertDOM2PDF(Node xml, InputStream template, OutputStream out) {
  try {
    // configure foUserAgent as desired
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

    try {
      // Construct fop with desired output format and output stream
      Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

      // Setup Identity Transformer
      TransformerFactory factory = TransformerFactory.newInstance();
      Transformer transformer = factory.newTransformer(new StreamSource(template));

      // Setup input for XSLT transformation
      Source src = new DOMSource(xml);

      // 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);
    } finally {
      out.close();
    }

  } catch (Exception e) {
    e.printStackTrace(System.err);
  }
}

export-table-as-a-pdf-file-in-adf4

Renomeie o método exportSelectedRowsToXML para exportSelectedRowsToPDF.
Remova o bloco try-catch do método exportSelectedRowsToPDF e adicione o seguinte código:

try {
  convertDOM2PDF(rs.writeXML(0, XMLInterface.XML_OPT_ALL_ROWS), getTemplate(TEMPLATE_PDF_EMPLOYEES), outputStream);
} catch (Exception e) {
  e.printStackTrace();
}

export-table-as-a-pdf-file-in-adf5

Renomeie o método exportAllRowsToXML para exportAllRowsToPDF.
Remova o bloco try-catch do método exportAllRowsToPDF e adicione o seguinte código:

try {
  convertDOM2PDF(vo.writeXML(0, XMLInterface.XML_OPT_ALL_ROWS), getTemplate(TEMPLATE_PDF_EMPLOYEES), outputStream);
} catch (Exception e) {
  e.printStackTrace();
}

export-table-as-a-pdf-file-in-adf6

A página empView.jsf contém uma tabela de funcionários e dois botões para exportar linhas como arquivo PDF.
Vá para a aba source e altere as propriedades das tags af:fileDownloadActionListener.

export-table-as-a-pdf-file-in-adf7

Agora, quando você executar a aplicação, você pode exportar todas as linhas como um arquivo PDF.

export-table-as-a-pdf-file-in-adf8

Você pode exportar apenas as linhas selecionadas como um arquivo PDF, também.

export-table-as-a-pdf-file-in-adf9

Tweet about this on TwitterShare on Facebook0Share on LinkedIn6Share on Google+0

Autor: Waslley Souza

Consultor Oracle com foco em tecnologias Oracle Fusion Middleware e SOA. Certificado Oracle WebCenter Portal, Oracle ADF e Java.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *