如何将多页TIF拆分为单页字节数组以转换为PDF?
多页TIF转PDF(Libtiff.net + PdfSharp)问题解决
你的核心问题是没有把切换后的TIF页面单独提取为流,循环里一直用整个多页TIF的原始流,导致XImage每次都读第一页。下面是修改后的代码,完全避开System.Drawing.Common:
byte[] data = System.IO.File.ReadAllBytes("img.tif"); PdfDocument d = new PdfDocument(); using (MemoryStream ms = new MemoryStream(data)) using (Tiff t = Tiff.ClientOpen("test", "r", ms, new TiffStream())) { int pageCount = t.NumberOfDirectories(); for (int i = 0; i < pageCount; i++) { // 切换到当前页目录 t.SetDirectory((short)i); // 创建临时流存储当前单页TIF数据 using (MemoryStream singlePageMs = new MemoryStream()) { // 将当前页保存为单页TIF到临时流 t.SaveDirectoryAs(singlePageMs); // 重置流指针到开头,确保XImage能正确读取 singlePageMs.Position = 0; PdfPage p = d.AddPage(); XGraphics g = XGraphics.FromPdfPage(p); XImage img = XImage.FromStream(singlePageMs); // 设置PDF页面尺寸匹配当前TIF页 p.Width = img.PointWidth; p.Height = img.PointHeight; g.DrawImage(img, 0, 0); } } // 最后保存PDF文档 d.Save("output.pdf"); }
关键修改点:
- 每次循环内新建
MemoryStream来单独存储当前页的TIF数据 - 用
Tiff.SaveDirectoryAs()把当前目录的页面导出为单页TIF流,这是Libtiff.net自带的方法,不需要依赖System.Drawing.Common - 必须重置临时流的
Position到0,否则XImage读取不到数据
内容的提问来源于stack exchange,提问作者usagibear
相关产品推荐
相关产品推荐

