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

时间:2015-03-16 20:02:09

标签: c# itextsharp

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

我的问题是有一个静态PDF似乎报告了一个奇怪的大小,9.5 X 12.页面大小应该是8.5 X 11,如果使用Acrobat reader打开,它打印就好了。

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

我已经阅读了SO上的一些帖子,并做了一些搜索解决方案,所有这些似乎都在解决我的特定问题。

有没有办法使用正确的页面大小将现有PDF复制到新文档?

谢谢

  

更新

根据布鲁诺的建议,我仔细检查了裁剪框和媒体框。我正在使用的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]

但这样做会将“文本”向右移动过多,从而留下不均匀的边缘。

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

我需要媒体框为0,0,612,792。那里不是问题。但是,如何缩小裁剪框并使页面上的文本居中?我一定错过了什么。

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

但无论我用裁剪框改变什么,似乎放大了它。

非常感谢任何建议

1 个答案:

答案 0 :(得分:0)

谢谢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 ( );
    }
}

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

希望这会帮助别人。

相关问题