【问题标题】:how to create a pdf editor for grails如何为 grails 创建一个 pdf 编辑器
【发布时间】:2015-06-09 08:14:55
【问题描述】:

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

效果很好,但我想为用户添加更多功能,所以我想允许用户编辑 PDF 基本模板(在 gsp 页面中定义),特别是我想允许编辑模板内的文本并将其存储在某处。

有人知道怎么做吗?

【问题讨论】:

    标签: pdf grails editor gsp


    【解决方案1】:

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

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

    我就是这样开始的,也许有人有更好的主意

    【讨论】:

    • 你知道一些对普通用户来说易于使用并且可以集成到 Grails 中的一些 gsp 页面中的 HTML 编辑器吗?
    【解决方案2】:

    pdf 插件的底层组件并不严格要求 .gsp 文件。它只是使用呈现为字符串的 .gsps 并将其输入到飞碟库中。因此,您可以使用 WYSIWYG 类型编辑器来允许用户创建 html sn-ps,以某种方式保存这些字符串,然后自己将这些字符串提供给飞碟库。只需查看插件包含的服务方法即可。这听起来可能很吓人,但实际上并不是很复杂。

    当然,您可能希望使用您自己的一些 HTML 标记来包装用户生成的内容,以保持理智和样式化,但您的想法是完全可行的。

    【讨论】:

    • 你认为String是包含所有gsp页面的好类型吗?
    • 当然,String 没问题,但您可能希望将它映射到数据库级别的 varchar 以外的其他内容。在您的域中添加一个映射块,例如:static mapping = { gspContent type: 'text'}
    【解决方案3】:

    您的 GSP 可以有两种不同的行为方式。首先,GSP 将呈现为可编辑状态。在这种状态下,用户可以对 GSP 的某些部分进行一些编辑。之后,GSP 将呈现为 Preview 状态,用户可以在其中检查他在上一步中所做的修改(在此状态下无法编辑任何内容)。最后,GSP 将呈现为 PDF(使用 Grails Rendering Plugin)。

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

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

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

    下面我将展示这个解决方案的工作原理。

    普惠制

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

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

    post 变量保留用户在编辑阶段之后所做的事情。我们使用 JQuery 序列化来获取所有参数并将其传递给 Grails 控制器。

    <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>
    

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

    复选框示例:

    <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>
    

    控制器

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

    back() 动作允许用户从预览状态返回到编辑状态。这就是我们在 previewQuote() 中设置 session["paramsReport"] = params 的原因。这样做可以在 back() 中使用 session["paramsReport"] 并恢复用户更改的值。

        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)
           }
       }
    

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

    希望您了解解决方案的总体思路。我知道乍一看可能有点复杂。无论如何,是一种允许灵活满足此类要求的解决方案(即允许用户在生成 PDF 之前自定义报告)。

    【讨论】:

    • 这种解决方案是否可以作为插件或库包含在 Grails 项目中?我在哪里可以测试它?
    • @FrancescoDS,此解决方案未作为插件实现。我可以尝试做一个示例并在 Github 上分享,但是,我不能保证这些天会这样做,我现在很忙。
    • 好的,别担心......当你在 Github 上创建它时告诉我......谢谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多