如何用iTextSharp缩放PDF首页原有内容并在上方添加新内容?
PDF第一页缩放原有内容并添加固定顶部条码的实现问题
需求说明
- 打开目标PDF,仅对第一页的原有内容进行缩放,在页面顶部居中位置添加条码及对应文本;其余页面保持原样,最终输出为新PDF文件
- 原第一页的现有内容(红色块)需缩小后放置在新增的顶部内容(蓝色块)下方
原代码问题原因
你编写的代码中,条码被意外缩放的核心原因是图形状态变换的顺序错误:
- 原代码先通过
GetUnderContent(p).SetLiteral(...)给页面设置了缩放平移的图形变换(连续两个q指令压入状态栈,未执行Q恢复) - 之后才在
OverContent中添加条码
由于PDF页面内容是按指令顺序执行的,后续的原页面内容和条码都会处于这个缩放变换的状态中,导致条码也被缩放,无法固定在页面顶部。
修正后的代码及解释
基于调整图形变换顺序的思路,修正后的代码如下:
iTextSharp.text.Image bc = iTextSharp.text.Image.GetInstance(Code128.GetBarcode(barcodeContent, 5), ImageFormat.Bmp); string path = "C:\\"; PdfReader pdfReader = new PdfReader(Path.Combine(path, @"multipageimage.pdf")); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(Path.Combine(path, @"multipageimage2.pdf"), FileMode.Create)); float pageWidth = pdfReader.GetPageSize(1).Width, pageHeight = pdfReader.GetPageSize(1).Height; bc.ScaleAbsolute(pageWidth / 3, 40); bc.SetAbsolutePosition((pageWidth - bc.Width) / 2, pageHeight - bc.Height); int n = pdfReader.NumberOfPages; for (int p = 1; p <= n; p++) { float percentage = 1.0f; if (p == 1) percentage = 0.7f; float offsetX = (pdfReader.GetPageSize(p).Width * (1 - percentage)) / 2; float offsetY = (pdfReader.GetPageSize(p).Height * (1 - percentage)) / 2; PdfContentByte pdfContentByte = pdfStamper.GetUnderContent(p); if (p == 1) { // 先在底层内容绘制条码,此时还未应用缩放变换,条码位置固定 pdfContentByte.AddImage(bc); } // 再设置缩放平移变换,该变换仅影响后续绘制的原页面内容 pdfContentByte.SetLiteral(String.Format("\nq {0} 0 0 {1} {2} {3} cm\nq\n", percentage, percentage, offsetX, offsetY)); pdfContentByte = pdfStamper.GetOverContent(p); } pdfStamper.Close(); pdfReader.Close();
关键修正点
- 调整绘制顺序:先在
UnderContent中添加条码,再设置缩放变换指令。这样条码在未应用任何缩放的状态下绘制,能够固定在页面顶部的指定位置 - 缩放仅作用于原内容:后续的缩放变换指令会影响原页面内容的绘制,实现第一页原有内容的缩小偏移,而条码不受该变换影响
内容的提问来源于stack exchange,提问作者Martin Robins
相关产品推荐
相关产品推荐

