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

将PDF转换为图像(具有适当的格式)

澹台蕴藉
2023-03-14

我有一个pdf文件(附件)。我的目标是使用pdfbox将pdf转换为图像(与在windows中使用剪切工具相同)。pdf有各种形状和文本。

我使用的代码如下:

PDDocument doc = PDDocument.load("Hello World.pdf");
PDPage firstPage = (PDPage) doc.getDocumentCatalog().getAllPages().get(67);
BufferedImage bufferedImage = firstPage.convertToImage(imageType,screenResolution);
ImageIO.write(bufferedImage, "png",new File("out.png"));

我如何让pdfbox采取像直接快照图像的东西?

另外,我注意到png的图像质量不太好,有没有办法提高生成图像的分辨率?

编辑:这是pdf(见第68页)https://drive.google.com/file/d/0B0ZiP71EQHz2NVZUcElvbFNreEU/edit?usp=sharing

编辑2:似乎所有的文字都消失了。我还尝试使用PDFImageWriter类

test.writeImage(doc, "png", null, 68, 69, "final.png",TYPE_USHORT_GRAY,200 );

同样的结果

共有3个答案

巩衡
2023-03-14

事实证明,jpedal(lgpl)可以完美地进行转换(就像快照一样)。

以下是我使用的:

PdfDecoder decode_pdf = new PdfDecoder(true);


FontMappings.setFontReplacements();

    decode_pdf.openPdfFile("Hello World.pdf"); 


 decode_pdf.setExtractionMode(0,800,3);

 try {

     for(int i=0;i<40;i++)
     {  
         BufferedImage img=decode_pdf.getPageAsImage(2+i);

    ImageIO.write(img, "png",new File(String.valueOf(i)+"out.png"));
     }
} catch (IOException ex) {
    Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}

    decode_pdf.closePdfFile();

} catch (PdfException e) {
    e.printStackTrace();
}

它很好用。

艾晋
2023-03-14

我使用PDFBox 1.8.4版获得了与OP相同的结果。不过,在2.0.0-SNAPSHOT版本中,它看起来更好:

这里只有一些箭头更薄,一些箭头部分被误画成盒子。

因此

我如何让pdfbox采取像直接快照图像的东西?

当前版本(高达1.8.4)在将PDF渲染为图像时似乎有更大的缺陷。您可以切换到当前开发版本(例如当前主干,2.0.0-SNAPSHOT)或等待改进发布。

此外,一些小的赤字甚至在2.0.0-1%之间。您可能希望向PDFBox人员展示您的示例文档(即在他们的JIRA中创建相应的问题),以便他们进一步改进PDFBox以满足您的需求。

另外,我注意到png的图像质量不太好,有没有办法提高生成图像的分辨率?

convertToImage重载和分辨率参数。您当前的代码实际上将分辨率设置为screensolution。增加此分辨率值。

PS:将PDF页面呈现为图像的代码已在2.0.0-SNAPSHOT中重构。而不是

BufferedImage image =  page.convertToImage();

你现在有了

BufferedImage image =  RenderUtil.convertToImage(page);

我认为这样做是为了从核心类中删除直接的AWT引用,因为AWT在Android上不可用。

PS:我去年在这个答案中使用的快照只是一个随时可能发生变化的快照。2.0.0版本仍在开发中,很多事情都发生了变化。尤其是不再有RenderUtil类了。相反,目前必须使用组织中的PDFRenderer。阿帕奇。pdfbox。正在渲染包。。。

司寇安宜
2023-03-14

使用PDFRenderer可以将PDF页面转换为图像格式。

使用PDF渲染器在java中将PDF页面转换为图像。JAR需要PDFRENDERR-0.9.0

package com.pdfrenderer.examples;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.imageio.ImageIO;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

public class PdfToImage {
    public static void main(String[] args) {
        try {
            String sourceDir = "C:/Documents/Chemistry.pdf";// PDF file must be placed in DataGet folder
            String destinationDir = "C:/Documents/Converted/";//Converted PDF page saved in this folder

        File sourceFile = new File(sourceDir);
        File destinationFile = new File(destinationDir);

        String fileName = sourceFile.getName().replace(".pdf", "_cover");

        if (sourceFile.exists()) {
            if (!destinationFile.exists()) {
                destinationFile.mkdir();
                System.out.println("Folder created in: "+ destinationFile.getCanonicalPath());
            }

            RandomAccessFile raf = new RandomAccessFile(sourceFile, "r");
            FileChannel channel = raf.getChannel();
            ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            PDFFile pdf = new PDFFile(buf);
            int pageNumber = 62;// which PDF page to be convert
            PDFPage page = pdf.getPage(pageNumber);

            System.out.println("Total pages:"+ pdf.getNumPages());

            // create the image
            Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
            BufferedImage bufferedImage = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);

            // width & height, // clip rect, // null for the ImageObserver, // fill background with white, // block until drawing is done
            Image image = page.getImage(rect.width, rect.height, rect, null, true, true );
            Graphics2D bufImageGraphics = bufferedImage.createGraphics();
            bufImageGraphics.drawImage(image, 0, 0, null);

            File imageFile = new File( destinationDir + fileName +"_"+ pageNumber +".png" );// change file format here. Ex: .png, .jpg, .jpeg, .gif, .bmp

            ImageIO.write(bufferedImage, "png", imageFile);

            System.out.println(imageFile.getName() +" File created in: "+ destinationFile.getCanonicalPath());
        } else {
            System.err.println(sourceFile.getName() +" File not exists");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

ConvertedImage:

 类似资料:
  • 问题内容: 我想将PDF文档转换为图像。我正在使用Ghost4j。 问题: Ghost4J需要gsdll32.dll文件在运行时,我也 并不 想使用的DLL文件。 问题1: 在ghost4j中,有没有办法在没有dll的情况下转换图像? 问题2: 我在PDFBox API中找到了解决方案。convertToImage()将PDF页面转换为图像格式。 PDF文档上只有文本。运行此代码时出现该异常: 问

  • 问题内容: 因此,我所处的状态是以PDF格式发布了一堆数据,但更糟糕的是,大多数(全部?)PDF似乎都是在Office中键入的字母,打印/传真然后进行扫描(我们的政府最好吗?)。起初我以为自己疯了,但后来我开始看到大量“倾斜”的pdf文件,就像有人没有正确将它们放在扫描仪上一样。因此,我想从中获得实际文本的下一个最佳方法就是将每一页变成一张图像。 显然,这需要自动化,如果可能的话,我宁愿使用Pyt

  • 我想把PDF文档转换成图像。我用的是Ghost4j。 问题:Ghost4J需要gsdll32。dll文件,我不想使用dll文件。 问题1:是否有任何方法,在ghost4j转换图像没有dll? 问题2:我在PDFBox API中找到了解决方案<代码>组织。阿帕奇。pdfbox。pdmodel。PDPagep具有将PDF页面转换为图像格式的方法convertToImage()。 我只有PDF文档上的文

  • 问题内容: 我读这篇文章了解如何将PDF转换为CMYK,但是当我试图接受的解决方案 如果我的原始pdf文件不包含图片,则不会获得具有CMYK颜色空间的pdf文件。如果在其中添加图片,我将得到正确的结果(已选中)。 例如,如果我用一个矩形创建一个svg,将其导出为pdf,然后使用ghostscript命令,则它在sRBG颜色空间中仍会得到一个pdf。但是,如果我在svg中添加图片,则效果很好。 解决

  • 问题内容: 我从API收到了以下格式的JSON 我看到它的格式对于标准RESTAdapter无效,我需要将模型名称放在第一位。在我的示例中,它可能应该类似于: 那么如何使它在我的适配器中看起来像这样?似乎我应该使用 ,但是我不知道应该重写哪种方法… 问题答案: 我今天早些时候遇到了这个问题。解决该问题的一种好方法是为ApplicationSerializer定义normalizePayload方法

  • 问题内容: 我有一个程序,需要使用Image Magick将PDF转换为图像。我使用包来做到这一点: 我得到的错误是: 其中最重要的是: 我认为这是因为ImageMagick无权访问PDF。现在应该怎么办?我在Linux服务器上。任何帮助表示赞赏。 问题答案: emcconville是正确的。更具体地说,编辑Imagemagick policy.xml文件以取消注释此行: 并将其从rights =