C# ITextSharp 将现有 PDF 复制到新 PDF

C# ITextSharp Copy existing PDF to new PDF

我正在处理一系列 PDF 文件。其中许多都有字段,我可以使用 iTextSharp 填充这些字段。

我的问题是有一个静态 PDF 报告的尺寸似乎很奇怪,9.5 X 12。页面尺寸应该是 8.5 X 11,如果使用 Acrobat reader 打开,打印效果很好。

为了解决这个问题,我想创建一个新的 PDF 文档,使用正确的页面大小,然后将静态文件读入新文档,保存并打印。

我已经阅读了这里关于 SO 的许多帖子并进行了多次搜索以寻找解决方案,所有这些似乎都绕过了我的特定问题。

是否可以使用正确的页面大小将现有 PDF 复制到新文档?

谢谢

UPDATE

听从 Bruno 的建议,我仔细检查了裁剪框和媒体框。我正在使用的 PDF 两者都有。裁剪框数组为

[28.008, 38.016, 640.008, 830.016]

媒体框数组是

[0, 0, 668.016, 848.016]

我可以改变右上角的点,使裁剪框和媒体框成为同一个裁剪框

[28.008, 38.016, 612, 792]

和媒体框

[0, 0, 612, 792]

但是这样做会使 "text" 向右和顶部移动过多,留下不均匀的边距。

我发现通过改变裁剪框的左下坐标,我可以移动文本。事实上,将裁剪框设置为 40、40、612、792 是可行的,但是顶部和底部边距非常窄。

我需要媒体框为 0、0、612、792。这不是问题。但是,我该如何缩小裁剪框并将文本居中放置在页面上呢?我一定是遗漏了什么。

我在他的书中遵循了 Bruno 的 RotatePages 方法,还查看了这个答案,iTextSharp copy document, resize to custom size, and center

但是无论我对裁剪框进行什么更改,似乎都会放大它。

非常感谢任何建议

谢谢 Bruno Lowagie 和 mkl。在您的帮助下,我找到了这个解决方案。

private void ResizeForm ( string path, string fileName )
{
    string src = path + @"\" + fileName + "_pre.pdf";
    string dest = path + @"\" + fileName + ".pdf";

    File.Move ( dest, src );

    using ( PdfReader pdf = new PdfReader ( src ) )
    {
        PdfDictionary pageDict;
        PdfArray cropBox;
        PdfArray mediaBox;

        float letterWidth = PageSize.LETTER.Width;
        float letterHeight = PageSize.LETTER.Height;

        int pageCount = pdf.NumberOfPages;

        for ( int i = 1; i <= pageCount; i++ )
        {
            pageDict = pdf.GetPageN ( i );
            cropBox = pageDict.GetAsArray ( PdfName.CROPBOX );
            mediaBox = pageDict.GetAsArray ( PdfName.MEDIABOX );

            cropBox [ 0 ] = new PdfNumber ( 30 );
            cropBox [ 1 ] = new PdfNumber ( 40 );
            cropBox [ 2 ] = new PdfNumber ( letterWidth + 30 );
            cropBox [ 3 ] = new PdfNumber ( letterHeight + 40 );

            mediaBox [ 0 ] = new PdfNumber ( 30 );
            mediaBox [ 1 ] = new PdfNumber ( 40 );
            mediaBox [ 2 ] = new PdfNumber ( letterWidth + 30 );
            mediaBox [ 3 ] = new PdfNumber ( letterHeight + 40 );

            pageDict.Put ( PdfName.CROPBOX, cropBox );
            pageDict.Put ( PdfName.MEDIABOX, mediaBox );
        }

        PdfStamper stamper = new PdfStamper ( pdf, new FileStream ( dest, FileMode.Create ) );
        stamper.Close ( );
    }
}

这可能有点矫枉过正,但它适合我的目的。

希望这会对其他人有所帮助。