使用C#修改PDF頁面大小為標準尺寸或自定義尺寸
引言
最近處理 PDF 文件時遇到一個需求:把已有 PDF 的頁面尺寸統(tǒng)一調整一下。有些文件是系統(tǒng)導出的,有些是掃描件,頁面大小不一致,后面打印或歸檔時不太方便。
這里記錄一下用 C# 調整 PDF 頁面大小的做法。核心思路不是直接改原 PDF 的頁面屬性,而是重新創(chuàng)建一個 PDF,把原來的每一頁作為模板繪制到新頁面上。
這樣處理后,原頁面里的文字、圖片、表格等內容都能保留下來,同時可以把頁面尺寸改成 A4、A3、A1 這類標準尺寸,也可以改成自己指定的寬高。
安裝 Spire.PDF
示例里用到的是 Spire.PDF。如果是 NuGet 包管理器,可以直接安裝:
PM> Install-Package Spire.PDF
也可以用 .NET CLI:
dotnet add package Spire.PDF
代碼中需要引入下面幾個命名空間:
using Spire.Pdf; using Spire.Pdf.Graphics; using System.Drawing;
基本處理思路
調整頁面大小時,可以按這個流程來做:
先讀取原 PDF,然后創(chuàng)建一個新的 PDF。接著遍歷原 PDF 的每一頁,在新 PDF 里創(chuàng)建目標尺寸的新頁面,再把原頁面生成模板并繪制到新頁面上。
聽起來步驟比較多,但代碼其實不復雜。這里有一個比較重要的設置:
PdfTextLayout layout = new PdfTextLayout(); layout.Layout = PdfLayoutType.OnePage;
這個設置的作用是讓原頁面內容適配到新頁面中。如果不加,在頁面尺寸變化比較明顯時,內容可能不會按照預期縮放。
一、把 PDF 頁面改成標準紙張大小
如果只是想改成 A4、A3、A1、Letter、Legal 這類常見尺寸,可以直接使用 PdfPageSize。
下面的示例是把原 PDF 的頁面統(tǒng)一改成 A1。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace ResizePdfToStandardSize
{
class Program
{
static void Main(string[] args)
{
// 讀取原始 PDF
PdfDocument sourcePdf = new PdfDocument();
sourcePdf.LoadFromFile("Sample.pdf");
// 創(chuàng)建新的 PDF
PdfDocument outputPdf = new PdfDocument();
foreach (PdfPageBase sourcePage in sourcePdf.Pages)
{
// 新建 A1 頁面,頁邊距設置為 0
PdfPageBase newPage = outputPdf.Pages.Add(PdfPageSize.A1, new PdfMargins(0));
// 讓原頁面內容適配到新頁面
PdfTextLayout layout = new PdfTextLayout();
layout.Layout = PdfLayoutType.OnePage;
// 把原頁面做成模板
PdfTemplate template = sourcePage.CreateTemplate();
// 繪制到新頁面
template.Draw(newPage, new PointF(0, 0), layout);
}
outputPdf.SaveToFile("ResizeToA1.pdf");
sourcePdf.Close();
outputPdf.Close();
}
}
}
如果要改成 A4,只需要把這一行:
PdfPageBase newPage = outputPdf.Pages.Add(PdfPageSize.A1, new PdfMargins(0));
改成:
PdfPageBase newPage = outputPdf.Pages.Add(PdfPageSize.A4, new PdfMargins(0));
常用的尺寸可以這樣寫:
PdfPageSize.A4 PdfPageSize.A3 PdfPageSize.Letter PdfPageSize.Legal
這里的 new PdfMargins(0) 表示不額外加頁邊距。如果想讓內容四周留一點空白,也可以設置成:
new PdfMargins(20)
不過加了頁邊距以后,實際可繪制區(qū)域會變小,頁面內容的縮放效果也會受到影響。
二、把 PDF 頁面改成自定義尺寸
如果目標尺寸不是標準紙張,比如要做票據、標簽、電子書頁面,或者要適配某個固定打印模板,就需要自定義寬高。
Spire.PDF 里頁面尺寸的單位是 point。
1 inch = 72 points。
如果你的尺寸是英寸、毫米或厘米,可以先轉換成 point,再創(chuàng)建頁面。
下面示例把頁面尺寸改成 6.5 × 8.5 英寸。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace ResizePdfToCustomSize
{
class Program
{
static void Main(string[] args)
{
PdfDocument sourcePdf = new PdfDocument();
sourcePdf.LoadFromFile("Sample.pdf");
PdfDocument outputPdf = new PdfDocument();
// 單位轉換
PdfUnitConvertor convertor = new PdfUnitConvertor();
float width = convertor.ConvertUnits(6.5f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
float height = convertor.ConvertUnits(8.5f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
SizeF pageSize = new SizeF(width, height);
foreach (PdfPageBase sourcePage in sourcePdf.Pages)
{
PdfPageBase newPage = outputPdf.Pages.Add(pageSize, new PdfMargins(0));
PdfTextLayout layout = new PdfTextLayout();
layout.Layout = PdfLayoutType.OnePage;
PdfTemplate template = sourcePage.CreateTemplate();
template.Draw(newPage, new PointF(0, 0), layout);
}
outputPdf.SaveToFile("ResizeToCustomSize.pdf");
sourcePdf.Close();
outputPdf.Close();
}
}
}
這個寫法適合尺寸來自業(yè)務需求的場景。比如設計稿給的是英寸,或者打印規(guī)格里寫的是固定寬高,都可以先轉換成 point 再處理。
三、如果尺寸單位是毫米
打印類需求里,毫米會更常見。比如想設置成 210mm × 297mm,可以這樣寫:
PdfUnitConvertor convertor = new PdfUnitConvertor(); float width = convertor.ConvertUnits(210f, PdfGraphicsUnit.Millimeter, PdfGraphicsUnit.Point); float height = convertor.ConvertUnits(297f, PdfGraphicsUnit.Millimeter, PdfGraphicsUnit.Point); SizeF pageSize = new SizeF(width, height);
然后創(chuàng)建頁面時直接使用這個 pageSize:
PdfPageBase newPage = outputPdf.Pages.Add(pageSize, new PdfMargins(0));
這種方式比手動計算 point 更穩(wěn)一些,也不容易寫錯單位。
四、為什么要用模板重新繪制
一開始我也以為改頁面大小應該就是修改頁面屬性。但 PDF 里的內容位置、頁面尺寸、坐標系統(tǒng)是關聯在一起的。直接改頁面尺寸,不一定能讓原來的內容自動適配。
所以更穩(wěn)的做法是:
PdfTemplate template = sourcePage.CreateTemplate(); template.Draw(newPage, new PointF(0, 0), layout);
也就是把原頁面當成一個整體模板,再畫到目標尺寸的新頁面上。
配合:
layout.Layout = PdfLayoutType.OnePage;
可以讓內容盡量縮放到新頁面范圍內。
不過也要注意,如果原頁面和目標頁面比例差距太大,最終效果可能會出現比較大的留白,或者內容看起來被壓縮。比如把橫向頁面強行轉成豎向 A4,就需要人工檢查一下效果。
五、標準尺寸和自定義尺寸怎么選
如果只是為了打印、歸檔、統(tǒng)一頁面規(guī)格,優(yōu)先用標準尺寸就行:
outputPdf.Pages.Add(PdfPageSize.A4, new PdfMargins(0));
如果是業(yè)務里有明確尺寸要求,比如標簽、票據、證書、書籍頁面,那就用自定義尺寸:
outputPdf.Pages.Add(pageSize, new PdfMargins(0));
實際項目里,我更建議把目標尺寸做成配置項。這樣后面要從 A4 改成 A3,或者從英寸改成毫米,不需要改太多代碼。
六、封裝成一個簡單方法
如果項目里會多次用到,可以把邏輯簡單封裝一下。
轉成標準尺寸
static void ResizeToStandardSize(string inputPath, string outputPath, SizeF targetSize)
{
PdfDocument sourcePdf = new PdfDocument();
sourcePdf.LoadFromFile(inputPath);
PdfDocument outputPdf = new PdfDocument();
foreach (PdfPageBase sourcePage in sourcePdf.Pages)
{
PdfPageBase newPage = outputPdf.Pages.Add(targetSize, new PdfMargins(0));
PdfTextLayout layout = new PdfTextLayout();
layout.Layout = PdfLayoutType.OnePage;
PdfTemplate template = sourcePage.CreateTemplate();
template.Draw(newPage, new PointF(0, 0), layout);
}
outputPdf.SaveToFile(outputPath);
sourcePdf.Close();
outputPdf.Close();
}
調用時可以這樣寫:
ResizeToStandardSize("Sample.pdf", "Output.pdf", PdfPageSize.A4);
如果是自定義尺寸,也可以先轉換單位:
PdfUnitConvertor convertor = new PdfUnitConvertor();
float width = convertor.ConvertUnits(6.5f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
float height = convertor.ConvertUnits(8.5f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
SizeF customSize = new SizeF(width, height);
ResizeToStandardSize("Sample.pdf", "Output.pdf", customSize);
七、幾個容易忽略的點
1. 不建議直接覆蓋原文件
頁面尺寸調整后,最好輸出成一個新的 PDF。確認效果沒問題后,再決定是否替換原文件。
Sample.pdf ResizeToA4.pdf
這樣出問題也能回退。
2. 頁邊距會影響內容大小
示例中用了 0 頁邊距:
new PdfMargins(0)
如果設置了頁邊距,內容區(qū)域會變小,縮放后的內容也會跟著變小。這個在打印場景里尤其要注意。
3. 批量轉換時要注意文件命名
如果批量處理多個 PDF,不要所有輸出都叫 Output.pdf??梢栽谖募锛由铣叽缁驎r間:
report_A4.pdf report_A3.pdf report_custom.pdf
4. 頁面比例不一致時要人工檢查
程序可以完成頁面縮放,但不一定能保證視覺效果一定完美。尤其是下面幾種情況:
- 橫向頁面轉豎向頁面;
- 大圖紙縮小成 A4;
- 掃描件頁面邊緣有大量空白;
- 原 PDF 每頁尺寸本身不一致。
這類文件建議轉換后抽查幾頁。
八、完整代碼參考
最后放一個稍微整理過的完整版本,標準尺寸和自定義尺寸都可以用。
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
namespace ResizePdfPage
{
class Program
{
static void Main(string[] args)
{
// 示例一:轉為 A4
ResizePdf("Sample.pdf", "ResizeToA4.pdf", PdfPageSize.A4);
// 示例二:轉為自定義尺寸,單位為英寸
PdfUnitConvertor convertor = new PdfUnitConvertor();
float width = convertor.ConvertUnits(6.5f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
float height = convertor.ConvertUnits(8.5f, PdfGraphicsUnit.Inch, PdfGraphicsUnit.Point);
SizeF customSize = new SizeF(width, height);
ResizePdf("Sample.pdf", "ResizeToCustomSize.pdf", customSize);
}
static void ResizePdf(string inputPath, string outputPath, SizeF pageSize)
{
PdfDocument sourcePdf = new PdfDocument();
sourcePdf.LoadFromFile(inputPath);
PdfDocument outputPdf = new PdfDocument();
foreach (PdfPageBase sourcePage in sourcePdf.Pages)
{
PdfPageBase newPage = outputPdf.Pages.Add(pageSize, new PdfMargins(0));
PdfTextLayout layout = new PdfTextLayout();
layout.Layout = PdfLayoutType.OnePage;
PdfTemplate template = sourcePage.CreateTemplate();
template.Draw(newPage, new PointF(0, 0), layout);
}
outputPdf.SaveToFile(outputPath);
sourcePdf.Close();
outputPdf.Close();
}
}
}
結尾
整體看下來,調整 PDF 頁面尺寸主要就是兩件事:
第一,確定目標頁面大小,是用 A4、A3 這類標準尺寸,還是用自定義寬高。
第二,把原 PDF 頁面作為模板繪制到新頁面上,并設置單頁適配。
如果只是統(tǒng)一打印尺寸,用 PdfPageSize.A4 這類標準尺寸就夠了。
如果是特殊業(yè)務頁面,可以先用 PdfUnitConvertor 把英寸或毫米轉換成 point,再創(chuàng)建對應尺寸的頁面。
實際使用時,建議重點檢查輸出頁面的比例、留白和內容縮放效果,尤其是原 PDF 頁面尺寸不統(tǒng)一的情況。
以上就是使用C#修改PDF頁面大小為標準尺寸或自定義尺寸的詳細內容,更多關于C#修改PDF頁面大小的資料請關注腳本之家其它相關文章!

