0

我在处理图像 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合并成一个没有空格的PDF..?

在此处输入图像描述

4

1 回答 1

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. 如果资源存在于新创建的页面中,但名称不同,则将其标记为重命名。
  2. 如果新创建的页面中不存在该资源,并且没有同名资源,则将其复制进去。
  3. 如果新创建的页面中不存在资源并且存在名称冲突,请将资源重命名为新创建页面中没有的合成名称并复制进去。

现在回到我的谎言。在资源合并中,您可能需要为当前页面构建一个映射,将旧资源名称映射到新资源名称。在将内容流从一个复制到另一个的过程中,您需要将内容流中引用的所有资源名称映射到资源合并步骤中构建的新名称。

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

现在,这就是所有这些工作都会被搞砸的地方。如果页面被旋转,这将不起作用。如果页面有裁剪框,​​您必须查看它并调整裁剪区域以模拟裁剪。如果页面被旋转并且有文本注释,这将需要注意注释标志以确保纵横比正确。如果文档在任何带有 GoTo 操作/目标的页面上都有链接注释,您将需要调整这些注释。

于 2013-08-26T16:17:00.530 回答