2016-12-24 36 views
0

的PDF是由HTTP GET来我之后创建一个损坏的PDF。 我已经在几个例子看这里SO和一直没能挤进这个bug。iText的夏普添加图像

注:我只保存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。两个os中哪一个腐败?我从您从网络中检索到的文件中没有看到与iText相关的任何内容。 –

+0

修改后的一个。你没有看到“PdfWriter wri = PdfWriter.GetInstance(doc,msPDF);” 其实我写2 PDF的单一来源,一个经过修改和一个前。只有通过iTextSharp运行的PDF是损坏的。第一个写出来罚款。 –

+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(); 
}