当前位置: 首页 > 知识库问答 >
问题:

如何为grails创建pdf编辑器

马峻
2023-03-14

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

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

有人知道怎么做吗?

共有3个答案

冷翼
2023-03-14

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

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

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

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

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

普惠制

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

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

post变量保留用户在编辑阶段之后所做的操作。我们使用JQuery serialize获取所有参数,并将其传递给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>

textArea是该系统的一个特定标记库,用于呈现WYSWYG编辑器,您可以将其替换为一个简单的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()是从序列化(通过JQuery)GSP的所有参数的AJAX调用中调用的。

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

该解决方案由wanderson santos开发(https://stackoverflow.com/users/128857/wanderson-santos)还有我。

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

满博
2023-03-14

pdf插件的底层组件并不严格要求。gsp文件。它只是使用。GSP渲染为字符串,并将其馈送到flyingsaucer库中。因此,您可以使用所见即所得类型编辑器,允许用户创建html片段,以某种方式保存这些字符串,然后自己将其提供给flyingsaucer libs。以插件中包含的服务方法为例。这听起来可能很吓人,但其实并不复杂。

当然,出于理智和样式的目的,您可能希望用自己的一些超文本标记语言包装用户生成的内容,但您所追求的想法是完全可行的。

秦新立
2023-03-14

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

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

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

 类似资料:
  • 我正在使用PDF小丑(在C#中)生成一个PDF文件,包含图形(线,多边形和圆)在不同的层。现在我遇到了一个问题,我在互联网上搜索了几天,但找不到解决方案。 我有以下问题:如何确保PDFClown生成的PDF可以使用其他应用程序进行编辑/修改,例如Blue Beam或Adobe Acrobat?目前,生成的PDF看起来不错,但我无法选择和修改任何图形(线,多边形等)在任何层。 PDFClown生成以

  • 我正在寻找一些关于使用模型在django admin上创建一个“仅创建”字段的解决方案。我以前看到过一些问题,但没有人能回答核心问题:当用户在管理面板上创建时,字段应该出现,但我不希望能够编辑。 models.py admin.py “readonly_fields”解决了以后编辑时的问题,但在创建时却导致了禁止。 问题:我使用这个字段来做一个散列,我不想再做这个改变…我曾想过使用第二个字段,在创

  • 问题内容: 有谁知道用PHP编辑PDF的好方法?最好是开源/零许可证费用方法。:) 我是否正在考虑打开PDF文件,替换PDF中的文本然后写出PDF的修改版本? 我过去曾使用FPDF以编程方式创建PDF文件,但有时发现它有些笨拙。 问题答案: 如果您采用“填空”方法,则可以将文本精确地定位在页面上的任何位置。因此,将丢失的文本添加到文档中相对容易(即使不是很乏味)。例如,使用Zend Framewo

  • 我试图在对话框中创建一个编辑文本框,用于输入密码。当我在做的时候,我不能做。我是这方面的初学者。请帮我做这件事。 形象 我想得到作为

  • 了解如何在 Dreamweaver 模板中创建和删除可编辑区域。 可编辑模板区域控制在基于模板的页面中用户可以编辑哪些区域。在插入可编辑区域之前,将要插入该区域的文档另存为模板。 注意:如果您是在文档而不是模板文件中插入可编辑区域,则会收到警告,告诉您该文档将自动另存为模板。 您可以将可编辑区域置于页面的任意位置,但如果要使表格可编辑,您需要考虑以下几点: 可以将整个表格或单独的表格单元格标记为可

  • 问题内容: 目前,我正在用Java创建XML文件,并通过使用XSL / XSLT进行转换将其显示在JSP页面中。现在,我需要获取该XML文件并在PDF中显示相同的信息。有什么办法可以通过使用某种XSL文件来做到这一点? 我已经看过iText Java-PDF库,但是找不到任何将其用于XML和样式表的方法。 任何帮助将不胜感激。提前致谢! 问题答案: 您可以使用XSL格式对象。这里有一些很好的文章,