简体   繁体   English

如何使用PDFClown添加图像?

[英]How to add an Image with PDFClown?

I try to create a pdf file with C# using PDFClown 0.1.2.0, which contains an image. 我尝试使用PDFClown 0.1.2.0使用C#创建一个包含图像的pdf文件。
But I can not get it to work. 但是我无法使其正常工作。

The error i get is: 我得到的错误是:

An attempt was made to move the file pointer before the beginning of the file.

       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.SeekCore(Int64 offset, SeekOrigin origin)
       at System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin)
       at org.pdfclown.documents.contents.entities.JpegImage.Load()
       at org.pdfclown.documents.contents.entities.Image.Get(Stream stream)
       at org.pdfclown.documents.contents.entities.Image.Get(String path)
       at TestPdf.MainForm.createPDF() in c:\Users\Demo\Documents\SharpDevelop Projects\TestPdf\TestPdf\MainForm.cs:line 43

The line of code where I get this error is: 我收到此错误的代码行是:

org.pdfclown.documents.contents.entities.Image image = org.pdfclown.documents.contents.entities.Image.Get("test.jpg");

The "test.jpg" I use is: 我使用的“ test.jpg”是: 在此处输入图片说明

The code I am using is: 我使用的代码是:

public void createPDF()
    {
        try {
            org.pdfclown.files.File file = new org.pdfclown.files.File();
            org.pdfclown.documents.Document document = file.Document;
            org.pdfclown.documents.Page page = new org.pdfclown.documents.Page(document);
            document.Pages.Add(page);
            org.pdfclown.documents.contents.composition.PrimitiveComposer composer = new org.pdfclown.documents.contents.composition.PrimitiveComposer(page);
            composer.SetFont(new org.pdfclown.documents.contents.fonts.StandardType1Font(document, org.pdfclown.documents.contents.fonts.StandardType1Font.FamilyEnum.Courier, true, false), 32);
            composer.ShowText("Hello World!", new System.Drawing.PointF(32, 48));               
            org.pdfclown.documents.contents.entities.Image image = org.pdfclown.documents.contents.entities.Image.Get("test.jpg");
            org.pdfclown.documents.contents.xObjects.XObject imageXObject = image.ToXObject(document);
            composer.ShowXObject(imageXObject, new System.Drawing.PointF(32, 80));
            composer.Flush();
            file.Save("test.pdf", org.pdfclown.files.SerializationModeEnum.Incremental);            
            System.Diagnostics.Process.Start("explorer", System.IO.Directory.GetParent(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).ToString());
        } catch (System.Exception e) {
            System.Windows.Forms.MessageBox.Show(e.Message + "\r\n" + e.StackTrace);
        }
    }

What am I doing wrong? 我究竟做错了什么?

The problem is, that PdfClown can not handle jpg files which are saved in progressive mode. 问题是,PdfClown无法处理以逐行方式保存的jpg文件。 The simplest way to resolve the problem is to save the jpg file as non-progressive. 解决此问题的最简单方法是将jpg文件保存为非渐进式。

Another way is to convert the file: 另一种方法是转换文件:

    public void createPDF()
    {
        try {
            org.pdfclown.files.File file = new org.pdfclown.files.File();
            org.pdfclown.documents.Document document = file.Document;
            org.pdfclown.documents.Page page = new org.pdfclown.documents.Page(document);
            document.Pages.Add(page);
            org.pdfclown.documents.contents.composition.PrimitiveComposer composer = new org.pdfclown.documents.contents.composition.PrimitiveComposer(page);
            composer.SetFont(new org.pdfclown.documents.contents.fonts.StandardType1Font(document, org.pdfclown.documents.contents.fonts.StandardType1Font.FamilyEnum.Courier, true, false), 32);
            composer.ShowText("Hello World!", new System.Drawing.PointF(32, 48));               
            org.pdfclown.documents.contents.entities.Image image = LoadImageFile("test.jpg");
            org.pdfclown.documents.contents.xObjects.XObject imageXObject = image.ToXObject(document);
            composer.ShowXObject(imageXObject, new System.Drawing.PointF(32, 80));              
            composer.Flush();
            file.Save("test.pdf", org.pdfclown.files.SerializationModeEnum.Incremental);
            System.Diagnostics.Process.Start("explorer", System.IO.Directory.GetParent(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).ToString());
        } catch (System.Exception e) {
            System.Windows.Forms.MessageBox.Show(e.Message + "\r\n" + e.StackTrace);
        }
    }

    public org.pdfclown.documents.contents.entities.Image LoadImageFile(string path)
    {
        System.Drawing.Image image = System.Drawing.Image.FromFile(path);
        var ep = new System.Drawing.Imaging.EncoderParameters(3);
        ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        ep.Param[1] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.ScanMethod, (int)System.Drawing.Imaging.EncoderValue.ScanMethodInterlaced);
        ep.Param[2] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.RenderMethod, (int)System.Drawing.Imaging.EncoderValue.RenderNonProgressive);
        System.IO.MemoryStream memStream = new System.IO.MemoryStream();

        System.Drawing.Imaging.ImageCodecInfo encoder_info = null;
        int j;
        System.Drawing.Imaging.ImageCodecInfo[] encoders;
        encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j) {
            if (encoders[j].MimeType.Equals("image/jpeg"))
                encoder_info = encoders[j];
        }

        image.Save(memStream, encoder_info, ep);
        memStream.Position = 0;
        return org.pdfclown.documents.contents.entities.Image.Get(memStream);
    }

The method LoadImageFile opens an image in C# and converts it to a JPG non Progressive file. 方法LoadImageFile使用C#打开图像,并将其转换为JPG非渐进文件。
This non progressive jpg file is saved to the pdf document. 该非渐进式jpg文件将保存到pdf文档中。
This also works with png and tiff. 这也适用于png和tiff。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM