我目前正在尝试使用c#在没有
Windows手机外部库帮助的情况下自己编码PDF.我目前有这个代码,它会发出一个我可以使用PowerTools检索的PDF文件.文本有效,但每当我尝试放入图像时它都会完全失败.我可以检索文件但其中没有图像.我有点不知所措,但我的问题是:这段代码出了什么问题?如何正确地将图像文件流式传输到PDF文件?
编辑:将我的代码更新到最新;正确指向pdf对象.
var stream = await System.IO.WindowsRuntimeStorageExtensions.OpenStreamForWriteAsync(pdfFile); StreamWriter writer = new StreamWriter(stream,System.Text.Encoding.UTF8); List<long> xrefs = new List<long>(); //Writing the actual PDF writer.WriteLine("%"); writer.WriteLine("%PDF-1.5"); writer.WriteLine("%"); //1 writer.Flush(); stream.Flush(); xrefs.Add(stream.Position); writer.WriteLine(""); writer.WriteLine("%The PDF catalog"); writer.WriteLine(xrefs.Count + " 0 obj"); writer.WriteLine("<<"); writer.WriteLine(" /Type /Catalog"); writer.WriteLine(" /Pages 2 0 R"); writer.WriteLine(">>"); writer.WriteLine("endobj"); writer.Flush(); stream.Flush(); xrefs.Add(stream.Position); //2 //Declare the page list writer.WriteLine(""); writer.WriteLine("%The page list"); writer.WriteLine(xrefs.Count + " 0 obj"); writer.WriteLine("<<"); writer.WriteLine(" /Type /Pages"); writer.WriteLine(" /Kids [3 0 R]"); //writer.WriteLine(" /Resources 3 0 R"); writer.WriteLine("/Count 1"); writer.WriteLine(">>"); writer.WriteLine("endobj"); writer.Flush(); stream.Flush(); xrefs.Add(stream.Position); //3 //Declare the page object writer.WriteLine(""); writer.WriteLine("%Actual page,with references to all objects it uses (image and resources and whatnot)"); writer.WriteLine(xrefs.Count + " 0 obj"); writer.WriteLine("<<"); writer.WriteLine(" /Type /Page"); writer.WriteLine(" /Parent 2 0 R"); writer.WriteLine(" /Resources 4 0 R"); writer.WriteLine(" /MediaBox [0 0 " + currentimage.PixelWidth + " " + currentimage.PixelHeight + "]"); //612 792 writer.WriteLine(" /Contents 6 0 R"); writer.WriteLine(">>"); writer.WriteLine("endobj"); writer.Flush(); stream.Flush(); xrefs.Add(stream.Position); //4 //Declare the stuff this PDF has (Or something?) writer.WriteLine(""); writer.WriteLine("%resources this pdf uses"); writer.WriteLine(xrefs.Count + " 0 obj"); writer.WriteLine("<<"); writer.WriteLine("/ProcSet [/PDF /ImageC]"); writer.WriteLine("/XObject << Im1 5 0 R >>"); writer.WriteLine(">>"); writer.WriteLine("endobj"); writer.Flush(); stream.Flush(); xrefs.Add(stream.Position); //Writing the actual image stream writer.WriteLine("stream"); byte[] jpegData = new byte[8192]; string streamString = ""; using (MemoryStream imagestream = new MemoryStream()) { WriteableBitmap wBitmap = new WriteableBitmap(currentimage); wBitmap.SaveJpeg(imagestream,wBitmap.PixelWidth,wBitmap.PixelHeight,100); imagestream.Seek(0,SeekOrigin.Begin); jpegData = imagestream.ToArray(); foreach (byte b in jpegData) { streamString += b + " "; } } //5 writer.WriteLine(""); writer.WriteLine("%image declaration"); writer.WriteLine(xrefs.Count + " 0 obj"); writer.WriteLine("<<"); writer.WriteLine(" /Type /XObject"); //Specify the XOBject writer.WriteLine(" /Subtype /Image"); //It is an image writer.WriteLine(" /Width " + currentimage.PixelWidth); //The dimensions of the image writer.WriteLine(" /Height " + currentimage.PixelHeight); writer.WriteLine(" /ColorSpace /DeviceRGB"); writer.WriteLine(" /BitsPerComponent 8"); writer.WriteLine(" /Length " + streamString.Length); writer.WriteLine(" /Filter /DCTDecode"); writer.WriteLine(">>"); writer.Flush(); stream.Flush(); writer.Write(streamString); writer.Flush(); writer.WriteLine(""); writer.WriteLine("endstream"); writer.WriteLine("endobj"); writer.Flush(); stream.Flush(); xrefs.Add(stream.Position); //6 writer.WriteLine(""); writer.WriteLine("%the placing of the image"); writer.WriteLine(xrefs.Count + " 0 obj"); writer.WriteLine(" <<"); writer.WriteLine(" /Length 8192"); writer.WriteLine(" >>"); writer.WriteLine(" stream"); writer.WriteLine(" q"); writer.WriteLine(" " + 256 + " 0 0 " + 256 + " 0 0 cm"); writer.WriteLine(" /Im1 Do"); writer.WriteLine(" Q"); writer.WriteLine(" endstream"); writer.WriteLine("endobj"); //writer.WriteLine(">>"); writer.Flush(); stream.Flush(); //xrefs.Add(stream.Position); //Closing //PDF-XREFS. This part of the PDF is an index table into every object #1..#7 that we defined. long xref_pos = stream.Position; writer.WriteLine("xref"); writer.WriteLine("1 " + (xrefs.Count)); foreach (long xref in xrefs) { writer.WriteLine("{0:0000000000} {1:00000} n",xref,0); } // PDF-TRAILER. Every PDF ends with this trailer. writer.WriteLine("trailer"); writer.WriteLine("<<"); writer.WriteLine(" /Size " + xrefs.Count); writer.WriteLine(" /Root 1 0 R"); writer.WriteLine(">>"); writer.WriteLine("startxref"); writer.WriteLine(xref_pos); writer.WriteLine("%%EOF"); writer.dispose();
解决方法
希望这可能对你有所帮助..
using System; using System.Drawing; using Spire.Pdf; using Spire.Pdf.Graphics; namespace DrawImage { class Program { static void Main(string[] args) { //Create PDF and Add Page PdfDocument doc = new PdfDocument(); pdfpageBase page = doc.Pages.Add(); //Draw Image PdfImage image = PdfImage.FromFile(@"D:\Images\Spring's Coming.png"); float width = image.Width * 0.75f; float height = image.Height * 0.75f; float x = (page.Canvas.ClientSize.Width - width) / 2; page.Canvas.DrawImage(image,x,60,width,height); //Save and Launch doc.SavetoFile("Insertimage.pdf"); doc.Close(); System.Diagnostics.Process.Start("Insertimage.pdf"); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。