当我尝试读取PDF时,PDFBox读取空字符串

时间:2018-08-09 03:56:15

标签: c# .net parsing pdf pdfbox

我正在尝试使用pdf框从文件中读取文本,以便在文件系统中对其进行排序。我正在使用C#。我可以从互联网上阅读示例pdf,但是由于某些原因,我尝试从中读取的pdf仅返回一个字符串,其中没有真实字符。这是我正在使用的代码:

using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PDFBoxTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = @"C:\Users\Development\Desktop\purchaseOrder.pdf";

            PDDocument doc = null;
            try
            {
                doc = PDDocument.load(fileName);
                PDFTextStripper stripper = new PDFTextStripper();
                Console.WriteLine(stripper.getText(doc));   
            }
            finally

            {
                if (doc != null)
                {
                    doc.close();
                }
            }

            Console.ReadLine();
       }
   }
}       

这是pdf的链接,对我不起作用。保存一个,另一个使用“字母”设置打印。

提前谢谢! https://drive.google.com/drive/folders/1iSadM0ikdrhHsvemNVdyEl3BeTIhm39U?usp=sharing

1 个答案:

答案 0 :(得分:2)

您的PDF不包含任何文本。

是的,当您在查看器中打开PDF时,您看到文本。但是,此文本不是使用PDF中的文本绘制指令生成的,而是使用路径绘制指令生成的,即您看到的每个字母都是使用一组曲线和定义相应字母轮廓的线条,然后用颜色填充。

因此,您的PDF不包含任何文本,而是包含许多任意的小填充路径。

另一方面,

文本提取是通过分析文本绘图指令来工作的,作为参数具有相关编码文本。因此,文本提取将在您的PDF中找不到任何文本。

实际上,PDF中使用的技术通常用于防止他人提取其PDF的文本内容,无论是使用PDFTextStripper之类的文本提取类,还是使用从PDF查看器,或为视障用户使用屏幕阅读器等辅助技术。

因此,对于此类PDF,您必须求助于通用OCR(即,将PDF渲染为位图图像并将标准OCR应用程序应用于图像)或专用OCR(即,一些采用路径定义并尝试使用自定义程序的程序)识别路径定义中的字符。

我不知道后一种程序,我只是认为如果必须处理许多此类PDF,这可能是一种明智的方法。