请给我建议一些库,这些库将帮助我打印包含JBIG2编码图像的PDF文件。 PDFRenderer
,PDFBox
对我没有帮助。这些库可以打印简单的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的有用讨论:here和here。
最佳答案
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);
安德鲁。