2015-01-29 4 views
1

Я использую веб-службы MS SQL сервера отчетов для создания отчетов в формате PDF:Как загрузить PDF из потока и добавить вложение файла?

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

Эта служба возвращает массив с PDF-файл.

мне нужен этот байт нагрузки массива в iTextSharp:

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

Это кажется слишком хорошо, но когда я сохраняю поток в файл, полученный pdf-файл неверен.

Обратите внимание, что вложение файлов всегда будет XML-файлом, который мне нужно создать в памяти и никогда не будет в файловой системе. Как я могу сделать это с помощью iTextSharp?

+2

Я даже не знаю, с чего начать, ваш код не так, вам нужно будет использовать PdfStamper, создать новый PDF-файл и прочитать документацию. –

+0

Я новичок в iTextSharp библиотеке, извините :-) – Davecz

ответ

2

Я читаю:

Эта служба возвращает массив байтов с PDF-файл. мне нужно эти байты нагрузка массива в iTextSharp:

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

это кажется нормально

Это не OK. Вы хотите добавить вложение в существующий файл PDF, однако вы используете Document и PdfWriter, которые являются классами для создания нового документа PDF с нуля.

Пожалуйста, прочтите documentation. Существует удобная таблица (6.1), которая дает вам обзор различных классов и когда они будут использоваться.

Привожу описание класса PdfReader и PdfStamper:

PdfReader: Считывает PDF файлы. Вы передаете экземпляр этого класса в один других классов манипуляции PDF.

PdfStamper: Манипулирует одним (и только одним) PDF-документом. Можно использовать , чтобы добавить контент в абсолютные позиции, добавить дополнительные страницы или заполнить поля . Все интерактивные функции сохраняются, за исключением случаев, когда вы явно удаляете их (например, путем сплющивания формы).

Мы установили, что вы делаете это неправильно: вы должны использовать PdfReader и PdfStamper вместо Document и PdfWriter. Теперь давайте взглянем на 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.

Смежные вопросы