获取 PDF 写在页面中央 itextsharp

Get PDF be written in the center of the page itextsharp

我有一个可填写的 PDF 文档(总共 2 页),由不同大小的页面组成;第一页为 8.5 * 11 英寸(612 * 792),包含可填写的字段;第二页为 9.5 * 12 英寸(684 * 864),包含无可填写字段。尽管第二页更大,但可以忽略它的页边距。换句话说,如果将第二页打印成A4,则不会剪切任何内容。

但是,当我在做文档拼接时(使用612 *792),所有的第二页都会排在页面的左下角,导致部分内容丢失在页面的顶部和右边距。即使在应用 (684 *864) 时可以容纳全部内容,所有第一页也排在页面的左下角,使其在页面的顶部和右侧有一个宽的空白边距。

有没有办法让页面始终写在页面的中心,这样我就可以使用 612*792 的大小而不丢失第二页的内容?

下面是拼接方法:

private static byte[] ConcatContents(List<byte[]> pdf)
{
    byte[] all;

    using (MemoryStream ms = new MemoryStream())
    {
        Document doc = new Document(new Rectangle(612, 792));

        PdfWriter writer = PdfWriter.GetInstance(doc, ms);

        doc.Open();
        PdfContentByte cb = writer.DirectContent;
        PdfImportedPage page;

        PdfReader reader;
        foreach (byte[] p in pdf)
        {
            reader = new PdfReader(p);
            int pages = reader.NumberOfPages;

            // loop over document pages
            for (int i = 1; i <= pages; i++)
            {
               doc.NewPage();
               page = writer.GetImportedPage(reader, i);
               cb.AddTemplate(page, 0, 0);
            }
        }

        doc.Close();

        all = ms.ToArray();

        ms.Flush();
        ms.Dispose();
   }
   return all;
}

[更新]

PDF 中的原始页面大小差异

页面连接后,部分内容丢失,因为 PDF 似乎是从左下角向上生成的。页面大小差异导致页面内容丢失。如下图所示,第二页第一行内容

"BECUASE THIS FORM IS USED BY VARIOUS GOVERNMENT..."

被截断了,还有右边的一些内容。

好吧,感谢 plinth 的建议,我发现下面的代码可以完美地将所有第二页调整到页面中心。虽然这看起来不像是一个好的做法,但它最终会起作用。

// loop over document pages
for (int i = 1; i <= pages; i++)
{
    doc.NewPage();
    page = writer.GetImportedPage(reader, i);

    if (i == 1)
    {
        cb.AddTemplate(page, 0, 0);
    }
    else
    {
        float page1Height, page1Width, page2Height, page2Width;
        page1Height = reader.GetPageSizeWithRotation(i - 1).Height;
        page1Width = reader.GetPageSizeWithRotation(i - 1).Width;
        page2Height = reader.GetPageSizeWithRotation(i).Height;
        page2Width = reader.GetPageSizeWithRotation(i).Width;
        cb.AddTemplate(page, (page1Width - page2Width) / 2, (page1Height - page2Height) / 2);
    }
}

这是显示的结果