我有大量文件,其中一些是扫描图像为 PDF,一些是完整/部分文本 PDF。
有没有办法检查这些文件,以确保我们只处理扫描图像的文件,而不是完整/部分文本 PDF 文件?
环境:Python 3.6
我一直在尝试编写一个简单的控制台应用程序或PowerShell脚本来从大量PDF文档中提取文本.有几个库和CLI工具可以实现这一点,但事实证明,没有一个能够可靠地识别文档结构.特别是我关注文本列的识别.即使非常昂贵的PDFLib TET工具也经常混淆两个相邻文本列的内容.
经常注意到PDF格式没有列的任何概念,甚至没有单词的概念.关于SO的类似问题的几个答案提到了这一点.这个问题非常严重,甚至可以保证学术研究.这篇期刊文章指出:
PDF文件中的所有数据对象都以面向视觉的方式表示,作为一系列操作符...通常不传达有关更高级别文本单元(如标记,行或列)的信息 - 有关这些单元之间边界的信息只能通过空格隐式提供
因此,我尝试过的所有提取工具(iTextSharp,PDFLib TET和Python PDFMiner)都无法识别文本列边界.在这些工具中,PDFLib TET表现最佳.
然而,SumatraPDF,非常轻量级的开源PDF阅读器,以及许多其他类似的可以完美识别列和文本区域.如果我在其中一个应用程序中打开文档,选择页面上的所有文本(甚至整个文档用CTRL + A)复制并粘贴到文本文件中,文本将以正确的顺序呈现几乎完美无缺.它偶尔会将页脚和标题文本混合到其中一列中.
所以我的问题是,这些应用程序如何做看似困难的事情(即使是像PDFLib这样昂贵的工具)?
编辑2014年3月31日:值得一提的是,我发现PDFBox在文本提取方面比iTextSharp好得多(尽管有一个定制的策略实现),PDFLib TET略胜PDFBox,但它相当昂贵.Python PDFMiner是没有希望的.我见过的最好的结果来自谷歌.可以将PDF(每次2GB)上传到Google云端硬盘,然后将其作为文本下载.这就是我在做的事情.我写了一个小工具,将我的PDF分成10个页面文件(Google只会转换前10页),然后在下载后将它们拼接回来.
编辑2014年4月7日.取消我的最后一次.最好的提取是通过MS Word实现的.这可以在Acrobat Pro中自动执行(工具>操作向导>创建新操作).可以使用.NET OpenXml库自动化Word到文本.这是一个非常巧妙地进行提取(docx到txt)的类.我的初始测试发现MS Word转换在文档结构方面要准确得多,但是一旦转换为纯文本就不那么重要了.
我有一个pdf包含表单字段的文件,需要将数据导出到AUTOMATICALLYxml文件中.这是我为测试创建的示例表单的屏幕:

注意:通过单击手动使用Acrobat Professional 手动导出它Tools > Form > Export Form Data,最后选择xml扩展名进行文件输出.这是我手动导出时得到的结果:
<?xml version="1.0" encoding="UTF-8"?>
<fields>
<first_name>John</first_name>
<last_name>Doe</last_name>
</fields>
Run Code Online (Sandbox Code Playgroud)
但是,我需要自动化它,例如使用python脚本,Java实现或一些命令行工具.我可以使用哪些库或工具将表单字段数据导出到xml?该工具或库应该是开源的,我可以将它集成到我的工作流程中.
我已经尝试过python pdfminer库,它帮助我导出pdf文件的静态部分(比如Static form header,First name:和Last name:):但是如何导出表单字段数据(在我的情况下是表单字段的内容first_name和last_name)?
编辑:随意下载sample.pdf文件在这里.
我正在尝试从 PDF 中提取印地语文本。我尝试了所有从 PDF 中提取的方法,但都没有奏效。有解释为什么它不起作用,但没有这样的答案。因此,我决定将PDF转换为图像,然后用于pytesseract提取文本。我已经下载了印地语训练的数据,但是这也提供了非常不准确的文本。
这是 PDF 中的实际印地语文本(下载链接):
到目前为止,这是我的代码:
import fitz
filepath = "D:\\BADI KA BANS-Ward No-002.pdf"
doc = fitz.open(filepath)
page = doc.loadPage(3) # number of page
pix = page.getPixmap()
output = "outfile.png"
pix.writePNG(output)
from PIL import Image
import pytesseract
# Include tesseract executable in your path
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# Create an image object of PIL library
image = Image.open('outfile.png')
# pass image into pytesseract module
# pytesseract is trained in many languages
image_to_text …Run Code Online (Sandbox Code Playgroud) 我正在尝试从PDF的特定部分提取文本.如果我知道该区域的X,Y坐标,我就能够提取文本.但我无法从PDF中获取所选区域的坐标.请帮助我如果有人尝试过这个.
我正在使用 Camelot 读取完整的 PDF 并从每个 PDF 中提取大约 112 个属性。
我使用表区域来提取属性
test_variable = camelot.read_pdf(filename, flavor='stream',
table_areas=['38, 340 ,50, 328'])
Run Code Online (Sandbox Code Playgroud)
问题是对于所有文档中的相同属性,表区域并不是恒定的。有时,我会在另一个文档的 x 或 y 坐标下方几个像素处找到相同的属性。
test_variable = camelot.read_pdf(filename, flavor='stream',
table_areas=['38,350,50,338'])
Run Code Online (Sandbox Code Playgroud)
有没有办法从同一区域获取确切的属性,而不管提取任何文档?
我正在尝试使用图像的 BBox 坐标提取 PDF 中的图像。
我尝试使用 pdfrw 库,它正在识别图像对象,并且它有一个名为媒体框的属性,其中有一些坐标,我不确定这些是否是正确的 bbox 坐标,因为对于某些 pdf,它显示类似这样的内容 ['0', ' 0', '684', '864'] 但图像不是从页面开头开始的,所以我不认为它是 bbox
我尝试使用 pdfrw 使用以下代码
import pdfrw, os
from pdfrw import PdfReader, PdfWriter
from pdfrw.findobjs import page_per_xobj
outfn = 'extract.' + os.path.basename(path)
pages = list(page_per_xobj(PdfReader(path).pages, margin=0.5*72))
writer = PdfWriter(outfn)
writer.addpages(pages)
writer.write()
Run Code Online (Sandbox Code Playgroud)
如何获取图像及其 bbox 坐标?
示例 pdf :https://drive.google.com/open? id=1IVbj1b3JfmSv_BJvGUqYvAPVl3FwC2A-
我想在pdf中提取表格的内容,如下所示:

我用iText java PDF libray编写了这个java程序,它可以逐行读取PDF文件的内容,但我不知道如何获取表的内容
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
public class PDFReader {
public static void main(String[] args) {
// TODO, add your application code
System.out.println("Lecteur PDF");
System.out.println (ReadPDF("D:/test.pdf"));
}
private static String ReadPDF(String pdf_url)
{
StringBuilder str=new StringBuilder();
try
{
PdfReader reader = new PdfReader(pdf_url);
int n = reader.getNumberOfPages();
for(int i=1;i<n;i++)
{
String str2=PdfTextExtractor.getTextFromPage(reader, i);
str.append(str2);
System.out.println(str);
}
}catch(Exception err)
{
err.printStackTrace();
}
return String.format("%s", str);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:

但这不是我想要的,我想逐行和逐列提取表的内容,例如,保存java数组中的每一行
第一个数组将包含:"N°","DATE OBSERVATIONS","TEXTE"
第二个阵列将包含:"029/14","Le 1er sept …
我正在尝试使用 PyPDF2 从扫描的 pdf 中提取文本。一些 pdf 包含垂直对齐的文本。但是页面的方向是纵向。有什么方法可以使用pdfminer或PyPDF2识别文本是否垂直对齐并读取PDF中的垂直线
pdf-extraction ×10
python ×5
pdf ×4
itext ×2
java ×2
pdfminer ×2
pypdf2 ×2
python-2.7 ×2
python-3.x ×2
acrobat ×1
document ×1
pdf.js ×1
pdfrw ×1
pypdf ×1
xml ×1