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 ( );
}
}
这可能有点矫枉过正,但它适合我的目的。
希望这会对其他人有所帮助。
我正在处理一系列 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 ( );
}
}
这可能有点矫枉过正,但它适合我的目的。
希望这会对其他人有所帮助。