使用 iTextSharp 将多个 TIFF 图像转换为 PDF

Converting multiple TIFF Images to PDF using iTextSharp

我在 ASP.NETiTextSharp PDF 库 中使用 WebSite .我有一个包含 3 页的 tiff 文档图像,我想将所有这 3 个 tiff 页转换为 1 个 PDF 文件有 3 页。

我试过了,但效果不佳...

请告诉我应该怎么做?

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

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

我刚刚从 复制了代码,并将其修改为您的示例。因此,感谢在 link.

中回答问题的人
using (var stream = new FileStream(@"C:\File[=10=].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[=10=].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();
}
// 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();

经过长时间的搜索,我取得了什么。

我提出请求,得到的答复是 PDF 或 TIFF。第一部分就是我得到的以及我如何调用私有方法,这就是你需要的。

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;
            }

    }
}

我有两个私有方法

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;
}

也许我可以与 MemoryStream 一起工作,但就目前而言,它正在工作并且是我所需要的。

我搜索了很多,还有一些值得一提的链接