繁体   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