jpg和tif转pdf遇到的问题和解决方法

问题:

  1. 当使用PDFLib把jpg转成pdf正常,把tif转pdf的时候就遇到了麻烦。如果tif是CCITT压缩格式则正常,如果是tif是jpg压缩或者lzw(其他压缩格式没有测试)  转换是速度就较慢了而且转出来的pdf文件大小比tif文件大了好几倍,分析原因可能是PDFLib中对于tif压缩格式的处理方式不同。通过设置compress参数也 未能解决。PDFLib: set_value() compress 压缩级别,从0代表无压缩,1代表最快速度等至9代表最佳压缩。该参数不会影响以通过(passthrough) 模式处理的图像数据。默认值:6。范围:页面、文档。
  2. 当使用ImageEn 3.0.0中的ImageEnIO来把jpg转成pdf时的速度比使用PDFLib逊色多了,如果是使用ImageEnIO来把tif转成pdf则速度比PDFLib块。
  3. 使用ImageEnIO转换pdf时候需要设置ImageEnIO.Params.PDF_PaperWidth和ImageEnIO.Params.PDF_PaperHeight参数(默认值width=595 height=842 (A4幅面),但是实际需要转换的jpg或者tif的尺寸不是A4、A3...等幅面的标准尺寸导致转换出来的pdf有白边。

解决方法:

  1. 问题1和2综合起来的解决方法就是把jpg转pdf时使用PDFLib,把tif转pdf时使用ImageEnIO。
  2. .问题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确实强大,但是其源码执行效率有待提高。
  提高自己才是王道!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值