ここで私の問題の解決策を見つけられなかったかもしれません。私は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();
}
}
これについての助けがあれば助かります。
ありがとうございました。私はまだ試してみる機会がありませんでした。現在私は自分自身のソリューションを使用しています。一度コードをリファクタリングして解決策を変えてみてください。 PDFBoxのパネルは大丈夫ですが、とてもうまく表示されません。私はFOPが物事を少し良くすることを望んでいます。 – JRSofty