从文件名读取单页 .tif 文件作为多页.tiff

id3*_*678 3 python filenames tesseract tiff python-tesseract

更新:我发现从 OCRed 文件创建 pdf 文件是不合理的

所以最好保持原样,不进行转换。我仍然遇到一些图像已连接而其他图像是 1 个寻呼机的问题。

data = []
listOfPages = glob.glob(r"C:/Users/name/test/*.tif")
for entry in listOfPages:
    text = pytesseract.image_to_string(
            Image.open(entry), lang="en"
        )
    data.append(text)
df0 = pd.DataFrame(data, columns =['raw_text'])
Run Code Online (Sandbox Code Playgroud)

这将创建一个 pandas df,其中每一行都是文件第一(单)页的字符串.tif。我如何连接 tif 文件(参见原始问题)以获得完整的多页字符串?

原始问题:我想将单页 .tif 文件转换my_folder为. 没有后续页面的 TIFF 也应转换为单页 PDF。最终,我想要一个通过 OCR 处理多个基于图像的 TIFF 文件创建的文本 PDF。.pdfpdf_folder

.tiff因此,我从文件名模式推断应该放在一起的文件组:

Drs_1_00109_1_ADS.tif
Drs_1_00099_1_ADS_000.tif
Drs_1_00099_1_ADS_001.tif
Drs_1_00099_1_ADS_002.tif
Drs_1_00186_1_ADS.tif
Drs_1_00192_1_ADS_000.tif
Drs_1_00192_1_ADS_001.tif
Run Code Online (Sandbox Code Playgroud)

例如,我想将Drs_1_00192_1_ADS_000.tifDrs_1_00192_1_ADS_001.tif(这是两张[单页]图片)转换为Drs_1_00192_1_ADS.pdf包含这两张图片文本数据的 2 页。该代码适用于单页 pdf 创建。我怎样才能使这个工作适用于文件名中的所述多页模式?

谢谢!

Mar*_*ell 5

我会通过遍历所有以 结尾的文件来实现这一点000.tif,这可能是多页文档的起点,然后附加通过增加后缀直到文件丢失而产生的文件。

#!/usr/bin/env python3

import os
from PIL import Image
from glob import glob

# Iterate over all files ending in '000.tif' and find their friends (subsequent pages)
for filename in glob('*_000.tif'):
   # Work out stem of filename
   stem = filename.replace('_000.tif', '')
   print(f'DEBUG: stem={stem}')

   # Build list of images to be put in this PDF
   images = [Image.open(filename)]
   index = 1
   while True:
      this = f'{stem}_{index:03d}.tif'
      print(f'DEBUG: this={this}')
      if os.path.isfile(this):
         images.append(Image.open(this))
         index += 1
      else:
         break
   output = stem + '.pdf'
   print(f'DEBUG: Saving {len(images)} pages to {output}')
   images[0].save(output, save_all=True, append_images=images[1:])
Run Code Online (Sandbox Code Playgroud)

样本输出

DEBUG: stem=Drs_1_00192_1_ADS
DEBUG: this=Drs_1_00192_1_ADS_001.tif
DEBUG: this=Drs_1_00192_1_ADS_002.tif
DEBUG: this=Drs_1_00192_1_ADS_003.tif
DEBUG: this=Drs_1_00192_1_ADS_004.tif
DEBUG: Saving 4 pages to Drs_1_00192_1_ADS.pdf
DEBUG: stem=Drs_1_00099_1_ADS
DEBUG: this=Drs_1_00099_1_ADS_001.tif
DEBUG: this=Drs_1_00099_1_ADS_002.tif
DEBUG: this=Drs_1_00099_1_ADS_003.tif
DEBUG: Saving 3 pages to Drs_1_00099_1_ADS.pdf
Run Code Online (Sandbox Code Playgroud)

请注意,您可以轻松地使用OpenCV来读取文件,只需替换:

image = Image.open(filename)
Run Code Online (Sandbox Code Playgroud)

image = cv2.imread(filename)
Run Code Online (Sandbox Code Playgroud)

然而,你不能像使用PIL那样简单地使用OpenCV编写 PDF ,所以我只是坚持使用PIL。如果您还记得PIL使用 RGB 排序而OpenCV使用 BGR,您可以轻松地在PILOpenCV之间移动,因此您可以使用以下命令从PIL转到OpenCV

OpenCVImage = np.array(PILImage)[...,::-1]
Run Code Online (Sandbox Code Playgroud)

PILImage = Image.fromarray(OpenCVImage[...,::-1])
Run Code Online (Sandbox Code Playgroud)