使用Aspose.Pdf
類庫,有很多種方法可以合並PDF文件,這里簡單介紹小生見到的幾種:
Doucment.Pages.Add
PdfFileEditor.Append
PdfFileEditor.Concatenate
Doucment.Pages.Add
要合並幾個PDF文件,實際上就是把文檔里的頁合並到同一個文件里面,
所以可以打開PDF文件,簡單的把其他文件的頁面添加即可
Doucment pdfdoc1 = new Doucment("input.pdf");
Doucment pdfdoc2 = new Doucment("input.pdf");
pdfdoc1.Pages.Add(pdfdoc2.Pages);
pdfdoc1.Save("output.pdf");
PdfFileEditor.Append
基本思路和上面是一樣的,講一個文件的頁面添加到另一個文件末尾,
但是調用這個方法需要指定輸入文件,要添加的文件,以及要添加的頁數范圍和輸出文件
PdfFileEditor.Append(input, ports, startpage, endpage, output)
-
input
輸入文件,可以是String
類型的文件路徑,也可以是Stream
類型的文件數據流 -
ports
要添加的文件,可以是一個文件,也可以是一個數組,類型同input
一樣可以是String
也可以是Stream
-
startpage
和endpage
要添加的頁數范圍,這個范圍是指所有ports
放在一起的頁數范圍
例如:ports
有三個文件,分別有3頁,4頁,5頁,指定startpage=1
和endpage=4
,
則會添加第一個文件的所有頁面和第二個文件的第一頁 -
output
輸出文件,同input
,可以是String
和Stream
類型,在ports
維數組時也可以是HttpResponse
類型
PdfFileEditor pdfeditor = new PdfFileEditor();
// 將input2.pdf的第一頁添加到input1.pdf末尾並輸出output.pdf
pdfeditor.Append("input1.pdf", "input2.pdf", 1, 1, "output.pdf");
FileStream input1 = new FileStream("input1.pdf", FileMode.Open);
FileStream input2 = new FileStream("input2.pdf", FileMode.Open);
FileStream output = new FileStream("output.pdf", FileMode.Open);
pdfeditor.Append(input1, input2, 1, 1, output);
// 將input2.pdf、input3.pdf的前6頁添加到input1.pdf末尾並輸出output.pdf
String[] ports = new String[]{"input2.pdf", "input3.pdf"};
pdfeditor.Append("input1.pdf", ports, 1, 6, "output.pdf");
FileStream input1 = new FileStream("input1.pdf", FileMode.Open);
FileStream[] ports = new FileStream[]{
new FileStream("input2.pdf", FileMode.Open),
new FileStream("input3.pdf", FileMode.Open)
};
FileStream output = new FileStream("output.pdf", FileMode.Open);
pdfeditor.Append(input1, ports, 1, 6, output);
// 將結果輸出到HTTP響應
pdfeditor.Append(input1, ports, 1, 6, HttpContext.Current.Response);
PdfFileEditor.Concatenate
Concatenate
方法與Append
的調用方式類似,也支持一個或多個路徑String
或數據流Stream
輸入,
輸出到一個路徑String
、數據流Stream
或HTTP請求響應HttpResponse
,
但是並不支持合並頁數的指定,會將輸入文件一個接着一個的合並,其重載列表如下
// 將兩個文件合並成一個輸出
Concatenate(Stream, Stream, Stream)
Concatenate(String, String, String)
// 多個文件合並成一個
Concatenate(Stream[], Stream)
Concatenate(Stream[], HttpResponse)
Concatenate(String[], String)
Concatenate(String[], HttpResponse)
Concatenate(Document[], Document)
// 前方高能
Concatenate(Stream, Stream, Stream, Stream)
Concatenate(String, String, String, String)
其中四個參數的重載方法,允許將兩個文件交叉的合並成一個文件並用指定頁填充空白頁,
舉例來說,加入input1.pdf有6頁p1, p2, p3, p4, p5, p6
,input2.pdf有3頁p1', p2', p3'
,
再加上空白頁blank.pdf,則輸出為p1, p1', p2, p2', p3, p3', p4, blank, p5, blank, p6
,
注意這里因為沒有p4', p5'
所以使用blank
頁來代替
PdfFileEditor pdfeditor = new PdfFileEditor();
pdfeditor.Concatenate("input1.pdf", "input2.pdf", "blank.pdf", "output.pdf");
另外,因為小生的業務需求,需要在pdf合成完畢之后刪除源文件,
所以就在執行完Concatenate
方法后直接調用File.Delete
方法刪除文件,
但是卻報錯了,在看了API文檔之后才了解到,需要設置
PdfFileEditor.CloseConcatenateStreams = true;
,
在合成完畢之后,關閉Stream
。
參考鏈接
Concatenate PDF Files
Append PDF files
Concatenate PDF Files with Blank PDF Using File Paths (Facades)
PdfFileEditor Class