微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 我的PDF语法坏了!如何将图像放入PDF?

我目前正在尝试使用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] 举报,一经查实,本站将立刻删除。

相关推荐