我已經在網上尋找如何做到這一點的例子。我發現了一些似乎更復雜一些的事情,然後他們需要做到。所以我的問題是,使用iTextSharp,是否有一種相當簡潔的方式將一個PDF文檔附加到另一個PDF文檔?是否有直接的方式來使用iTextSharp將一個PDF文檔附加到另一個PDF文檔?
理想情況下,這不會涉及第三個文件。只需打開第一個PDF文檔,將第二個PDF文檔附加到第一個PDF文檔,然後關閉它們。
我已經在網上尋找如何做到這一點的例子。我發現了一些似乎更復雜一些的事情,然後他們需要做到。所以我的問題是,使用iTextSharp,是否有一種相當簡潔的方式將一個PDF文檔附加到另一個PDF文檔?是否有直接的方式來使用iTextSharp將一個PDF文檔附加到另一個PDF文檔?
理想情況下,這不會涉及第三個文件。只需打開第一個PDF文檔,將第二個PDF文檔附加到第一個PDF文檔,然後關閉它們。
好的,這不是直接的,但它的工作原理和令人驚訝的快速。 (它使用第三個文件,沒有打開和追加的東西。)我在文檔/示例中發現了這個。這裏的代碼:
private void CombineMultiplePDFs(string[] fileNames, string outFile) {
int pageOffset = 0;
ArrayList master = new ArrayList();
int f = 0;
Document document = null;
PdfCopy writer = null;
while (f < fileNames.Length) {
// we create a reader for a certain document
PdfReader reader = new PdfReader(fileNames[ f ]);
reader.ConsolidateNamedDestinations();
// we retrieve the total number of pages
int n = reader.NumberOfPages;
ArrayList bookmarks = SimpleBookmark.GetBookmark(reader);
if (bookmarks != null) {
if (pageOffset != 0) {
SimpleBookmark.ShiftPageNumbers(bookmarks, pageOffset, null);
}
master.AddRange(bookmarks);
}
pageOffset += n;
if (f == 0) {
// step 1: creation of a document-object
document = new Document(reader.GetPageSizeWithRotation(1));
// step 2: we create a writer that listens to the document
writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create));
// step 3: we open the document
document.Open();
}
// step 4: we add content
for (int i = 0; i < n;) {
++i;
if (writer != null) {
PdfImportedPage page = writer.GetImportedPage(reader, i);
writer.AddPage(page);
}
}
PRAcroForm form = reader.AcroForm;
if (form != null && writer != null) {
writer.CopyAcroForm(reader);
}
f++;
}
if (master.Count > 0 && writer != null) {
writer.Outlines = master;
}
// step 5: we close the document
if (document != null) {
document.Close();
}
}
是的。我在iText論壇上看到一個名爲PdfManipulation的類。但是使用這個類將涉及第三個文件。
該類最初在VB.Net中。我從post on vbforums.com下載它。顯然,它沒有合併文件功能,所以我根據該類中的代碼編寫了一個。
這是寫在沒有iTextSharp的機器上。這可能有錯誤。我甚至不確定頁碼是基於0還是1。但給它一個鏡頭。
public static void MergePdfFiles(IEnumerable<string> files, string output) {
iTextSharp.text.Document doc;
iTextSharp.text.pdf.PdfCopy pdfCpy;
doc = new iTextSharp.text.Document();
pdfCpy = new iTextSharp.text.pdf.PdfCopy(doc, new System.IO.FileStream(output, System.IO.FileMode.Create));
doc.Open();
foreach (string file in files) {
// initialize a reader
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(file);
int pageCount = reader.NumberOfPages;
// set page size for the documents
doc.SetPageSize(reader.GetPageSizeWithRotation(1));
for (int pageNum = 1; pageNum <= pageCount; pageNum++) {
iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, pageNum);
pdfCpy.AddPage(page);
}
reader.Close();
}
doc.Close();
}
我不知道如何處理PDF文件,但是對於postscript,您只需連接文件。如果你有pdf2ps和PS2PDF安裝,下面將做的工作:
pdf2ps file1.pdf file1.ps
pdf2ps file2.pdf file2.ps
cat file1.ps file2.ps > combined.ps
ps2pdf combined.ps combined.pdf
我不是pdf2ps或PS2PDF專家。我只使用ps2pdf,當我這樣做時,它將文本留爲文本(我仍然可以從生成的pdf中選擇和複製文本)。當我執行上述步驟時(pdf-> ps,combine,ps-> pdf),我最終得到的pdf就像圖像一樣。不知道爲什麼。
我真的可能會錯過一些東西,但我做了更簡單的事情。我承認這個解決方案可能不會更新書籤(如迄今爲止的最佳答案),但它對我來說完美無瑕。由於我將文檔與可填寫的表單合併,因此我使用了PdfCopyFields而不是PdfCopy。
下面是代碼(我已經去除了所有的錯誤處理,以使實際的代碼更明顯,加try..finally如果你打算使用的代碼,關閉打開的資源):
void MergePdfStreams(List<Stream> Source, Stream Dest)
{
PdfCopyFields copy = new PdfCopyFields(Dest);
foreach (Stream source in Source)
{
PdfReader reader = new PdfReader(source);
copy.AddDocument(reader);
}
copy.Close();
}
你可以通過任何流,無論是一個FileStream,一個MemoryStream(讀取來自數據庫的PDF文件時非常有用,無需臨時文件等等)
使用範例:
void TestMergePdfStreams()
{
List<Stream> sources = new List<Stream>()
{
new FileStream("template1.pdf", FileMode.Open),
new FileStream("template2.pdf", FileMode.Open),
new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"])
};
MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create));
}
這適用於試圖合併/附加兩個PDF文檔與表單域!更簡單!謝謝。 – 2012-01-27 18:29:55
頁碼從1 – 2016-03-01 15:35:16