Python-Tika 返回 "None" PDF 内容,但适用于 TIFF
Python-Tika returning "None" content for PDF's, but works with TIFF's
我有一个 PDF,我正试图让 Tika 解析它。 PDF 不是 OCR。 Tesseract 安装在我的机器上。
我使用 ImageMagik 将 file.tiff 转换为 file.pdf,因此我正在解析的 tiff 文件是从 PDF 直接转换而来的。
Tika 解析 TIFF 没有问题,但解析 PDF 的 returns "None" 内容。是什么赋予了?我正在使用 Tika 1.14.1、tesseract 3.03、leptonica-1.70
这是代码...
from tika import parser
# This works
print(parser.from_file('/from/file.tiff', 'http://localhost:9998/tika'))
# This returns "None" for content
print(parser.from_file('/from/file.pdf', 'http://localhost:9998/tika'))
因此,在 Chris Mattman 的一些反馈(他很棒,而且很有帮助!)之后,我解决了这个问题。
他的回复:
Since Tika Python acts as a thin client to the REST server, you just
need to make sure the REST server is started with a classpath
configuration that sets the right flags for TesseractOCR, see here:
虽然我之前读过这篇文章,但直到后来进一步阅读时我才明白这个问题。 TesseractOCR 本身不支持 PDF 的 OCR 转换 - 因此,Tika 也不支持,因为 Tika 依赖于 Tesseract 对 PDF 转换的支持(而且 tika-python 也不支持)
我的解决方案:
我结合了 subprocess、ImageMagick (CLI) 和 Tika 在 python 首先将 PDF 转换为 TIFF,然后允许 Tika/Tesseract 对文件执行 OCR 转换。
备注:
- 这个过程对于大型 PDF 来说非常慢
- 需要:tika-python、tesseract、imagemagick
代码:
from tika import parser
import subprocess
import os
def ConvertPDFToOCR(file):
meta = parser.from_file(fil, 'http://localhost:9998/tika')
# Check if parsed content is NoneType and handle accordingly.
if "content" in meta and meta['content'] is None:
# Run ImageMagick via subprocess (command line)
params = ['convert', '-density', '300', u, '-depth', '8', '-strip', '-background', 'white', '-alpha', 'off', 'temp.tiff']
subprocess.check_call(params)
# Run Tika again on new temp.tiff file
meta = parser.from_file('temp.tiff', 'http://localhost:9998/tika')
# Delete the temporary file
os.remove('temp.tiff')
return meta['content']
您可以启用 X-Tika-PDFextractInlineImages': 'true' 并直接从 pdf 中的图像中提取文本。无需转换。花了一段时间才弄明白,但效果很好。
from tika import parser
headers = {
'X-Tika-PDFextractInlineImages': 'true',
}
parsed = parser.from_file("Citi.pdf",serverEndpoint='http://localhost:9998/rmeta/text',headers=headers)
print(parsed['content'])
我有一个 PDF,我正试图让 Tika 解析它。 PDF 不是 OCR。 Tesseract 安装在我的机器上。
我使用 ImageMagik 将 file.tiff 转换为 file.pdf,因此我正在解析的 tiff 文件是从 PDF 直接转换而来的。
Tika 解析 TIFF 没有问题,但解析 PDF 的 returns "None" 内容。是什么赋予了?我正在使用 Tika 1.14.1、tesseract 3.03、leptonica-1.70
这是代码...
from tika import parser
# This works
print(parser.from_file('/from/file.tiff', 'http://localhost:9998/tika'))
# This returns "None" for content
print(parser.from_file('/from/file.pdf', 'http://localhost:9998/tika'))
因此,在 Chris Mattman 的一些反馈(他很棒,而且很有帮助!)之后,我解决了这个问题。
他的回复:
Since Tika Python acts as a thin client to the REST server, you just need to make sure the REST server is started with a classpath configuration that sets the right flags for TesseractOCR, see here:
虽然我之前读过这篇文章,但直到后来进一步阅读时我才明白这个问题。 TesseractOCR 本身不支持 PDF 的 OCR 转换 - 因此,Tika 也不支持,因为 Tika 依赖于 Tesseract 对 PDF 转换的支持(而且 tika-python 也不支持)
我的解决方案:
我结合了 subprocess、ImageMagick (CLI) 和 Tika 在 python 首先将 PDF 转换为 TIFF,然后允许 Tika/Tesseract 对文件执行 OCR 转换。
备注:
- 这个过程对于大型 PDF 来说非常慢
- 需要:tika-python、tesseract、imagemagick
代码:
from tika import parser
import subprocess
import os
def ConvertPDFToOCR(file):
meta = parser.from_file(fil, 'http://localhost:9998/tika')
# Check if parsed content is NoneType and handle accordingly.
if "content" in meta and meta['content'] is None:
# Run ImageMagick via subprocess (command line)
params = ['convert', '-density', '300', u, '-depth', '8', '-strip', '-background', 'white', '-alpha', 'off', 'temp.tiff']
subprocess.check_call(params)
# Run Tika again on new temp.tiff file
meta = parser.from_file('temp.tiff', 'http://localhost:9998/tika')
# Delete the temporary file
os.remove('temp.tiff')
return meta['content']
您可以启用 X-Tika-PDFextractInlineImages': 'true' 并直接从 pdf 中的图像中提取文本。无需转换。花了一段时间才弄明白,但效果很好。
from tika import parser
headers = {
'X-Tika-PDFextractInlineImages': 'true',
}
parsed = parser.from_file("Citi.pdf",serverEndpoint='http://localhost:9998/rmeta/text',headers=headers)
print(parsed['content'])