iText中是否支持PDF的比例缩放功能(如1:100,而非更改页面尺寸)
iText中是否支持PDF的比例缩放功能(如1:100,而非更改页面尺寸)
当然支持!你提到的这类绘图比例(比如1:100、1mm=100mm),本质是要定义PDF中用户单位和实际物理单位的转换关系,这可以通过操作PDF规范(ISO 32000)里的**测量字典(Measure Dictionary)**来实现,iText完全支持直接配置这些底层字典来满足需求。
你已经找对了实现方向,我来帮你梳理下这段代码的作用:
首先,我们需要创建一个测量字典,用来定义整体的缩放比例和单位转换规则:
// R Represents the scale ratio of the drawing as per ISO32000 measureDict.Put(new PdfName("R"), new PdfString("1 mm = 10 mm")); //Alternative scales "1 cm = 1m", "10 cm = 5m", "1 mm = 20 mm" // Add the /TargetUnitConversion field // This represents the conversion of the units in the scale above. Only the units // not the magnitude or scale factor. ie 2.54/72/100 for cm to m or 25.4/72 for mm to mm. measureDict.Put(new PdfName("TargetUnitConversion"), new PdfNumber(0.3527778));
R字段:按照ISO32000要求,用人类可读的字符串描述绘图比例,比如"1 mm = 10 mm"就对应1:10的缩放关系。TargetUnitConversion:定义单位转换系数,它是PDF默认用户单位(1/72英寸)到目标物理单位的换算值,这里的数值对应你需要的单位转换逻辑。
接下来,我们需要定义两个数字格式字典(NumberFormat Dictionary),分别控制源单位和目标单位的显示精度与格式:
PdfDictionary dDict = new PdfDictionary(); dDict.Put(PdfName.Type, new PdfName("NumberFormat")); dDict.Put(PdfName.U, new PdfString("m")); // Unit of measurement for /D dDict.Put(PdfName.C, new PdfNumber(1)); dDict.Put(PdfName.D, new PdfNumber(100)); dDict.Put(new PdfName("SS"), new PdfString("")); // Example value for /SS PdfDictionary xDict = new PdfDictionary(); xDict.Put(PdfName.Type, new PdfName("NumberFormat")); xDict.Put(PdfName.U, new PdfString("mm")); // Unit of measurement for /X xDict.Put(PdfName.C, new PdfNumber(3.5277778)); // This represents 25.4/72 * 10 (scale factor) xDict.Put(PdfName.D, new PdfNumber(100)); // Higher denominator for precision xDict.Put(new PdfName("SS"), new PdfString("")); // Example value for /SS
dDict:对应目标单位的格式定义,这里设置单位为米("m"),C是转换系数,D是分母,用来控制数值显示的精度(分母越大,精度越高)。xDict:对应源单位的格式定义,这里设置单位为毫米("mm"),C是结合了缩放因子的转换系数(比如25.4/72是毫米到PDF用户单位的基础换算,再乘以缩放因子10得到这里的值),同样用D控制精度。
最后记得把这些字典关联到对应的PDF页面或者文档根字典中,这样PDF阅读器就能识别并应用这些缩放比例规则了。
备注:内容来源于stack exchange,提问作者Edward Strain




