如何用C#及iText库将A4尺寸PDF转换为Letter(半A4)尺寸
解决A4 PDF转Letter尺寸的问题
嘿,我一眼就看出你代码里的问题了——你现在只是把原A4页面原封不动地复制到新文档里,既没设置新文档为Letter尺寸,也没对原内容做缩放适配,所以输出尺寸当然没变!咱们来改改:
核心问题分析
- 你初始化
Document时用的是原PDF的A4尺寸,不是目标Letter尺寸 - 直接导入原页面模板没有做任何缩放,内容还是A4大小,超出Letter页面的部分会被截断或者显示不全
修改后的完整代码
string inPDF = Application.StartupPath + @"\log\input.pdf"; string outPDF = Application.StartupPath + @"\log\output.pdf"; using (PdfStream pdfStream = new PdfStream(inPDF, FileMode.Open)) using (PdfStream newPdfStream = new PdfStream(outPDF, FileMode.Create)) using (PdfReader reader = new PdfReader(pdfStream)) { // 初始化文档为Letter尺寸,而不是原PDF的A4 Document document = new Document(PageSize.LETTER); PdfWriter writer = PdfWriter.GetInstance(document, newPdfStream); document.Open(); PdfContentByte content = writer.DirectContent; // 获取原A4页面的尺寸 Rectangle originalPageSize = reader.GetPageSize(1); // 获取目标Letter页面的尺寸 Rectangle targetPageSize = PageSize.LETTER; // 计算缩放比例:取宽和高缩放比例中较小的那个,确保内容完整适配 float scaleX = targetPageSize.Width / originalPageSize.Width; float scaleY = targetPageSize.Height / originalPageSize.Height; float scale = Math.Min(scaleX, scaleY); // 计算偏移量,让内容在Letter页面居中显示 float xOffset = (targetPageSize.Width - originalPageSize.Width * scale) / 2; float yOffset = (targetPageSize.Height - originalPageSize.Height * scale) / 2; // 导入原页面并按缩放比例和偏移量添加到新文档 PdfImportedPage page = writer.GetImportedPage(reader, 1); content.AddTemplate(page, scale, 0, 0, scale, xOffset, yOffset); document.Close(); }
关键修改点说明
- 设置目标文档尺寸:初始化
Document时直接用PageSize.LETTER,明确告诉iText你要生成Letter大小的PDF - 计算缩放比例:因为Letter比A4略小(A4是210×297mm,Letter是216×279mm),所以必须按比例缩小原内容,避免内容被截断
- 居中内容:通过计算偏移量,让缩放后的A4内容在Letter页面里居中显示,不会出现偏移到角落的情况
- 使用using语句:添加using自动释放资源,避免内存泄漏(原代码里没处理资源释放,这是个好习惯)
另外注意:你原代码里的Directcontent拼写错了,应该是DirectContent;还有旧版本iText里的方法名是GetInstance和GetImportedPage,不是小写开头的getInstance和getImportPage,这些拼写错误也可能导致代码运行异常哦!
内容的提问来源于stack exchange,提问作者Bình Chu
相关产品推荐
相关产品推荐

