Click here to Skip to main content
15,891,136 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I have created a small app to try and understand how to export Images to pdf. The code below exports but the PDF is blank.

I have 2 columns ID and Image.

C#
<pre>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace TestImage
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }


        //browse image into pictureBox1 
        private void BtnBrowseImage_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Choose Image(*.jpg;*.png;*.gif)|*.jpg;*.png;*.gif";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = System.Drawing.Image.FromFile(ofd.FileName);
            }

        }

        //button add data to dataGridView		
        //insert image from pictureBox to dataGridView 		

        private void BtnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
                byte[] img = ms.ToArray();
                dataGridView1.Rows.Add(textBoxId.Text, img);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //create a DataGridView Image Column										
            DataGridViewImageColumn dgvImage = new DataGridViewImageColumn();
            //set a header test to DataGridView Image Column										
            dgvImage.HeaderText = "Image";
            dgvImage.ImageLayout = DataGridViewImageCellLayout.Stretch;

            DataGridViewTextBoxColumn dgvId = new DataGridViewTextBoxColumn();
            dgvId.HeaderText = "Id";

            dataGridView1.Columns.Add(dgvId);
            dataGridView1.Columns.Add(dgvImage);

            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView1.RowTemplate.Height = 120;

            dataGridView1.AllowUserToAddRows = false;

        }

        private void btn_Export_Click(object sender, EventArgs e)
        {
            if (dataGridView1.Rows.Count > 0)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "PDF (*.pdf)|*.pdf";
                sfd.FileName = "Output.pdf";
                bool fileError = false;
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    if (File.Exists(sfd.FileName))
                    {
                        try
                        {
                            File.Delete(sfd.FileName);
                        }
                        catch (IOException ex)
                        {
                            fileError = true;
                            MessageBox.Show("It wasn't possible to write the data to the disk." + ex.Message);
                        }
                    }
                    if (!fileError)
                    {
                        try
                        {
                            PdfPTable pdfTable = new PdfPTable(dataGridView1.Columns.Count);
                            pdfTable.DefaultCell.Padding = 3;
                            pdfTable.WidthPercentage = 100;
                            pdfTable.HorizontalAlignment = Element.ALIGN_LEFT;

                            foreach (DataGridViewColumn column in dataGridView1.Columns)
                            {
                                PdfPCell cell = new PdfPCell(new Phrase(column.HeaderText));
                                pdfTable.AddCell(cell);
                            }
                          

                            ////Option 2
                            foreach (DataGridViewRow row in dataGridView1.Rows)
                            {
                                string Id = row.Cells[0].Value.ToString(); 
                                // Now your image cell
                                byte[] imageByte = (byte[])row.Cells[1].Value;
                                iTextSharp.text.Image myImage = iTextSharp.text.Image.GetInstance(imageByte);
                                pdfTable.AddCell(myImage);

                            }
                          
                            //Stop Option 2
                          

                            using (FileStream stream = new FileStream(sfd.FileName, FileMode.Create))
                            {
                                Document pdfDoc = new Document(PageSize.A4, 10f, 20f, 20f, 10f);
                                PdfWriter.GetInstance(pdfDoc, stream);
                                pdfDoc.Open();
                                pdfDoc.Add(pdfTable);
                                pdfDoc.Close();
                                stream.Close();
                            }

                            MessageBox.Show("Data Exported Successfully !!!", "Info");
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Error :" + ex.Message);
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("No Record To Export !!!", "Info");
            }
        }
    }
}


What I have tried:

C#
////Option 1 
                            //foreach (DataGridViewRow row in dataGridView1.Rows)
                            //{
                            //    foreach (DataGridViewCell cell in row.Cells)
                            //    {
                            //        pdfTable.AddCell(cell.Value.ToString());

                            ////Stop Option 1
Posted
Updated 29-Apr-20 19:48pm

<disclaimer> It has been a while since I worked with iTextSharp

I think you need an extra step here
byte[] imageByte = (byte[])row.Cells[1].Value;
iTextSharp.text.Image myImage = iTextSharp.text.Image.GetInstance(imageByte);
pdfTable.AddCell(myImage);

If I were doing this from a file I'd do
iTextSharp.text.Image jpgImage = iTextSharp.text.Image.GetInstance("path/image-file.jpg");
PdfPCell imageCell = new PdfPCell(jpgImage);

// add the image cell
table.AddCell(imageCell);

(note the use of PdfPCell there)... so maybe in your case (I can't test it)

byte[] imageByte = (byte[])row.Cells[1].Value;
iTextSharp.text.Image myImage = iTextSharp.text.Image.GetInstance(imageByte);
PdfPCell imageCell = new PdfPCell(myImage);
pdfTable.AddCell(imageCell);


The PdfPCell iirc has Colspan, Border, and setHorizontalAlignment properties that can be used for alignment etc

[edit] my answer depends on the version of iTextSharp - you may also wish to check this link iText 7 : How to add an image and text to the same cell?[^] [/edit]
 
Share this answer
 
v2
Comments
Maciej Los 30-Apr-20 1:43am    
5ed!
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900