2013-06-11 2 views
1

У меня есть набор объектов, которые я хочу распечатать в формате pdf в шаблоном формате. Я попытался напечатать коллекцию в формате PDF, используя следующий код, но я не вижу никакого текста, отображаемого в PDF после создания файла.Как печатать массив в pdf с помощью xsl FO

код Java выглядит следующим образом:

FopFactory fopFactory = FopFactory.newInstance(); 
OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("/home/myfile.pdf"))); 
try { 
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); 
TransformerFactory factory = TransformerFactory.newInstance(); 
Transformer transformer = factory.newTransformer(); 
    Eden[] ed=new Eden[3]; 
    for(int i=0;i<ed.length;i++) 
    { 
     ed[i]=new Eden(); 
    ed[i].setBlow(String.valueOf(i)); 
    } 
Source src = new StreamSource(new File("/home/tables.fo")); 
Result res = new SAXResult(fop.getDefaultHandler()); 
transformer.setParameter("dep", ed); 
transformer.transform(src, res); 
} finally { 
out.close(); 
} 

Файл Ф.О. выглядит следующим образом:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xsl="http://www.w3.org /1999/XSL/Transform"> 
    <fo:layout-master-set> 
    <fo:simple-page-master master-name="my-page"> 
    <fo:region-body margin="0.5in"/> 
</fo:simple-page-master> 
</fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
<fo:flow flow-name="xsl-region-body" font="7pt Times"> 
    <fo:block border="thin solid black" text-align="center"> 
    <xsl:for-each select="dep"> 
     {$blow} 
    </xsl:for-each> 
</fo:block> 
</fo:flow> 
    </fo:page-sequence> 
</fo:root> 
+0

То, что у вас есть, не является надлежащим файлом FO. '' - это XSLT, а не XSL-FO. – mzjn

+0

Я хочу написать программу, не используя теги xsl, и я прочитал, что эту переменную можно прочитать, открыв перед ними в fo файлы ... Я попытался установить коллекцию (т. Е. Arraylist в setparameter трансформатора), но я не хочу умеет читать, что в FO.Can вы, пожалуйста, расскажите мне, как читать в синтаксисе FO ... – juan

ответ

1

Там нет никакого способа вывода значений с помощью XSL- F (ormatting) O (bjects). example you're using на самом деле не выполняет преобразования XSLT, которое требуется для передачи значений в таблицу стилей.

Следующий код будет делать то, что вы хотите, единственное отличие от кода является XSLT преобразование:

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.FileOutputStream; 

import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.sax.SAXResult; 
import javax.xml.transform.stream.StreamSource; 

import org.apache.fop.apps.FOPException; 
import org.apache.fop.apps.Fop; 
import org.apache.fop.apps.FopFactory; 
import org.apache.fop.apps.MimeConstants; 


public class test { 

    public static void main(String[] args) throws FOPException, TransformerException, IOException 
    { 
    /*..*/ 

    // Step 1: Construct a FopFactory 
    // (reuse if you plan to render multiple documents!) 
    FopFactory fopFactory = FopFactory.newInstance(); 

    // Step 2: Set up output stream. 
    // Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams). 
    OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("F:/myfile.pdf"))); 

    try 
    { 
     // Step 3: Construct fop with desired output format 
     Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); 

     // Step 5: Setup input and output for XSLT transformation 
     // Setup input stream 

     Source xsltSource = new StreamSource(new File("F:/myfile.xsl")); 
     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(xsltSource); 

     int[] array = {1,2,3}; 
     transformer.setParameter("test", "1234"); 
     transformer.setParameter("testRaw", array); 

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

     transformer.transform(xsltSource, res); 

    } 
    finally 
    { 
     out.close(); 
    } 
    } 

} 

Теперь, чтобы использовать параметр в вашем XSL таблицы стилей (myfile.xsl для меня), это должны будут выглядеть следующим образом:

<xsl:stylesheet version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="test"/> 
    <xsl:param name="testRaw"/> 
    <xsl:template match="/"> 
     <fo:root> 
      <fo:layout-master-set> 
      <fo:simple-page-master master-name="my-page"> 
      <fo:region-body margin="0.5in"/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
      <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body" font="7pt Times"> 
      <fo:block border="thin solid black" text-align="center"> 
       <xsl:value-of select="$test"/> 
      </fo:block> 
      <fo:block break-before="page" border="thin solid black" text-align="center"> 
       <xsl:value-of select="$testRaw"/> 
      </fo:block> 
     </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 
</xsl:stylesheet> 

Эта таблица стилей определяет два параметра: «тест» и «testRaw», которые и выводятся на две отдельные страницы. Для этого вы используете <xsl:value-of select="$paramName"/>.

В коде, который я опубликовал, два значения были строкой и массивом из int. ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Вы можете просто передать любой класс в таблицу стилей и ожидать, что XSL-трансформатор узнает об этом. Это не будет работать. Обычно параметры, переданные в таблицу стилей, считаются строковыми значениями. If you pass anything else, you need to make sure your stylesheet and transformer can actually handle it.

Запустите код на своем компьютере и посмотрите, что написано на второй странице: это просто тарабарщина, так как таблица стилей и трансформатор не могут обрабатывать массив int. Если вам действительно нужно обрабатывать данные из пользовательского класса, я бы предложил передать значения, которые вам действительно нужны, в таблицу стилей как (конкатенированные) строки.