2015-06-09 1 views
0

В моем проекте Grails я использую плагин PDF для создания PDF-файлов с страницы gsp.Как создать pdf-редактор для grails

Он работает хорошо, но я хотел бы добавить больше функций для пользователей, поэтому я хотел бы разрешить пользователю редактировать основной шаблон PDF (определенный на странице gsp), в частности, я хотел бы разрешить редактирование текст внутри шаблона и сохранить его где-нибудь.

Никто не знает, как это можно сделать?

ответ

1

Если вы хотите изменить текст, вы можете сохранить отредактированный текст в базе данных с идентификатором пользователя и загрузить его на страницу gsp вместо стандартного текста.

Если вы также хотите изменить стиль страницы, вы можете попытаться сохранить всю страницу gsp в базе данных и позволить пользователю редактировать ее с помощью Редактора HTML.

, что, как я хотел бы начать с того, может быть, кто-то имеет лучшее представление о

+0

Знаете ли вы какой-нибудь HTML-редактор, который прост в использовании для обычного пользователя и может быть интегрирован на какую-нибудь страницу gsp в Grails? – FrancescoDS

1

Основополагающие компоненты в формате PDF плагина строго не требуют файла .gsp. Он просто использует .gsps, отображаемые как строки, и передает их в папку flyingsaucer. Таким образом, вы можете использовать редактор типов WYSIWYG, чтобы позволить пользователям создавать html-фрагменты, сохранять эти строки каким-то образом, а затем кормить их, хотя и для самих flyingsaucer. просто посмотрите на включенные методы обслуживания плагина для примера. Это может показаться страшным, но это действительно не очень сложно.

Возможно, вы захотите обернуть созданный пользователем контент своей собственной разметкой HTML для здравомыслия и стилизации, но идея, которую вы идете, вполне выполнима.

+0

Считаете ли вы, что String - хороший тип, содержащий всю страницу gsp? – FrancescoDS

+0

Конечно, Строка в порядке, но вы можете сопоставить ее с чем-то другим, кроме варчара на уровне БД. В вашем домене добавьте блок отображения, например: 'static mapping = {gspContent type: 'text'}' – aeischeid

1

У вас может быть GSP, который ведет себя по-разному. Прежде всего, GSP будет отображаться в редактируемом состоянии. В этом состоянии пользователь может выполнять некоторые изменения в некоторых частях GSP. После этого GSP будет отображаться в состоянии предварительного просмотра, где пользователь может проверить изменения, которые он сделал на предыдущем шаге (ничто не может быть отредактировано в этом состоянии). Наконец, GSP будет отображаться как PDF (с использованием плагина Grails Rendering).

Обратите внимание, что пользователь не будет редактировать сам GSP. Вы должны разрешить ему редактировать, например, HTML-элементы в виде текстовых областей. В этом случае мы используем редактор WYSWYG. Этот редактор позволяет пользователю помещать текст как жирный, курсив и т. Д.

Поэтому самым важным шагом этого решения является отличать два состояния в одном и том же GSP. Для этого вы можете использовать логическую переменную (например, редактирование). Эта переменная, если она истинна, отобразит GSP с элементами, которые позволят ему выполнить изменения в документе. Для другой стороны, если переменная редактирования является ложной, GSP будет отображаться только с текстами, не допуская какого-либо редактирования.

Пользователь может установить или снять флажки (чтобы показать или скрыть часть документа) и записать или изменить тексты в элементах текстовых областей.

Ниже я покажу, как это решение работает.

ГСП

ГСП шаблон ГСП и называется _quote.gsp

Часть кода ниже показывает использование переменной редактирования. Обратите внимание, что если edit = 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 является специфическим TagLib этой системы и используется для отображения редактора 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() вызывается из вызова AJAX, который сериализует (с помощью JQuery) все параметры ГСП.

Действие назад() позволяет пользователю вернуться в состояние редактирования из состояния предварительного просмотра. Вот почему мы установили session ["paramsReport"] = params внутри previewQuote(). Таким образом можно использовать session ["paramsReport"] внутри back() и восстановить значения, измененные пользователем.

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-Сантоса (https://stackoverflow.com/users/128857/wanderson-santos) и меня.

Надеюсь, вы понимаете общую идею решения. Я понимаю, что это может быть немного сложным при первом взгляде. Во всяком случае, это решение, которое обеспечивает гибкость для такого рода требований (то есть позволяет пользователю настраивать отчет до создания PDF-файла).

+0

Является ли это решением доступным как плагин или библиотека для включения в проект Grails? Где я могу его проверить? – FrancescoDS

+0

@FrancescoDS, это решение не реализовано как плагин. Я мог бы попытаться сделать пример и поделиться им с Github, однако я не могу обещать, что в эти дни я очень занят. – cantoni

+0

ОК, не волнуйтесь ... дайте мне знать, когда вы создали его на Github ... спасибо за вашу помощь! – FrancescoDS