我正在使用一系列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
但无论我用裁剪框改变什么,似乎放大了它。
非常感谢任何建议
答案 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 ( );
}
}
这可能有点矫枉过正,但它适用于我的目的。
希望这会帮助别人。