2011-01-12 6 views
0

ここで私の問題の解決策を見つけられなかったかもしれません。私はStackOverflowを組み合わせることで正しい方向に私を押し込むことを望んでいます。Apache FOPのPreviewDialogを実際に表示するにはどうすればよいですか?

私の問題は以下の通りです。私は、メッセージングシステムのユーザーエージェントの印刷プレビュー部分を開発しています。特定のXSLTテンプレートが与えられ、XMLを変換した後に、Formatting Objectsドキュメントが生成されます。 Apache FOPでは、FO文書をPDFにレンダリングすることができました。これはすべて上質で良いですが、印刷プレビューダイアログにも表示したいと思います。 Apache FOPにはPreviewDialogというクラスがあり、そのコンストラクタにはFOUserAgentが生成でき、Renderableインタフェースを実装するオブジェクトが必要です。

Renderableインターフェイスには、InputHandlerと呼ばれるFOPパッケージ内に1つの実装クラスがあり、そのコンストラクタで標準のio Fileオブジェクトが使用されます。今ここで問題が始まります。現在、FOドキュメントを一時ファイルとして保存していて、FileオブジェクトをInputHandlerインスタンスに渡してからPreviewDialogに渡します。ダイアログが私の画面上に表示され、ステータスバーの下部に沿ってドキュメントが生成されていると表示され、それだけが表示されます。

ここで私が使用しようとしているコードです。これはプロダクションコードではないので、それほどかわいいわけではありません。

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Random; 

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

import org.apache.fop.apps.FOPException; 
import org.apache.fop.apps.FOUserAgent; 
import org.apache.fop.apps.Fop; 
import org.apache.fop.apps.FopFactory; 
import org.apache.fop.cli.InputHandler; 
import org.apache.fop.render.awt.viewer.PreviewDialog; 

public class PrintPreview { 

    public void showPreview(final File xslt, final File xmlSource) { 
     boolean err = false; 
     OutputStream out = null; 
     Transformer transformer = null; 

     final String tempFileName = this.getTempDir() 
       + this.generateTempFileName(); 
     final String tempFoFile = tempFileName + ".fo"; 
     final String tempPdfFile = tempFileName + ".pdf"; 
     System.out.println(tempFileName); 

     final TransformerFactory transformFactory = TransformerFactory 
       .newInstance(); 
     final FopFactory fopFactory = FopFactory.newInstance(); 

     try { 
      transformer = transformFactory 
        .newTransformer(new StreamSource(xslt)); 
      final Source src = new StreamSource(xmlSource); 
      out = new FileOutputStream(tempFoFile); 
      final Result res = new StreamResult(out); 

      transformer.transform(src, res); 
      System.out.println("XSLT Transform Completed"); 
     } catch (final TransformerConfigurationException e) { 
      err = true; 
      e.printStackTrace(); 
     } catch (final FileNotFoundException e) { 
      err = true; 
      e.printStackTrace(); 
     } catch (final TransformerException e) { 
      err = true; 
      e.printStackTrace(); 
     } finally { 
      if (out != null) { 
       try { 
        out.close(); 
       } catch (final IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

     System.out.println("Initializing Preview"); 
     transformer = null; 
     out = null; 
     final File fo = new File(tempFoFile); 
     final File pdf = new File(tempPdfFile); 

     if (!err) { 

      final FOUserAgent ua = fopFactory.newFOUserAgent(); 
      try { 
       transformer = transformFactory.newTransformer(); 
       out = new FileOutputStream(pdf); 
       out = new BufferedOutputStream(out); 

       final Fop fop = fopFactory.newFop(
         MimeConstants.MIME_PDF, ua, 
          out); 

       final Source foSrc = new StreamSource(fo); 
       final Result foRes = new SAXResult(fop.getDefaultHandler()); 

       transformer.transform(foSrc, foRes); 

       System.out.println("Transformation Complete"); 

     } catch (final FOPException e) { 
      err = true; 
      e.printStackTrace(); 
     } catch (final FileNotFoundException e) { 
      err = true; 
      e.printStackTrace(); 
     } catch (final TransformerException e) { 
      err = true; 
      e.printStackTrace(); 
     } finally { 
      if (out != null) { 
       try { 
        out.close(); 
       } catch (final IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

     if (!err) { 
      System.out.println("Attempting to Preview"); 
      final InputHandler inputHandler = new InputHandler(fo); 

      PreviewDialog.createPreviewDialog(ua, inputHandler, true); 
     } 
    } 

    // perform the clean up 
    // f.delete(); 

} 

private String getTempDir() { 

    final String p = "java.io.tmpdir"; 

    return System.getProperty(p); 

} 

private String generateTempFileName() { 
    final String charset = "abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890"; 
    final StringBuffer sb = new StringBuffer(); 
    Random r = new Random(); 
    int seed = r.nextInt(); 
    r = new Random(seed); 
    for (int i = 0; i < 8; i++) { 
     final int n = r.nextInt(71); 
     seed = r.nextInt(); 
     sb.append(charset.charAt(n)); 
     r = new Random(seed); 
    } 

    return sb.toString(); 
} 

} 

これについての助けがあれば助かります。

答えて

1

答えは、Apache FOPでプレビューダイアログを使用しようとするのをやめ、代わりにPDFPagePanelクラスを使用して印刷プレビューを生成して変更を表示します。

0

createPreviewDialogは実際に私がツールバーに を表示され、デバッグおよびFOP INFボタンを非表示に美しい道を見つけることができませんでした

FopFactory fopFactory = FopFactory.newInstance(); 
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); 
    AWTRenderer renderer = new AWTRenderer();  
    renderer.setPreviewDialogDisplayed(false); 
    foUserAgent.setRendererOverride(renderer); 
    renderer.setUserAgent(foUserAgent); 
    PreviewDialog previewDlg = PreviewDialog.createPreviewDialog(foUserAgent, null, false); 
    renderer.setStatusListener(previewDlg); 
    renderer.clearViewportList(); 

    TransformerFactory transformFactory = TransformerFactory.newInstance(); 

    Transformer transformerFo = transformFactory.newTransformer(new StreamSource(xslt)); 
    FileOutputStream fileoutFo = new FileOutputStream(tempFoFile); 
    BufferedOutputStream outFo = new BufferedOutputStream(fileoutFo); 
    transformerFo.transform (new StreamSource(xml),new StreamResult(outFo)); 

    Transformer transformerPdf = transformFactory.newTransformer(); 
    FileOutputStream fileoutPdf = new FileOutputStream(tempPdfFile); 
    BufferedOutputStream outPdf = new BufferedOutputStream(fileoutPdf); 

    final Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, 
             foUserAgent, outPdf); 
    Source srcPdf = new StreamSource(fo); 
    Result resPdf = new SAXResult(fop.getDefaultHandler()); 
    transformerPdf.transform(srcPdf, resPdf); 
+0

ありがとうございました。私はまだ試してみる機会がありませんでした。現在私は自分自身のソリューションを使用しています。一度コードをリファクタリングして解決策を変えてみてください。 PDFBoxのパネルは大丈夫ですが、とてもうまく表示されません。私はFOPが物事を少し良くすることを望んでいます。 – JRSofty

1

PDFに変換する前に作成する必要があります。私は自分自身のPreviewDialogを作成する必要がありました.FopDialogは主にfopに基づいていましたが、この2つのボタンはありませんでした。

関連する問題