Reputation: 512
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
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
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
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