首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为grails创建pdf编辑器

如何为grails创建pdf编辑器
EN

Stack Overflow用户
提问于 2015-06-09 16:14:55
回答 3查看 318关注 0票数 0

在我的Grails项目中,我使用PDF插件从gsp页面生成PDF。

它工作得很好,但我想添加更多的功能给用户,所以我想允许用户编辑的PDF基本模板(定义在一个gsp页面),特别是我想允许编辑模板内的文本,并将其存储在某个地方。

谁知道这是怎么做到的呢?

EN

回答 3

Stack Overflow用户

发布于 2015-06-09 16:42:16

如果您只想更改文本,则可以使用用户id将编辑后的文本存储在数据库中,并将其加载到gsp页面中,而不是标准文本。

如果您还想更改页面的样式,可以尝试将整个gsp页面存储在数据库中,并让用户使用HTML编辑器对其进行编辑。

这就是我开始的方式,也许有人有更好的想法

票数 1
EN

Stack Overflow用户

发布于 2015-06-10 01:08:56

pdf插件的底层组件并不严格需要.gsp文件。它简单地使用呈现为字符串的.gsps,并将这些字符串提供给flyingsaucer库。所以你可以使用WYSIWYG类型编辑器来允许用户创建html代码片段,以某种方式保存这些字符串,然后自己将这些字符串提供给flyingsaucer库。只需查看插件包含的服务方法即可获得一个示例。这听起来可能很可怕,但实际上并不是很复杂。

当然,出于理智和样式的目的,您可能希望将用户生成的内容包装在您自己的HTML标记中,但是您的想法是完全可行的。

票数 1
EN

Stack Overflow用户

发布于 2015-06-10 01:17:36

你可以有一个GSP,它有两种不同的行为方式。首先,GSP将呈现为可编辑状态。在这种状态下,用户可以在GSP的某些部分进行一些编辑。之后,GSP将以预览状态呈现,用户可以检查他在上一步中所做的修改(在此状态下不能编辑任何内容)。最后,GSP将呈现为PDF (使用Grails呈现插件)。

请注意,用户不会编辑GSP本身。例如,您需要允许他通过HTML元素作为文本区域进行编辑。在这种情况下,我们使用WYSWYG编辑器。此编辑器允许用户将文本设置为粗体、斜体等。

因此,这个解决方案中最重要的一步是区分同一GSP中的两种状态。要做到这一点,您可以使用布尔变量(例如,称为编辑)。如果此变量为true,则将呈现带有允许他在文档中执行更改的元素的GSP。另一方面,如果编辑变量为false,则GSP将仅使用文本呈现,不允许任何类型的编辑。

用户可以选中或取消选中复选框(以显示或隐藏文档的某些部分),并在文本区域元素中写入或更改文本。

下面我将展示这个解决方案是如何工作的。

GSP

GSP是一个模板GSP,称为_quote.gsp。

下面的代码片段显示了编辑变量的用法。请注意,如果editing = true,则呈现文本区域,并且用户可以编辑文本。有一个可以更改的标准文本。

post变量保存用户在编辑阶段之后所做的工作。我们使用JQuery serialize来获取所有参数,并将其传递给Grails控制器。

代码语言:javascript
复制
<p>
    <g:if test="${editing}">
        <pgs:textArea html="true" autosize="true" name="fraseInicial" rows="2" cols="80">
            ${post?.fraseInicial?post.fraseInicial:"Conforme sua solicitação, a empresa tem a satisfação de informar-lhe os métodos e preços."}
        </pgs:textArea>
    </g:if>
    <g:else>
        ${post.fraseInicial}
    </g:else>
</p>

TextArea是该系统的一个特定标记库,用于呈现所见即所得编辑器,您可以将其替换为简单的TextArea HTML元素。

带有复选框的示例:

代码语言:javascript
复制
<g:if test="${editing || post.temPrazoAnalise}">
    <h1>
        Teste teste
    </h1>
    <g:if test="${editing}"><g:checkBox name="temPrazoAnalise" value="${!post?true:post?.temPrazoAnalise == null?false:true}"/></g:if>
    <g:if test="${editing || post.temPrazoAnalise}">
        <p>Teste teste teste </p>
    </g:if>
</g:if>

控制器

从一个AJAX调用中调用previewQuote(),该调用序列化(通过JQuery) GSP的所有参数。

back()操作允许用户从预览状态返回到编辑状态。这就是为什么我们在previewQuote()中设置会话“paramsReport”= params的原因。通过这种方式,可以在back()中使用会话“paramsReport”并恢复用户更改的值。

代码语言:javascript
复制
    def editQuote() {
        def quote = Quote.get(params.id)
        render(template: "/quote/report/quote", model: [editing:true, quote:quote])
    }


    def previewQuote() {
      Quote quote = Quote.get(params.id)          
      session["paramsReport"] = params        
      render(template: "/quote/report/quote", model: [quote:quote, post:params])
    }


    def back() {
      def quote = Quote.get(params.id)

      if (session["paramsReport"]) {
          render(template: "/quote/report/quote", model: [editing:true, post:session["paramsReport"], quote:quote])
      }
    }

    def generateQuote() {
      Quote quote = Quote.get(params.id)
      def f = new  File(grailsApplication.mainContext.servletContext.getRealPath("/app/temp/${quote.code}.pdf"))

       if (f.exists())
           f.delete()

       f.withOutputStream { os ->
        pdfRenderingService.render([template: '/quote/report/quote', model: [quote:this, post:session["paramsReport"], pdf:true]], os)
       }
   }

这个解决方案是由wanderson-santos (https://stackoverflow.com/users/128857/wanderson-santos)和我共同开发的。

我希望您能理解解决方案的总体思路。我明白,乍一看,这可能有点复杂。无论如何,这是一种允许这种需求的灵活性的解决方案(即允许用户在生成PDF之前自定义报告)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30726505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档