1

本当にばかげたものが必要ですが、行き詰まっています。基本的に、gsp ページをレンダリングし、レンダリングをサーバー側で web-app/ の下に作成したフォルダー内にローカルに保存する必要があります。

基本的にこれの出力:

    render(view: "report-test") 

web-app/report/ にあるフォルダー内の例 report-test.html としてファイルに保存する必要があります。

良いアドバイスはありますか?

どうもありがとう

更新 - 説明 皆さん、どうもありがとうございました。私がやろうとしていることを説明させてください。うまくいけば、より良い解決策があります。私はまだgrailsの初心者です。PDF の作成に役立つ print-css および Price ソフトウェアを使用して、レポートを印刷しようとしています。だから私の考えは、gspを使用してHTMLファイルを動的に作成し、print-cssルールに従ってサーバー側にローカルに保存し、pdfファイルを作成してpdfファイルを元に戻すコマンドを(価格で)実行することでしたブラウザ。

更新 css を使用する必要がありますが、html 内で使用するのではなく、Price ソフトウェア コマンドの一部として使用する必要があります。http://www.princexml.com/ したがって、基本的にレンダリングされた gps は、css が適用されていない html であり、コマンドを実行して pdf を作成するときに、適用する css ファイルを指定します。例として:

     prince -s pdf-styles.css book.html builds/book.pdf

更新/2 - 閉じる

shutgunNinja に感謝します。以下の投稿で彼の疑似コードを参照してください。ここで使用するコードは次のとおりです。

class YourController {
   def printHtml() {
       render(view: "report-test")
   }
   def buildReport() {
        String basePath = applicationContext.getResource("/").getFile().toString()
        def url = new URL("http://localhost:8080/PrjName/report/printHtml)
        def data = url.getText()
        def file = new File("${basePath}/reportFolder/report.html")
        file.createNewFile()
        FileUtils.writeStringToFile(file, data)
    }
}

以前に shutgunNinja が書いたように、URL を呼び出して html ファイルを取得する buildReport() を呼び出します。いくつかのアドバイスを追加したいと思います。

  • Spring Security などのセキュリティ フレームワークを使用している場合は注意してください。認証なしでそのページを呼び出せる必要があります。そうしないと、要求したファイルの代わりにログイン ページが表示されます。
  • web-appディレクトリにアクセスするための正しいアドレスを保存したベースパス変数を追加します
4

2 に答える 2

1

レンダリングは、HttpResponse の出力ストリームに対して行われます。次のように見つかります。 response.outputStream

あなたができることの1つは、「応答」オブジェクトをoutputStream = StringOutputStreamまたはFileOutputStreamを持つものと交換することです。

レスポンス pojo で何らかの「出力」操作を呼び出す前に、このスワップを実行してください。

更新: ブラウザによってレンダリングされた出力が必要なようです (css を有効にするためなど)。

サーバー上でそのようなレンダリングを行うことはできません。サーバー上で PDF レポートを作成する最善の方法は、Java で PDF を作成するにあります。

于 2015-05-14T15:26:08.347 に答える
1

さて、あなたがやろうとしていることは理解できたと思います。コメントで私が言ったことをより詳細に説明しようと思います. これがこれに最適なアプローチかどうかはわかりませんが、他に選択肢がない場合は、これを試してみます。

要件:

report()GSP ページを (たとえば を介して) レンダリングするController メソッド (たとえば ) の出力を取得し、render(view: "report-test")それを HTML ファイルとしてサーバーに保存します。

アプローチ:

  • ページをレンダリングする保持report()とそのロジック。
  • buildReport()それ自体では何もレンダリングせず、他のページに転送する別の Controller メソッド (たとえば、) を作成します。
  • このbuildReport()メソッドで、 にマップされた URL のコンテンツを取得し、report()それらをファイルとして保存します。

擬似コード:

class YourController {
    def report() {
        // Handle input, generate data for populating page
        render(view: "report-test")
    }
    def buildReport() {
        // Indirectly call report(), passing whatever data is needed as URL parameters manually
        def url = new URL("/path/to/action?arg1=" + params.arg1)
        def data = url.getText()
        def file = new File("/web-app/report/report.html")
        file.createNewFile()
        FileUtils.writeStringToFile(file, data)
    }
}

このコードをテストして、動作するかどうかを確認していないことに注意してください。変更はほぼ確実に行う必要がありますが、要点を理解する必要があります。

EDIT : OP が編集で述べたように、ログイン フィルタリングに使用しているセキュリティ システムはreport()、ログイン画面が表示されないように無視するように設定する必要があります。同じことがリダイレクト フィルタにも当てはまります。このアプローチは、言語やツールキットに関係なく、通常、HTTP リダイレクトまたは転送ではうまくいきません。

于 2015-05-14T16:37:11.277 に答える