2013-08-26 113 views
0

我在處理圖像PDF文件時遇到問題(PDF文件僅包含圖像,沒有文本)有兩個PDF文件img1,img2,我想將它們中的兩個合併合併成一個A4頁面的PDF文件。合併PDF文件並用ITextSharp刪除空格

我試過下面的代碼。

string Img1 = "C:/temp/image1.pdf"; 
string Img2 = "C:/temp/image2.pdf"; 
string MergedFile = "C:/temp/Combo.pdf"; 

//Create our PDF readers 
PdfReader r1 = new PdfReader(Img1); 
PdfReader r2 = new PdfReader(Img2); 

//Our new page size, an A3 in landscape mode 
iTextSharp.text.Rectangle NewPageSize = PageSize.A3.Rotate(); 

using (FileStream fs = new FileStream(MergedFile, FileMode.Create, 
            FileAccess.Write, FileShare.None)) 
{ 
    //Create our document without margins 
    using (Document doc = new Document(NewPageSize, 0, 0, 0, 0)) 
    { 
     using (PdfWriter w = PdfWriter.GetInstance(doc, fs)) 
     { 
      doc.Open(); 
      //Get our imported pages 
      PdfImportedPage imp1 = w.GetImportedPage(r1, 1); 
      PdfImportedPage imp2 = w.GetImportedPage(r2, 1); 
      //Add them to our merged document at specific X/Y coords 
      **w.DirectContent.AddTemplate(imp1, 0, 0); 
      w.DirectContent.AddTemplate(imp2, 0, -350);** 
      doc.Close(); 
     } 
    } 
} 
r1.Close(); 
r2.Close(); 

所以,當我執行上面的代碼,因爲我已經提到在y座標,它會結合PDF和兩個圖像將只有一個頁面上。

但我並不想這樣做,

我在這裏只是給例如兩個圖像,但在實際有超過20幅圖像(轉換成PDF文件)。

因此,根據圖像大小,它應該結合文件。我不能給每個文件的每個n修復y座標

任何人都可以請幫助我將多個PDF合併成單個沒有空白空間..?

enter image description here

+0

那麼原始PDF中是否有空格,並且您希望僅裁剪圖像然後合併? –

+0

@ChrisHaas是的,正好 – User5590

+0

* BUt我不想這樣做* - 你只是不想這樣做,因爲你不知道** y **座標?或者還有其他原因?如果僅僅是因爲** y **座標,則可以將iTextSharp解析器類應用於源頁面以確定每個頁面的** y **座標範圍,並從中計算出** y ** 'AddTemplate'調用。 – mkl

回答

0

結構上,這裏是你想做的事:

  • 分配「合適」大小
  • 的一個新的頁面合併頁面的內容流
  • 合併的頁面資源
  • 調整所有註釋(如有)

第一步很容易,其餘的,第二步很容易,第三步不那麼多(並且會有複雜的步驟2的副作用)。我會提前告訴你我對你的命令撒謊。

合併內容流將會很簡單。什麼,你會想要做的就是四個步驟(我將在這裏注入,我知道PDF非常好,但iTextSharp的不太好):

  1. 插入gsave運營商(Q)
  2. 插入一個變換運算符(cm)轉換爲您希望內容出現的位置。在你情況下,將1 0 0 1 X Y cm
  3. 複製從當前頁面
  4. 內容流中插入grestore運營商(Q)

要合併的資源,你要看看你的新創建的頁面的資源和對於當前頁面,爲PDF頁面(XObject,Font,ColorSpace,ExtGState,Pattern,Shading,ProcSet)中的每個資源類中的每個資源執行三件事之一 - 儘管對於procset,您可以將每個procset設置爲整個套件並且沒有傷害):

  1. I f資源存在於新創建的頁面中,但在不同的名稱下,將其標記爲已重命名。
  2. 如果新創建的頁面中不存在該資源,並且沒有具有相同名稱的資源,請將其複製進去。
  3. 如果資源沒有在新創建的頁面存在,並有一個名稱衝突,重命名資源,以合成名稱未在新創建的頁面,並將其複製英寸

現在要回我的謊言。在資源合併中,您可能需要爲當前頁面構建的映射,該映射將舊資源名稱映射到新資源名稱。在將內容流從一個複製到下一個時,您需要將內容流中引用的所有資源名稱映射到資源合併步驟中構建的新名稱。

要調整註釋,您必須通過調整每個中的Rect屬性將它們移動到新的位置。您還需要重置/ Parent屬性。對於任何文本標記註釋,您都需要調整四邊形。

現在,這裏是所有的作品將被堵上的地方。如果頁面被旋轉,這將不起作用。如果一個頁面有一個裁切框,您將不得不查看它並調整裁剪區域以模擬裁剪。如果頁面旋轉並具有文本註釋,則需要注意註釋標記以確保縱橫比正確。如果文檔在任何帶GoTo操作/目標的頁面上都有鏈接註釋,則需要對其進行調整。

+0

你能舉個例子代碼...? – User5590