簡體   English   中英

合並PDF並使用ITextSharp刪除空白

[英]Merging PDFs and remove blank space with ITextSharp

使用圖像PDF文件時出現問題(僅包含圖像的PDF文件,無文本),有兩個PDF文件img1,img2,我想將其中兩個合並為一個A4頁PDF文件。

我試過下面的代碼。

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 coord,它將結合pdf格式,並且兩個圖像僅在一頁上。

但是我不想那樣做

在這里,我僅給出兩個圖像的示例,但實際上有20多個圖像(轉換為PDF)。

因此,根據圖像大小,應合並文件。 我無法為每個文件的每個n給出y坐標

誰能幫我將多個PDF合並為一個沒有空格的文件嗎?

在此處輸入圖片說明

從結構上講,這是您要執行的操作:

  • 分配“正確”大小的新頁面
  • 合並頁面的內容流
  • 合並頁面資源
  • 調整所有注釋(如果有)

第一步很容易,其余步驟很容易,第二步很容易,第三步沒那么多(並且會產生使步驟2復雜化的副作用)。 我會提前通知您我對您說謊。

合並內容流將很簡單。 您將要做的是一個四步過程(在這里我會非常清楚地了解PDF,但iTextSharp不太好):

  1. 插入gsave運算符(q)
  2. 插入一個變換運算符(cm),以變換到想要顯示內容的位置。 您的情況將是1 0 0 1 XY cm
  3. 復制當前頁面的內容流
  4. 插入一個grestore運算符(Q)

要合並資源,您必須查看新創建的頁面的資源,對於當前頁面,請對PDF頁面中的每個資源類中的每個資源做三件事之一(XObject,Font,ColorSpace,ExtGState,Pattern,Shading, ProcSet-盡管對於procset,您可以將每個procset設置為整個套件,而不會造成傷害):

  1. 如果資源存在於新創建的頁面中,但使用不同的名稱,則將其標記為重命名。
  2. 如果新創建的頁面中不存在該資源,並且沒有相同名稱的資源,則將其復制到其中。
  3. 如果新創建的頁面中不存在該資源,並且存在名稱沖突,請將該資源重命名為新創建的頁面中沒有的綜合名稱,然后將其復制到其中。

現在回到我的謊言。 在資源合並中,您可能需要為當前頁面構建的映射,用於將舊資源名稱映射到新資源名稱。 在將內容流從一個復制到另一個時,您需要將內容流中引用的所有資源名稱映射到在資源合並步驟中構建的新名稱。

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

現在,在這里所有這些東西都將粘在這里。 如果頁面被旋轉,將無法使用。 如果頁面上有一個裁剪框,則必須查看它並調整剪切區域以模擬裁剪。 如果頁面旋轉並具有“文本”注釋,則需要注意注釋標志以確保縱橫比正確。 如果文檔在任何具有GoTo操作/目標的頁面上具有鏈接注釋,則需要進行調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM