问题:
-
当使用PDFLib把jpg转成pdf正常,把tif转pdf的时候就遇到了麻烦。如果tif是CCITT压缩格式则正常,如果是tif是jpg压缩或者lzw(其他压缩格式没有测试) 转换是速度就较慢了而且转出来的pdf文件大小比tif文件大了好几倍,分析原因可能是PDFLib中对于tif压缩格式的处理方式不同。通过设置compress参数也 未能解决。PDFLib: set_value() compress 压缩级别,从0代表无压缩,1代表最快速度等至9代表最佳压缩。该参数不会影响以通过(passthrough) 模式处理的图像数据。默认值:6。范围:页面、文档。
-
当使用ImageEn 3.0.0中的ImageEnIO来把jpg转成pdf时的速度比使用PDFLib逊色多了,如果是使用ImageEnIO来把tif转成pdf则速度比PDFLib块。
-
使用ImageEnIO转换pdf时候需要设置ImageEnIO.Params.PDF_PaperWidth和ImageEnIO.Params.PDF_PaperHeight参数(默认值width=595 height=842 (A4幅面),但是实际需要转换的jpg或者tif的尺寸不是A4、A3...等幅面的标准尺寸导致转换出来的pdf有白边。
解决方法:
-
问题1和2综合起来的解决方法就是把jpg转pdf时使用PDFLib,把tif转pdf时使用ImageEnIO。
-
.问题3解决方法是ImageEnIO.LoadFromFile()后面设置PDF_PaperWidth和PDF_PaperHeight两个参数。代码如下:
ImageEnIO1.CreatePDFFile('C:\J001-002-0010\IEPDF.pdf'); for i := 1 to 3 do begin fileName := 'C:\J001-002-0010\' + Format('%.8d', [i]) + '.tif'; ImageEnIO1.LoadFromFile(fileName); //设置PDF压缩格式为JPEG压缩 ImageEnIO1.Params.PDF_Compression := ioPDF_JPEG; //图片宽度(像素)转pdf纸张宽度 ImageEnIO1.Params.Width width := Trunc(ImageEnIO1.Params.EXIF_ExifImageWidth / 4.16); //图片高度(像素)转pdf纸张高度 ImageEnIO1.Params.Heght height := Trunc(ImageEnIO1.Params.EXIF_ExifImageHeight / 4.16); ImageEnIO1.Params.PDF_PaperWidth := width; ImageEnIO1.Params.PDF_PaperHeight := height; ImageEnIO1.SaveToPDF; end;
如果只是上面的这段代码还不能解决转换出来的pdf有白边的问题!根据跟踪ImageEnIO1.SaveToPDF函数到bmpfilt单元中的IEPDFSave函数找到最终解决方法。在IEPDFSave函数中有IEFitResample(bitmap.Width, bitmap.height, IOParams.PDF_PaperWidth, IOParams.PDF_PaperHeight, w, h);这一行,这是采样设置生成pdf 的宽度和高度的函数(具体情况可以进入IEFitResample函数查看),最终解决方法就是注释掉行代码然后在下面添加两行代码,如下:
//IEFitResample(bitmap.Width, bitmap.height, IOParams.PDF_PaperWidth, IOParams.PDF_PaperHeight, w, h);
w := IOParams.PDF_PaperWidth;
h := IOParams.PDF_PaperHeight;
测试比较:
下面给出PDFLib处理面3张tif图的代码
pdf.begin_document('C:\J001-002-0010\PDFLib.pdf', ''); for i := 1 to 3 do begin fileName := 'C:\J001-002-0010\' + Format('%.8d', [i]) + '.tif'; image := pdf.load_image('auto', fileName, ''); pdf.begin_page_ext(0, 0, ''); pdf.fit_image(image, 0, 0, 'adjustpage dpi {300 300}'); //pdf.set_value('compress', 6); pdf.close_image(image); pdf.end_page_ext('');// 'height {a4.height} width {a4.width}' end; pdf.end_document('');
上面3张tif总大小是3.49M,利用ImageEnIO转换tif耗时3.16秒生成pdf大小是1.84M,利用PDFLib转换tif耗时9.44秒生成pdf大小是19.38M!
另外拿了12张jpg(总大小是4.08M)来测试,结果利用ImageEnIO转换耗时3.03秒生成pdf大小是1.18M,利用PDFLib转换耗时1.77秒生成pdf大小是4.18M!
总结:
对PDFLib还不够了解,或许通过PDFLib也能解决上面问题。ImageEn确实强大,但是其源码执行效率有待提高。
提高自己才是王道!