【问题标题】:C# ITextSharp Copy existing PDF to new PDFC# ITextSharp 将现有 PDF 复制到新 PDF
【发布时间】:2015-05-19 02:28:33
【问题描述】:

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

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

为了解决这个问题,我想创建一个新的 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。这不是问题。但是,如何缩小裁剪框并使页面上的文本居中?我一定是错过了什么。

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

但无论我对裁剪框所做的任何更改似乎都会放大它。

非常感谢任何建议

【问题讨论】:

  • 将文件加载到 PdfReader 中,根据需要更改裁剪框,然后使用 PdfStamper 保存所有内容。
  • 在你做任何事情之前,你应该解释你所说的意思 我的问题是有一个静态 PDF 似乎报告了一个奇怪的大小,9.5 X 12。页面大小应该为 8.5 X 11,如果使用 Acrobat 阅读器打开,打印效果很好。 也许您有一个 PDF,其中 MediaBox 为 9.5 x 12,CropBox 为 8.5 X 11。这可以解释为什么 Adob​​e Reader 会正确处理它。查看 MediaBox 可能会引起您的困惑,而实际上您应该查看 CropBox。请澄清。
  • 感谢你们两位的cmets。布鲁诺,来解决你的评论。你是对的。媒体框是 9.5 X 12,而裁剪框是 8.5 X 12。但是,打印机仍然不会打印页面。那么如何将媒体框缩小到合适的尺寸呢?
  • 将媒体框设置为裁剪框值。

标签: c# itextsharp


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多