Search code examples
c#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.
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: enter image description here

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?


Solution

  • The problem is, that PdfClown can not handle jpg files which are saved in progressive mode. The simplest way to resolve the problem is to save the jpg file as non-progressive.

    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.
    This non progressive jpg file is saved to the pdf document.
    This also works with png and tiff.