Java使用PDFBox将PDF文件转换为图像时,文本丢失。

5
我希望将PDF页面转换为图像文件。使用Java进行转换时,转换后的图像文件中缺少文本。
我想要转换的文件是 46_2.pdf,转换后显示如下:46_2.png 代码:
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;

public class ConvertPDFPageToImageWithoutText {
    public static void main(String[] args) {
        try {
            String oldPath = "C:/PDFCopy/46_2.pdf";
            File oldFile = new File(oldPath);
           if (oldFile.exists()) {

            PDDocument document = PDDocument.load(oldPath);
            List<PDPage> list = document.getDocumentCatalog().getAllPages();

            for (PDPage page : list) {
                BufferedImage image = page.convertToImage();
                File outputfile = new File("C:/PDFCopy/image.png");
                ImageIO.write(image, "png", outputfile);
                document.close();
            }

        }

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

我建议尝试使用 convertToImage(type, resolution) 方法,看看你得到什么。我打赌你需要尝试几次才能找到正确的分辨率。http://pdfbox.apache.org/docs/1.8.3/javadocs/org/apache/pdfbox/pdmodel/PDPage.html#convertToImage(int, int) - Robert Beltran
1.8.x版本在字体渲染方面存在缺陷。这些问题已经在未发布的2.0版本中得到解决,您可以通过svn从存储库获取该版本,并使用maven进行构建。 - Tilman Hausherr
@TilmanHausherr,你能给我提供一个JAR下载链接吗? - UdayKiran Pulipati
请注意API不同(特别是渲染),因此请查看示例以了解如何操作。下载链接:https://pdfbox.apache.org/downloads.html#scm - Tilman Hausherr
3个回答

2

1
啊,太糟糕了。根据此链接的说法,似乎某些字体存在已知问题。 - chairbender
PDFImageWriter.writeToImage 给我相同的输出。 - UdayKiran Pulipati
我明白。我告诉你,PDFBox 显然存在一些字体问题,所以在开发人员修复pdfbox之前,我认为你将无法成功地保留那段文字。 - chairbender
1
PDFImageWriter.writeImage() 内部使用 PDPage.convertToImage(),并将结果 BufferedImage 直接保存到文件系统中。 - Nikita Bosik

1

我曾经遇到同样的问题。我找到了一篇文章(不幸的是,我已经读了数百篇文章,无法记住出处)。作者抱怨在将Java版本更新到7.21后,PDFBox出现了这样的问题。因此,我使用了7.17版本,并且它对我有效:)


0

使用最新版本的PDFBox(我正在使用2.0.9),并从这里添加JAI Image I/O依赖项。 这是在JAVA 7上运行的示例代码。

    public void pdfToImageConvertorUsingPdfBox(String inputPdfPath) throws Exception {
    File sourceFile = new File(inputPdfPath);
    String formatName = "png";
    if (sourceFile.exists()) {
        PDDocument document = PDDocument.load(sourceFile);
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        int count = document.getNumberOfPages();

        for (int i = 0; i < count; i++) {
            BufferedImage image = pdfRenderer.renderImageWithDPI(i, 200, ImageType.RGB);
            String output = FilenameUtils.removeExtension(inputPdfPath) + "_" + (i + 1) + "." + formatName;
            ImageIO.write(image, formatName, new File(output));
        }
        document.close();
    } else {
        logger.error(sourceFile.getName() + " File not exists");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接