2015-01-29 4 views
1

본인은 PDF 형식으로 보고서를 생성하기 위해 MS SQL 보고서 서버 웹 서비스를 사용하고 있습니다 :스트림에서 PDF를로드하고 첨부 파일을 추가하는 방법은 무엇입니까?

byte[] Input; 
ReportServer report = new ReportServer(serverUrl + @"/ReportExecution2005.asmx", reportPath); 
Input = report.RenderToPDF(reportParamNames, reportParamValues); 

이 서비스는 PDF 파일로 바이트 배열을 반환합니다.

using (MemoryStream ms = new MemoryStream(Input)) { 
    Document doc = new Document(); 
    PdfWriter writer = PdfWriter.GetInstance(doc, ms); 
    doc.Open(); 
    ... 
} 

이 좋아 보인다,하지만 난이 PDF에 첨부 파일을 추가하는 것을 시도하고있다 :이 확인도 보인다

PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(writer, xmlInputFile, xmlFileDisplayName, null); 
writer.AddFileAttachment(pfs); 

하지만

나는 iTextSharp이 바이트 배열 부하를 필요 파일에 스트림을 저장하면 결과 PDF가 올바르지 않습니다.

첨부 파일은 항상 메모리에 생성해야하는 XML 파일이어야하며 파일 시스템에 존재하지 않습니다. iTextSharp로 어떻게 할 수 있습니까?

+2

어디서부터 시작해야할지 모르겠다. 코드가 잘못되었다. PdfStamper를 사용하고, 새로운 PDF를 만들고, 문서를 읽을 필요가있다. –

+0

나는 iTextSharp 라이브러리를 가진 초보자이다. 미안하다. :-) – Davecz

답변

2

내가 읽어

이 서비스는 pdf 파일로 바이트 배열을 반환합니다. 이것은이 확인 하지입니다

좋아 보인다

using (MemoryStream ms = new MemoryStream(Input)) 
{ 
    Document doc = new Document(); 
    PdfWriter writer = PdfWriter.GetInstance(doc, ms); 
    doc.Open(); 
    ... 
} 

: 나는 iTextSharp이 바이트 배열 부하가 필요합니다. 기존 PDF 파일에 첨부 파일을 추가하려고하지만에서 새 PDF 문서를 만드는 클래스 인 DocumentPdfWriter을 사용하고 있습니다.

documentation을 읽어보십시오. 다른 클래스의 개요와 사용시기를 알려주는 편리한 테이블이 있습니다 (6.1).

PdfReader : PDF 파일을 읽어

은 내가 PdfReaderPdfStamper 클래스의 설명을 인용. 이 클래스의 인스턴스를 다른 PDF 조작 클래스 중 하나 인 에 전달합니다.

PdfStamper : 하나의 PDF 문서 만 조작하십시오. 을 사용하여 절대 위치에 콘텐츠를 추가하거나 여분의 페이지를 추가하거나 개의 입력란을 채울 수 있습니다. 명시 적으로 제거하는 경우를 제외하고는 (예 : 양식을 병합하여) 모든 대화식 기능이 보존됩니다.

우리는 당신이 잘못을하고 있다는 것을 설립 : 당신이 PdfReaderPdfStamper 대신 DocumentPdfWriter를 사용해야합니다. 이제 some examples에서 살펴 보자 : 당신이 볼 수 있듯이

PdfReader reader = new PdfReader(pdf_bytes); 
using (var ms = new MemoryStream()) { 
    using (PdfStamper stamper = new PdfStamper(reader, ms)) { 
     PdfFileSpecification pfs = PdfFileSpecification.FileEmbedded(
      stamper.Writer, xmlInputFile, xmlFileDisplayName, null); 
     stamper.AddFileAttachment(pfs); 
    } 
    reader.Close(); 
    return ms.ToArray(); 
} 

, 우리는 메모리에 보관 된 바이트를 사용하여 PdfReader 인스턴스를 만듭니다. 그런 다음 PdfStamper을 사용하여 바이트를 사용하는 새 MemoryStream을 만듭니다.

자세한 내용은 The Best iText Questions on StackOverflow을 참조하십시오.