当前位置: 首页 > 知识库问答 >
问题:

pdfbox和itext-dpi不正确的图像提取

东门俊智
2023-03-14

当我使用pdfbox提取图像时,我得到了一些PDF图像的不正确dpi。当我使用Photoshop或Acrobat Reader Pro提取图像时,我可以看到图像的dpi是200使用windows照片查看器,但当我使用pdfbox提取图像时,dpi是72。

为了提取图像,我使用以下代码:无法从PDFA1-a格式文档中提取图像

当我检查日志时,我看到一个不寻常的条目:2015-01-23-main——DEBUG org。阿帕奇。pdfbox。util。TIFFUtil:

     <?xml version="1.0" encoding="UTF-8"?><javax_imageio_jpeg_image_1.0>
      <JPEGvariety>
    <app0JFIF majorVersion="1" minorVersion="2" resUnits="0" Xdensity="1" Ydensity="1" thumbWidth="0" thumbHeight="0"/>
  </JPEGvariety>
  <markerSequence>
    <dqt>
      <dqtable elementPrecision="0" qtableId="0"/>
      <dqtable elementPrecision="0" qtableId="1"/>
    </dqt>
    <dht>
      <dhtable class="0" htableId="0"/>
      <dhtable class="0" htableId="1"/>
      <dhtable class="1" htableId="0"/>
      <dhtable class="1" htableId="1"/>
    </dht>
    <sof process="0" samplePrecision="8" numLines="0" samplesPerLine="0" numFrameComponents="3">
      <componentSpec componentId="1" HsamplingFactor="2" VsamplingFactor="2" QtableSelector="0"/>
      <componentSpec componentId="2" HsamplingFactor="1" VsamplingFactor="1" QtableSelector="1"/>
      <componentSpec componentId="3" HsamplingFactor="1" VsamplingFactor="1" QtableSelector="1"/>
    </sof>
    <sos numScanComponents="3" startSpectralSelection="0" endSpectralSelection="63" approxHigh="0" approxLow="0">
      <scanComponentSpec componentSelector="1" dcHuffTable="0" acHuffTable="0"/>
      <scanComponentSpec componentSelector="2" dcHuffTable="1" acHuffTable="1"/>
      <scanComponentSpec componentSelector="3" dcHuffTable="1" acHuffTable="1"/>
    </sos>
  </markerSequence>
</javax_imageio_jpeg_image_1.0>

我试图谷歌,但我可以看到找出这个日志的pdfbox的意思。这是什么意思?

您可以从以下链接下载带有此问题的pdf示例:http://myslams.com/test/1.pdf

我甚至试过itext,但它是以96 dpi提取图像。

我做错什么了吗?或者pdfbox和itext有这个限制?

共有1个答案

武成和
2023-03-14

经过一番挖掘,我找到了你的1.pdf.因此,...

在对@Tilman最近的回答的评论中,您正在讨论这个较旧的回答,其中@Tilman指向PrintImageLocations PDFBox示例。我为你的文件运行了它,得到:

Processing page: 0
*******************************************************************
Found image [Im0]
position = 0.0, 0.0
size = 1704px, 888px
size = 613.44, 319.68
size = 8.52in, 4.44in
size = 216.408mm, 112.776mm

Processing page: 1
*******************************************************************
Found image [Im0]
position = 0.0, 0.0
size = 1704px, 2800px
size = 613.44, 1008.0
size = 8.52in, 14.0in
size = 216.408mm, 355.6mm

Processing page: 2
*******************************************************************
Found image [Im0]
position = 0.0, 0.0
size = 1704px, 2800px
size = 613.44, 1008.0
size = 8.52in, 14.0in
size = 216.408mm, 355.6mm

Processing page: 3
*******************************************************************
Found image [Im0]
position = 0.0, 0.0
size = 1704px, 1464px
size = 613.44, 527.04
size = 8.52in, 7.3199997in
size = 216.408mm, 185.928mm

在所有页面上,这在x和y方向上都达到200 dpi(1704px/8.52 in=888px/4.44 in=2800px/14.0 in=1464px/7.32 in=200 dpi)。

因此,PDFBox将为您提供所需的dpi值。

(@Tilman:2.0.0-SNAPSHOT当前版本的示例返回的完全是胡说八道;您可能需要修复此问题。)

PDFBox示例的简化iText版本如下:

public void printImageLocations(InputStream stream) throws IOException
{
    PdfReader reader = new PdfReader(stream);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    ImageRenderListener listener = new ImageRenderListener();

    for (int page = 1; page <= reader.getNumberOfPages(); page++)
    {
        System.out.printf("\nPage %s:\n", page);
        parser.processContent(page, listener);
    }
}

static class ImageRenderListener implements RenderListener
{
    public void beginTextBlock() { }
    public void renderText(TextRenderInfo renderInfo) { }
    public void endTextBlock() { }

    public void renderImage(ImageRenderInfo renderInfo)
    {
        try
        {
            PdfDictionary imageDict = renderInfo.getImage().getDictionary();

            float widthPx = imageDict.getAsNumber(PdfName.WIDTH).floatValue(); 
            float heightPx = imageDict.getAsNumber(PdfName.HEIGHT).floatValue();
            float widthUu = renderInfo.getImageCTM().get(Matrix.I11);
            float heigthUu = renderInfo.getImageCTM().get(Matrix.I22);

            System.out.printf("Image %.0fpx*%.0fpx, %.0fuu*%.0fuu, %.2fin*%.2fin\n", widthPx, heightPx, widthUu, heigthUu, widthUu/72, heigthUu/72);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

(注意:我假设未旋转和未倾斜的图像。)

您的文件的结果:

Page 1:
Image 1704px*888px, 613uu*320uu, 8,52in*4,44in

Page 2:
Image 1704px*2800px, 613uu*1008uu, 8,52in*14,00in

Page 3:
Image 1704px*2800px, 613uu*1008uu, 8,52in*14,00in

Page 4:
Image 1704px*1464px, 613uu*527uu, 8,52in*7,32in

因此,也一直是200dpi。因此,iText也会为您提供所需的dpi值。

显然,您引用的代码没有机会报告PDF上下文中的dpi值,因为它只提取在资源中找到的图像,而忽略页面上如何使用相应的图像资源。

当作者在页面内容中使用图像资源时,可以以作者喜欢的任何方式拉伸、旋转、倾斜。

顺便说一句,只有作者没有倾斜和旋转90度的倍数,dpi值才有意义。

 类似资料:
  • 我正在尝试从pdf中提取图像。pdfbox能够从大多数PDF中提取图像,但它们是一些无法通过pdfbox提取图像的PDF。 为了提取图像,我使用以下代码:无法从PDFA1-a格式文档中提取图像 您可以从以下链接下载带有此问题的pdf示例:http://myslams.com/test/2.pdf 是他们的代码出错了,也许是我忘记处理了,还是他们的pdf一起出了问题?

  • 主要内容:从PDF文档生成图像在前一章中,我们已经看到了如何合并多个PDF文档。 在本章中,我们将了解如何从PDF文档的页面提取图像。 从PDF文档生成图像 PDFBox库提供了一个名称为的类,它将PDF文档呈现为AWT BufferedImage。 以下是从PDF文档生成图像的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可以使用类名称调用

  • 问题内容: 我正在尝试从PDF文件提取图像。我在网上找到了一个很好的例子: 那给了我所有的图像,但是图像顺序错误。我的下一个尝试如下所示: 尽管o.isStream()== true,但是我只得到/ Length和/ Filter,流只有大约100个字节长。完全找不到图像。 我的问题是,正确的方式是从PDF文件中获取所有图像的正确方法。 问题答案: 我在其他地方找到了答案,即iText邮件列表。

  • 再次向各位程序员问好。 我可以正确提取PDF文本坐标及其格式。但我不能用图像。我可以得到正确的宽度和高度,但它给了我错误的x和y。 我正在使用Photoshop检查我是否得到了正确的x,y,宽度,高度坐标,但只有宽度和高度是正确的 这是我的代码: 下面是我使用的PDF示例: http://persci.mit.edu/pub_pdfs/personal_photo_enhancement.pdf

  • 因此,在这个应用程序中,我们使用iText来填写PDF表单,并使用PDFBox将填写好的PDF加载到我们的系统中,并将其转换为图像。 问题是图像转换的时候。所有的信息都在那里,但是复选框...奇怪吗?复选框里面有一个奇怪的“空框”,而不是在PDF上设置的样式复选框“复选标记”。 它应该是怎样的: PDFBox版本2.0.11 iText版本为5.5.13 下面是进行转换的代码片段: 转换后,我也感

  • 我已经尝试将文档保存为PDF,看起来不错。保存图像时,图像可能包含不正确的文本。东欧文件尤其如此,如匈牙利、波兰、捷克等 PDF显示 有没有解决办法?我需要定义代码页吗?可用字体可能有问题吗?