2010-05-28 3 views
2

iTextSharp 사용에 관해 두 가지 질문이 있습니다. SQL Server 데이터베이스에서 "배운 교훈"에 대한 정보를 저장하는 간단한 MVC 응용 프로그램을 만들었습니다. 사용자가 수업의 세부 정보를보고있을 때 수업을 PDF로 저장할 수 있기를 바랍니다. 몇 가지 작업 코드가 있지만 1) 내 접근 방식이 얼마나 소리가 나는지 잘 모르겠다. 2) MVC 애플리케이션에서 TinyMCE 서식있는 텍스트 편집기를 사용하고 HTML 태그를 PDF에 넣으면 html 태그가 표시된다. html 형식 (굵게 글꼴, 정렬되지 않은 목록, 단락 등)을 따르도록 PDF를 얻으려면 어떻게해야합니까?MVC에서 iTextSharp 사용하기

다음은 PDF를 생성하는 데 사용하는 코드입니다. 이 문제에 대해 잘못 알고 있다면 의견을 보내 주시면 감사하겠습니다.

감사합니다.

public FilePathResult GetPDF(int id) 
    { 
     Lesson lesson = lessonRepository.GetLesson(id); 

     string pdf = @"C:\Projects\Forms\LessonsLearned\PDF\template_test.pdf"; 
     string outputFilePath = @"C:\Temp\pdf_output\test_template_filled.pdf"; 

     PdfReader pdfReader = null; 

     try 
     { 

      pdfReader = new PdfReader(pdf); 

      using (FileStream pdfOutputFile = new FileStream(outputFilePath, FileMode.Create)) 
      { 
       PdfStamper pdfStamper = null; 
       try 
       { 
        pdfStamper = new PdfStamper(pdfReader, pdfOutputFile); 

        AcroFields acroFields = pdfStamper.AcroFields; 

        acroFields.SetField("title", lesson.Title); 
        acroFields.SetField("owner", lesson.Staff.FullName); 
        acroFields.SetField("date", lesson.DateEntered.ToShortDateString()); 
        // field with rich text      
        acroFields.SetField("situation", Server.HtmlDecode(lesson.Situation)); 
        acroFields.SetField("description", Server.HtmlDecode(lesson.Description)); 

        pdfStamper.FormFlattening = true; 

       } 
       finally 
       { 
        if (pdfStamper != null) 
        { 
         pdfStamper.Close(); 
        } 
       } 
      } 
     } 
     finally 
     { 
      pdfReader.Close(); 
     } 

     return File(outputFilePath, "application/pdf", "Lesson_" + lesson.ID + ".pdf"); 

    } 

답변

3

변경하려는 접근 방식의 유일한 주요 구성 요소는 데이터가 반환되는 방식입니다. 지금은 고정 된 파일 경로를 사용하고 있습니다. 즉, 두 사람이 동시에 요청을하면 그 중 하나가 오류가 발생합니다. 나중에 사용하기 위해 파일을 저장하지 않으므로 FileStream을 완전히 건너 뛴 다음 MemoryStream을 사용합니다. 그런 다음 FileStreamResult를 사용하여 MIME 유형이 application/pdf 인 스트림을 반환 할 수 있습니다.

두 번째 부분에는 약간의 문제가 있습니다. PDF와 HTML은 관련이 없으므로 HTML 태그 (일반 텍스트)는 PDF 문서에서 특별한 의미가 없습니다. 리치 텍스트 컨트롤로 생성 된 사용자 HTML을 적합한 PDF 리치 텍스트로 변환하려면 중간에 HTML 파서가 있어야합니다.

이 iText는 PDF 호환 덩어리를 반환하도록 설계 (이것은 모든 HTML 태그 또는 구조를 처리하지 않습니다 의미)를 부분 HTML 파서입니다 HTMLWorker 클래스가 포함되어 있습니다. HTMLAgilityPack과 같은 태그를 사용하여 변환되는 태그를보다 효과적으로 제어 할 수 있지만 직접 번역해야합니다. 풍부한 편집 컨트롤을 검사하여 서식있는 텍스트를 구문 분석하기 쉬운 형식으로 반환 할 수 있는지 여부를 확인할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그래, 나는 FileStream에 대해 걱정했다. 템플릿 PDF를 열고 데이터베이스의 데이터로 채울 수 있기를 원하지만, 나중에 사용하기 위해 결과 파일을 저장할 필요가 없습니다. 공유 할 수있는 예제 코드가 있습니까? 나는 이걸 함께 해킹하는 것 뿐이야. HTML 태그 앞면에서 HTMLWorker 클래스를 사용해 보겠습니다. – user353024

+0

HTML을 파싱하는 HTMLWorker 클래스가 있는데 이해가 안되는 부분은 HTML의 모양과 비슷한 모양이되도록 PDF의 텍스트 서식을 지정할 수 있다면 ... 조언이 필요합니다! – user353024