2016-12-24 3 views
0

PDF приходит ко мне с http get. Я рассмотрел несколько примеров здесь, на SO, и не смог раздавить эту ошибку.itext sharp создает поврежденный pdf после добавления изображения

Примечание: Я сохраняю только PDF-файлы для целей отладки, после того как я выясню, что он будет полностью сохранен в памяти и отправит измененный PDF в api как base64.

Что я делаю неправильно?

//get Invoice PDF 
Byte[] pdf_bytes = Convert.FromBase64String(GetInvoicePDF(account, invoice, config)); 

//Save a Debug Copy 
using(FileStream fs = File.Create("C:\\temp\\b4-invoice-" + invoice.id + ".pdf")) 
{ 
    fs.Write(pdf_bytes, 0, (int)pdf_bytes.Length); 
    fs.Flush(); 
    fs.Close(); 
} 

Document doc = new Document(PageSize.A4, 30, 30, 30, 30); 
MemoryStream msPDF = new MemoryStream(pdf_bytes); 

//Create Bitmap 
System.Drawing.Bitmap Bmp = new System.Drawing.Bitmap(333, 195); 
using(System.Drawing.Graphics gfx = System.Drawing.Graphics.FromImage(Bmp)) 
using(System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(255, 255, 255))) 
{ 
    gfx.FillRectangle(brush, 0, 0, 333, 195); 
} 


Image img = Image.GetInstance(Bmp, System.Drawing.Imaging.ImageFormat.Bmp); 
img.SetAbsolutePosition(0, 0); 


PdfWriter wri = PdfWriter.GetInstance(doc, msPDF); 

doc.Open();//Open Document to write 
doc.Add(img); 
doc.Close(); 
doc.Dispose(); 

Byte[] pdf_bytes_out = msPDF.ToArray(); 

//Save a Debug Copy 
using(FileStream fs = File.Create("C:\\temp\\invoice-" + invoice.id + ".pdf")) 
{ 
    fs.Write(pdf_bytes_out, 0, (int)pdf_bytes_out.Length); 
    fs.Flush(); 
    fs.Close(); 
} 
+1

Вы пишете два файла PDF в файл. Какой из обоих коррумпированных? Я не вижу ничего связанного с iText в файле, который вы извлекаете из Интернета. –

+0

Модифицированный. Разве вы не видите «PdfWriter wri = PdfWriter.GetInstance (doc, msPDF)»; На самом деле я пишу 2 PDF-файла из одного источника, один до модификации и один за ним. Только PDF, который проходит через iTextSharp, является коррумпированным. Первый записывается отлично. –

+1

Что @Bruno пытался вам сказать, так это то, что вы помещаете два разных pdf-файла в «MemoryStream msPDF» один за другим. И файл, содержащий два pdf-файла, один за другим, без конверта, никогда не будет действительным pdf, независимо от того, как создаются отдельные PDF-файлы. – mkl

ответ

0

Я понял. Оказывается, мне вообще не нужно было использовать объект doc.

//get Invoice PDF 
Byte[] pdf_bytes = Convert.FromBase64String(GetInvoicePDF(account, invoice, config)); 

//Save a Debug Copy 
using(FileStream fs = File.Create("C:\\temp\\b4-invoice-" + invoice.id + ".pdf")) 
{ 
    fs.Write(pdf_bytes, 0, (int)pdf_bytes.Length); 
    fs.Flush(); 
    fs.Close(); 
} 

MemoryStream msPDF = new MemoryStream(); 

PdfReader reader = new PdfReader(pdf_bytes); 
Rectangle rect = reader.GetPageSize(1); 


using(PdfStamper stamper = new PdfStamper(reader, msPDF)) 
{ 
    // modify the pdf content 
    PdfContentByte cb = stamper.GetOverContent(1); 
    //cb.SetColorStroke(iTextSharp.text.BaseColor.GREEN); 
    //cb.SetLineWidth(1f); 
    cb.SetColorFill(iTextSharp.text.BaseColor.WHITE); 
    cb.Rectangle(rect.GetLeft(0), rect.GetTop(0) - 250, 350, 250); 
    cb.Fill(); 
    //cb.Stroke(); 
} 
reader.Close(); 


Byte[] pdf_bytes_out = msPDF.GetBuffer(); 

using(FileStream fs = File.Create("C:\\temp\\invoice-" + invoice.id + ".pdf")) 
{ 
    fs.Write(pdf_bytes_out, 0, (int)pdf_bytes_out.Length); 
    fs.Flush(); 
    fs.Close(); 
} 
Смежные вопросы