请给我建议一些库,这些库将帮助我打印包含JBIG2编码图像的PDF文件。 PDFRendererPDFBox对我没有帮助。这些库可以打印简单的PDF,但不能打印包含JBIG2图像的PDF。 PDFRenderer试图修复它(根据PDFRedndrer的bug跟踪器上的bug问题),但是某些页面(尤其是存在条形码的页面)仍然不想打印。
P.S.我在applet中使用javax.print API
谢谢!
UPDATE :也尝试过ICEPdf,也不想工作。
我得出的结论是,所有这些库(PDFRenderer,ICEPdf,PDFBox)都使用 JPedals jbig2 decoder。错误(某些页面无法打印)来自此解码器库。不再支持此解码器的开放源代码版本(在PDFRenderer,ICEPdf,PDFBox中使用),但是JPedal具有该项目的新的商业分支,他们写道,该错误已在新的商业版本中得到修复,这需要花费一定的成本。 $ 9k。
有任何想法吗?
更新2 :昨天,我尝试用其他开源JPedal's free library库替换 jbig2-imageio 。但是我没有获得任何成功的结果,所以我在他们项目的页面上创建了一个新主题(google-code的论坛-here)。将不胜感激。
我还发现了一些有关Apache PDFBox bug-tracker的有用讨论:herehere

最佳答案

Borisvl的JPedal库的一个分支位于

https://github.com/Borisvl/JBIG2-Image-Decoder#readme

其中包含速度方面的改进,我相信它也应该修复您的错误。

编辑:该错误与简单的范围检查有关。基本上,您需要防止GetPixel访问位图范围之外的x,y值。

在调用getPixel之前,需要确保满足以下条件

col> = 0且col 行> = 0且行
这是一些带有一些小范围检查的Delphi代码。我无法亲自测试Java代码,但是您需要对src/org/jpedal/jbig2/image/JBIG2Bitmap.java进行更改

procedure TJBIG2Bitmap.combine(bitmap: TJBIG2Bitmap; x, y: Integer; combOp: Int64);
...
...
var
begin
  srcWidth := bitmap.width;
  srcHeight := bitmap.height;
  srcRow := 0;
  srcCol := 0;

  if (x < 0) then x := 0;
  if (y < 0) then y := 0;

  for row := y to Min(y + srcHeight - 1, Self.height - 1) do   // <<<<<<<<  HERE
  begin
    for col := x to x + srcWidth - 1 do
    begin
      srcPixel := bitmap.getPixel(srcCol, srcRow);

安德鲁。

10-08 14:18