合并PDF并使用ITextSharp删除空白区域

时间:2013-08-26 12:52:49

标签: c# winforms pdf 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和两个图像仅在一个页面上。

BUt我不想那样做

这里我只举两个图像的例子,但实际上有20多个图像(转换成PDF)。

因此,根据图像大小,它应该组合文件。我无法为每个文件中的每个文件提供修复和协调

任何人都可以帮我把多个PDF组合成单个而没有空格..?

enter image description here

1 个答案:

答案 0 :(得分:0)

在结构上,这是你想要做的:

  • 分配“正确”尺寸的新页面
  • 合并网页的内容流
  • 合并页面的资源
  • 调整所有注释(如果有)

第一步很简单,其余的,第二步很容易,第三步不是那么多(并且会产生使第2步复杂化的副作用)。我会提前告诉你我对你的订单撒了谎。

合并内容流将是直截了当的。你想要做的是一个四步过程(我会在这里注入,我知道PDF非常好,但iTextSharp不太好):

  1. 插入gsave运算符(q)
  2. 插入转换运算符(cm)以转换为要显示内容的位置。在您的情况下,它将是1 0 0 1 X Y cm
  3. 从当前页面复制内容流
  4. 插入grestore运算符(Q)
  5. 要合并资源,您必须查看新创建的页面的资源,并且对于当前页面,为PDF页面中的每个资源类别中的每个资源执行以下三项操作之一(XObject,Font,ColorSpace,ExtGState,Pattern ,Shading,ProcSet - 虽然对于procset,你可以将每个procset设置为整个套件并且不会造成伤害):

    1. 如果资源存在于新创建的页面中,但名称不同,请将其标记为已重命名。
    2. 如果资源在新创建的页面中不存在且没有相同名称的资源,请将其复制。
    3. 如果资源在新创建的页面中不存在且名称冲突,请将资源重命名为不在新创建页面中的合成名称并将其复制。
    4. 现在回到我的谎言。在资源合并中,您可能需要为当前页面构建的映射,将旧资源名称映射到新资源名称。在将内容流从一个复制到下一个的过程中,您需要将内容流中引用的所有资源名称映射到资源合并步骤中构建的新名称。

      要调整注释,您必须通过调整每个注释中的Rect属性将它们移动到新位置。您还需要重置/ Parent属性。对于任何文本标记注释,您需要调整四元组。

      现在,这里的所有作品都会被搞砸。如果页面被旋转,这将不起作用。如果页面有裁剪框,​​则必须查看它并调整裁剪区域以模拟裁剪。如果页面被旋转并具有文本注释,则需要注意注释标记以确保宽高比正确。如果文档在带有GoTo操作/目标的任何页面上都有链接注释,则需要调整这些注释。