Javad Abedi
Javad Abedi

Reputation: 512

Converting multiple TIFF Images to PDF using iTextSharp

I’m using WebSite in ASP.NET and iTextSharp PDF library. I have a tiff document image that contains 3 pages, I would want to convert all those 3 tiff pages into 1 PDF file with 3 pages.

I try this but it doesn't work as well...

Please tell me what should I do?

using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

Document document = new Document();
using (var stream = new FileStream(@"C:\File\0.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
{
    PdfWriter.GetInstance(document, stream);
    document.Open();
    using (var imageStream = new FileStream(@"C:\File\0.tiff", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        var image = iTextSharp.text.Image.GetInstance(imageStream);
        document.Add(image);
    }
    document.Close();
}

Upvotes: 4

Views: 9395

Answers (3)

Helder Pereira
Helder Pereira

Reputation: 112

What I achieved after a long period and based on some searches.

I make a request and the response is PDF or TIFF. The first part is just what I get and how I call the private methods, and that is what you need.

var httpResponse = (HttpWebResponse)(await httpWebRequest.GetResponseAsync());
Stream stream = httpResponse.GetResponseStream();
string contentType = httpResponse.ContentType;
MemoryStream ms = new MemoryStream();
stream.CopyTo(ms);
FileStream file2;
try
{
    switch (contentType)
    {
        case "application/pdf":
            {

                string outputfile2 = Path.Combine(zipDirectory, "ixosid_" + icxos + ".pdf");
                file2 = new FileStream(outputfile2, FileMode.Create, FileAccess.Write);
                ms.WriteTo(file2);
                file2.Close();
                break;
            }

        default:
            {


                string outputfile1 = Path.Combine(zipDirectory, "ixosid_" + icxos + ".tiff");
                file2 = new FileStream(outputfile1, FileMode.Create, FileAccess.Write);
                ms.WriteTo(file2);
                file2.Close();

                string[] outfilesTiffPages = ConvertTiffToJpeg(outputfile1);
                File.Delete(outputfile1);

                string outputfile2 = Path.Combine(zipDirectory, "ixosid_" + icxos + ".pdf");
                iTextSharp.text.Document doc= AddPicturesToPDF(outfilesTiffPages, outputfile2);
                
                break;
            }

    }
}

and I have two private methods

private string[] ConvertTiffToJpeg(string fileName)
{
    using (System.Drawing.Image imageFile = System.Drawing.Image.FromFile(fileName))
    {
        FrameDimension frameDimensions = new FrameDimension(
            imageFile.FrameDimensionsList[0]);

        // Gets the number of pages from the tiff image (if multipage) 
        int frameNum = imageFile.GetFrameCount(frameDimensions);
        string[] jpegPaths = new string[frameNum];

        for (int frame = 0; frame < frameNum; frame++)
        {
            // Selects one frame at a time and save as jpeg. 
            imageFile.SelectActiveFrame(frameDimensions, frame);
            using (Bitmap bmp = new Bitmap(imageFile))
            {
                jpegPaths[frame] = String.Format(@"{0}\{1}{2}.jpg",
                    Path.GetDirectoryName(fileName),
                    Path.GetFileNameWithoutExtension(fileName),
                    frame);
                bmp.Save(jpegPaths[frame], ImageFormat.Jpeg);
            }
        }

        return jpegPaths;
    }
}

private iTextSharp.text.Document AddPicturesToPDF(string[] filesPaths, string outputPdf)
{
    FileStream fs = new FileStream(outputPdf, FileMode.Create);
    Document pdfdoc = new Document();
    PdfWriter.GetInstance(pdfdoc, fs);
    pdfdoc.Open();
    int size = filesPaths.Length;
    int count = 0;
    foreach(string imagePath in filesPaths)
    {
        iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(imagePath);
        img.Alignment = Element.ALIGN_CENTER;
        img.SetAbsolutePosition(0, 0);
        img.ScaleToFit((PageSize.A4.Width - pdfdoc.RightMargin - pdfdoc.LeftMargin), (PageSize.A4.Height- pdfdoc.BottomMargin - pdfdoc.TopMargin));
        pdfdoc.Add(img);
        pdfdoc.NewPage();

    }           
    pdfdoc.Close();
    return pdfdoc;
}

Maybe I can work with MemoryStream but for now, is working and is what I need.

I searched a lot, and some links that deserve to be mentioned

https://coderedirect.com/questions/178295/convert-tiff-to-jpg-format

Upvotes: 0

user10769498
user10769498

Reputation:

// creation of the document with a certain size and certain margins
iTextSharp.text.Document document = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 0, 0, 0, 0);

// creation of the different writers
iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new System.IO.FileStream(Server.MapPath("~/App_Data/result.pdf"), System.IO.FileMode.Create));

// load the tiff image and count the total pages
System.Drawing.Bitmap bm = new System.Drawing.Bitmap(Server.MapPath("~/App_Data/source.tif"));
int total = bm.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);

document.Open();
iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
for (int k = 0; k < total; ++k)
{
    bm.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, k);
    iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(bm, System.Drawing.Imaging.ImageFormat.Bmp);
    // scale the image to fit in the page
    img.ScalePercent(72f / img.DpiX * 100);
    img.SetAbsolutePosition(0, 0);
    cb.AddImage(img);
    document.NewPage();
}
document.Close();

Upvotes: 1

Jesse de Wit
Jesse de Wit

Reputation: 4177

I just copied the code from this answer, and modified it to your example. So credits go to the person who answered the question in the link.

using (var stream = new FileStream(@"C:\File\0.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
{
    Document document = new Document(PageSize.A4, 0, 0, 0, 0);
    var writer = PdfWriter.GetInstance(document, stream);    
    var bitmap = new System.Drawing.Bitmap(@"C:\File\0.tiff"); 
    var pages = bitmap.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);

    document.Open();
    iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
    for (int i = 0; i < pages; ++i)
    {
        bitmap.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
        iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(bitmap, System.Drawing.Imaging.ImageFormat.Bmp);
        // scale the image to fit in the page 
        //img.ScalePercent(72f / img.DpiX * 100);
        //img.SetAbsolutePosition(0, 0);
        cb.AddImage(img);
        document.NewPage();
    }
   }
   document.Close();
}

Upvotes: 0

Related Questions