本篇文章将介绍通过 Spire.PDF for .NET 实现 PDF 文档与 .tiff 图片文档相互转换的方法,包括:
- PDF转Tiff
- Tiff转PDF
PDF转Tiff
C#
static void Main(string[] args)
{
//创建PdfDocument对象,加载PDF文档
PdfDocument document = new PdfDocument();
document.LoadFromFile("sample.pdf");
//保存文档为.tiff格式的文件
JoinTiffImages(SaveAsImage(document), "result.tiff", EncoderValue.CompressionLZW);
}
//自定义方法SaveAsImage()
private static Image[] SaveAsImage(PdfDocument document)
{
Image[] images = new Image[document.Pages.Count];
for (int i = 0; i < document.Pages.Count; i++)
{
images[i] = document.SaveAsImage(i);
}
return images;
}
//自定义方法GetEncoderInfo()
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j < encoders.Length; j++)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
throw new Exception(mimeType + " mime type not found in ImageCodecInfo");
}
//自定义方法JoinTiffImages()
public static void JoinTiffImages(Image[] images, string outFile, EncoderValue compressEncoder)
{
Encoder enc = Encoder.SaveFlag;
EncoderParameters ep = new EncoderParameters(2);
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
ep.Param[1] = new EncoderParameter(Encoder.Compression, (long)compressEncoder);
Image pages = images[0];
int frame = 0;
ImageCodecInfo info = GetEncoderInfo("image/tiff");
foreach (Image img in images)
{
if (frame == 0)
{
pages = img;
pages.Save(outFile, info, ep);
}
else
{
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
pages.SaveAdd(img, ep);
}
if (frame == images.Length - 1)
{
ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
pages.SaveAdd(ep);
}
frame++;
}
}
VB.NET
Private Shared Sub Main(args As String())
'创建PdfDocument对象,加载PDF文档
Dim document As New PdfDocument()
document.LoadFromFile("sample.pdf")
'保存文档为.tiff格式的文件
JoinTiffImages(SaveAsImage(document), "result.tiff", EncoderValue.CompressionLZW)
End Sub
'自定义方法SaveAsImage()
Private Shared Function SaveAsImage(document As PdfDocument) As Image()
Dim images As Image() = New Image(document.Pages.Count - 1) {}
For i As Integer = 0 To document.Pages.Count - 1
images(i) = document.SaveAsImage(i)
Next
Return images
End Function
'自定义方法GetEncoderInfo()
Private Shared Function GetEncoderInfo(mimeType As String) As ImageCodecInfo
Dim encoders As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
For j As Integer = 0 To encoders.Length - 1
If encoders(j).MimeType = mimeType Then
Return encoders(j)
End If
Next
Throw New Exception(mimeType & Convert.ToString(" mime type not found in ImageCodecInfo"))
End Function
'自定义方法JoinTiffImages()
Public Shared Sub JoinTiffImages(images As Image(), outFile As String, compressEncoder As EncoderValue)
Dim enc As Encoder = Encoder.SaveFlag
Dim ep As New EncoderParameters(2)
ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame))
ep.Param(1) = New EncoderParameter(Encoder.Compression, CLng(compressEncoder))
Dim pages As Image = images(0)
Dim frame As Integer = 0
Dim info As ImageCodecInfo = GetEncoderInfo("image/tiff")
For Each img As Image In images
If frame = 0 Then
pages = img
pages.Save(outFile, info, ep)
Else
ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.FrameDimensionPage))
pages.SaveAdd(img, ep)
End If
If frame = images.Length - 1 Then
ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.Flush))
pages.SaveAdd(ep)
End If
frame += 1
Next
End Sub
转换结果:
Tiff转PDF
C#
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Spire.Pdf;
using Spire.Pdf.Graphics;
namespace SplitTiff
{
class Program
{
static void Main(string[] args)
{
using (PdfDocument pdfDoc = new PdfDocument())
{
//加载tiff文件
Image tiffImage = Image.FromFile("test.tiff");
Image[] imgs = SplitImages(tiffImage);
for (int i = 0; i < imgs.Length; i++)
{
PdfImage pdfImg = PdfImage.FromImage(imgs[i]);
PdfUnitConvertor uinit = new PdfUnitConvertor();
SizeF pageSize = uinit.ConvertFromPixels(imgs[i].Size, PdfGraphicsUnit.Point);
PdfPageBase page = pdfDoc.Pages.Add(pageSize, new PdfMargins(0f));
float x = (page.Canvas.ClientSize.Width - pageSize.Width) / 2;
//将图片绘制到PDF页面
page.Canvas.DrawImage(pdfImg, x, 0, pageSize.Width,pageSize.Height);
}
//保存为Pdf文档
pdfDoc.SaveToFile("result.pdf");
System.Diagnostics.Process.Start("result.pdf");
}
}
public static Image[] SplitImages(Image tiffImage)
{
int frameCount = tiffImage.GetFrameCount(FrameDimension.Page);
Image[] frames = new Image[frameCount];
Guid guid = tiffImage.FrameDimensionsList[0];
for (int i = 0; i < frameCount; i++)
{
FrameDimension dimension = new FrameDimension(guid);
tiffImage.SelectActiveFrame(dimension, i);
using (MemoryStream buffer = new MemoryStream())
{
tiffImage.Save(buffer, ImageFormat.Tiff);
buffer.Position = 0;
frames[i] = Image.FromStream(buffer);
}
}
return frames;
}
}
}
VB.NET
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Namespace SplitTiff
Class Program
Private Shared Sub Main(args As String())
Using pdfDoc As New PdfDocument()
'加载tiff文件
Dim tiffImage As Image = Image.FromFile("test.tiff")
Dim imgs As Image() = SplitImages(tiffImage)
For i As Integer = 0 To imgs.Length - 1
Dim pdfImg As PdfImage = PdfImage.FromImage(imgs(i))
Dim uinit As New PdfUnitConvertor()
Dim pageSize As SizeF = uinit.ConvertFromPixels(imgs(i).Size, PdfGraphicsUnit.Point)
Dim page As PdfPageBase = pdfDoc.Pages.Add(pageSize, New PdfMargins(0F))
Dim x As Single = (page.Canvas.ClientSize.Width - pageSize.Width) / 2
'将图片绘制到PDF页面
page.Canvas.DrawImage(pdfImg, x, 0, pageSize.Width, pageSize.Height)
Next
'保存为Pdf文档
pdfDoc.SaveToFile("result.pdf")
System.Diagnostics.Process.Start("result.pdf")
End Using
End Sub
Public Shared Function SplitImages(tiffImage As Image) As Image()
Dim frameCount As Integer = tiffImage.GetFrameCount(FrameDimension.Page)
Dim frames As Image() = New Image(frameCount - 1) {}
Dim guid As Guid = tiffImage.FrameDimensionsList(0)
For i As Integer = 0 To frameCount - 1
Dim dimension As New FrameDimension(guid)
tiffImage.SelectActiveFrame(dimension, i)
Using buffer As New MemoryStream()
tiffImage.Save(buffer, ImageFormat.Tiff)
buffer.Position = 0
frames(i) = Image.FromStream(buffer)
End Using
Next
Return frames
End Function
End Class
End Namespace
转换结果: