Вопрос по struts2, java, itext, java-ee, pdf – Генерация PDF с использованием iText в Struts-2: поток типа результата не работает

4

Мое требование заключается в создании PDF-файла с помощью iText, я использую приведенный ниже код для создания образца PDF

Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
document.open();
document.add(new Paragraph("success PDF FROM STRUTS"));
document.close();
ServletOutputStream outputStream = response.getOutputStream() ;
baos.writeTo(outputStream);
response.setHeader("Content-Disposition", "attachment; filename=\"stuReport.pdf\"");
response.setContentType("application/pdf");
outputStream.flush();
outputStream.close();

Если вы видите в приведенном выше коде, iText не использует какой-либо параметр inputStream, скорее он пишет прямо в ответ 'выходной поток. Принимая во внимание, что struts-2 обязывает нас использовать параметр InputStream (см. Конфигурацию ниже)


    
        inputStream
        application/pdf
        attachment;filename="sample.pdf"
        1024
    

Я знаю, что мой класс должен иметь геттеры и сеттеры для inputStream, и у меня это тоже есть в классе, упомянутом в Struts-Configuration.

private InputStream inputStream;
public InputStream getInputStream() {
    return inputStream;
}

public void setInputStream(InputStream inputStream) {
    this.inputStream = inputStream;
}

Но так как iText недействительно нужен входящий поток, а он пишет прямо в ответs outputtream, я получаю исключения, так как я не устанавливаю ничего для параметра inputStream.

Пожалуйста, дайте мне знать, как использовать код iText в Struts-2, имеющий resultType в качестве потока

Спасибо

Да чайтанья .. ты прав. Я получаю незаконное исключение состояния, прося меня проверить <имя параметра = "InputName "> Arun
Вы можете создать входной поток из выходного потока:setInputStream(new ByteArrayInputStream(baos.toByteArray())); rees
НажмитеВот а такжеВот для решений с использованием Дейва Ньютонапредложение. silver
я удалил свой ответ. Кажется, я был неправ. как сказал я не знаком со стойками PermGenError
вы получаете незаконное государственное исключение ?? PermGenError

Ваш Ответ

2   ответа
2
Главный ответ:

return NONE или жеreturn null как объясняется в документации по Apache:

возвратеActionSupport.NONE (или NULL) из метода класса действия приводит к пропуску обработки результатов. Это полезно, если действие полностью обрабатывает обработку результата, такую как запись непосредственно в OutputStream HttpServletResponse.

Источник: http://struts.apache.org/release/2.2.x/docs/result-configuration.html

Пример: O»

Рейли предлагает учебник поДинамическое создание PDF-файлов в веб-приложении используя сервлеты (S.C. Sullivan, 2003). Его можно преобразовать в класс действий Struts2, как показано ниже.

Хорошо иметь вспомогательный класс вродеPDFGenerator создать PDF для вас и вернуть его как.ByteArrayOutputStream

PDFGenerator учебный класс:

import java.io.ByteArrayOutputStream;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

public class PDFGenerator {

    public ByteArrayOutputStream generatePDF() throws DocumentException {

        Document doc = new Document();
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();            
        PdfWriter pdfWriter = PdfWriter.getInstance(doc, baosPDF);

        try {           
            doc.open();         

            // create pdf here
            doc.add(new Paragraph("Hello World"));

        } catch(DocumentException de) {
            baosPDF.reset();
            throw de;

        } finally {
            if(doc != null) {
                doc.close();
            }

            if(pdfWriter != null) {
                pdfWriter.close();
            }
        }

        return baosPDF;
    }
}

Теперь вы можете назвать это в своем классе действий.

ViewPDFAction учебный класс:::

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.yoursite.helper.PDFGenerator;
import com.opensymphony.xwork2.ActionSupport;

public class ViewPDFAction extends ActionSupport
    implements ServletResponseAware {

    private static final long serialVersionUID = 1L;    
    private HttpServletResponse response;

    @Override
    public String execute() throws Exception {

        ByteArrayOutputStream baosPDF = new PDFGenerator().generatePDF();    
        String filename = "Your_Filename.pdf"; 

        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition",
            "inline; filename=" + filename); // open in new tab or window           
        response.setContentLength(baosPDF.size());

        OutputStream os = response.getOutputStream();
        os.write(baosPDF.toByteArray());
        os.flush();
        os.close();
        baosPDF.reset();

        return NONE; // or return null
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {
        this.response = response;       
    }
}

web.xml

<mime-mapping>
    <extension>pdf</extension>
    <mime-type>application/pdf</mime-type>
</mime-mapping>

struts.xml

<action name="viewpdf" class="com.yoursite.action.ViewPDFAction">
    <!-- NO CONFIGURATION FOR RESULT NONE -->
</action>
Отлично работает wander
Обновленный ответ для генерации PDF. silver
4

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

например, ваш класс действий таким образом

Class ExportReportAction extends ActionSupport {
  public void exportToPdf() { // no return type
    try {
        Document document = new Document();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();
        document.add(new Paragraph("success PDF FROM STRUTS"));
        document.close(); 
        ServletOutputStream outputStream = response.getOutputStream() ; 
        baos.writeTo(outputStream); 
        response.setHeader("Content-Disposition", "attachment; filename=\"stuReport.pdf\""); 
        response.setContentType("application/pdf"); 
        outputStream.flush(); 
        outputStream.close(); 
    }catch (Exception e) {
        //catch
    }

  } 
}

и получи конфигурацию распорок таким образом

<action name="exportReport" class="com.export.ExportReportAction"> 
 <!-- NO NEED TO HAVE RESULT TYPE STREAM CONFIGURATION-->
</action>

это работает круто !!!

Спасибо всем, кто пытался ответить на этот вопрос

Это's однострочное, чтобы получить входной поток из выходного потока. Конфигурация более гибкая с помощью XML и нормализована по отношению к остальной части системы. Я'я не спорюникогда пишите прямо в ответ, но когда вы этого не сделаетенеобходимость к, это кажется пустой тратой. Без разницы. Dave Newton
ИМО это неотличное решение, хотя оно работает. S2 предоставляет механизм для этого, результат потока, который должен быть предпочтительнее, чем делать все вручную в коде Java. Dave Newton
@DaveNewton: S2 'Поток resultType всегда ищет объект java.io.InputStream, который будет заполнен в коде. Входной поток может быть заполнен, когда вы читаете файл PDF из файловой системы или любой другой системы ввода. В то время как iText создает PDF-файл, он записывает его прямо в ответ »выходной поток. В таком случае нам не нужен какой-либо входной поток, а также iText нужен любой входящий поток для записи. Так что это решение звучит хорошо для меня :-) Arun

Похожие вопросы