将PDF转换为图像文件时的像素移位

时间:2015-08-10 13:44:54

标签: java pdf pdfbox

我正在使用PDFBox将PDF文档转换为图像。 但在某些页面上,少量内容不会一致地呈现。似乎小区域正在移动一点点(1-3像素)。 这是代码:

document = PDDocument.load(pdfFile);
list = document.getDocumentCatalog().getAllPages();

for (int i = 0; i < list.size(); i++) {
    PDPage temp = list.get(i);
    BufferedImage image = temp.convertToImage(BufferedImage.TYPE_INT_RGB, 150);
    File outputfile = new File(fileName + "_" + (i + 1) + ".png");
    ImageIOUtil.writeImage(image, outputfile.getAbsolutePath(), 150);
    //ImageIO.write(image, "jpg", outputfile);
}

有人可以就如何解决这个问题提出建议吗?

我通过逐个像素地比较创建的图像和预期的图像来获得差异。页面上还有其他内容,但只有一小部分正在转移。

创建的,diff,预期图像的链接在这里: https://www.dropbox.com/sh/mii7lo3dsvi0kmx/AABNWZ7lbdgHkSQw4RTm1IDoa?dl=0

请告知如何解决它! 谢谢!

1 个答案:

答案 0 :(得分:0)

比较图像

此问题的关键区域包含两个公式。 OP图像上的这些区域如下所示:

  

预期的配方外观:

     

expected formula appearance

  

创建公式外观

     

created formula appearance

不同之处在于字体大小略有不同,预计它们会比创建的大。

比较Adobe Acrobat中的原始PDF

在OP提供这些图像的源PDF后,可以使用Adobe Acrobat进行模拟图像导出。结果:

  

由Acrobat呈现的预期公式外观

     

expected formula appearance

  

创建公式外观,由Acrobat呈现

     

created formula appearance

在这里,人们也可以看到差异......

字母和数字与上面的字母和数字大不相同,因为有问题的字体未嵌入,Acrobat使用不同的实际字体程序。

但是嵌入了一种字体,带有数学符号的符号字体。因此可以更严格地比较这些符号。此外,分数中的线也是使用矢量图形生成的,也与字体替换无关。比较这些部分相对于彼此的位置,可以看出Acrobat和PDFBox对相同的源进行相同的渲染(对于不同的源PDF具有相同的差异)。

在内部比较原始PDF

确实,源PDF有所不同。公式是使用表单Xobjects绘制的,虽然两个文档中页面内容的内部非常相似(一些小的更改但字体大小相同),但Xobjects中的字体大小不同。

因此,在处理表单Xobjects时,应用于PDF的后处理器看起来有一些错误。