Python pdf2image: скрыть консоли - PullRequest
       12

Python pdf2image: скрыть консоли

0 голосов
/ 25 августа 2018

Я использую pdf2image, который использует poppler для преобразования PDF в изображения.Однако, когда вы используете его в Python, он каждый раз открывает новую консоль для преобразования PDF.Есть ли способ скрыть эту консоль?

for file_name in os.listdir(path):
  if file_name.endswith('.pdf'):
    pages = convert_from_path(path + file_name, thread_count=4)
    idx = 1
    for page in pages:
      page.save(file_name + '-page-' + str(idx) + '.jpg', 'JPEG')
      idx += 1

1 Ответ

0 голосов
/ 25 августа 2018

Да, но вам это может не понравиться.Вы должны немного изменить функцию convert_from_path.В настоящее время функция выглядит следующим образом:

import os
import re
import tempfile
import uuid

from io import BytesIO
from subprocess import Popen, PIPE
from PIL import Image

def convert_from_path(pdf_path, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', thread_count=1, userpw=None):   
    page_count = __page_count(pdf_path, userpw)

    if thread_count < 1:
        thread_count = 1

    if first_page is None:
        first_page = 1

    if last_page is None or last_page > page_count:
        last_page = page_count

    # Recalculate page count based on first and last page
    page_count = last_page - first_page + 1

    if thread_count > page_count:
        thread_count = page_count

    reminder = page_count % thread_count
    current_page = first_page
    processes = []
    for _ in range(thread_count):
        # A unique identifier for our files if the directory is not empty
        uid = str(uuid.uuid4())
        # Get the number of pages the thread will be processing
        thread_page_count = page_count // thread_count + int(reminder > 0)
        # Build the command accordingly
        args, parse_buffer_func = __build_command(['pdftoppm', '-r', str(dpi), pdf_path], output_folder, current_page, current_page + thread_page_count - 1, fmt, uid, userpw)
        # Update page values
        current_page = current_page + thread_page_count
        reminder -= int(reminder > 0)
        # Spawn the process and save its uuid
        processes.append((uid, Popen(args, stdout=PIPE, stderr=PIPE)))

    images = []
    for uid, proc in processes:
        data, _ = proc.communicate()

        if output_folder is not None:
            images += __load_from_output_folder(output_folder, uid)
        else:
            images += parse_buffer_func(data)

    return images

Интересующая нас строка:

processes.append((uid, Popen(args, stdout=PIPE, stderr=PIPE)))

Нам нужно явно указать Попену не показывать окна консоли следующим образом:

startupinfo=None
if platform_name == 'Windows':
  # this startupinfo structure prevents a console window from popping up on Windows
  startupinfo = subprocess.STARTUPINFO()
  startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
processes.append((uid, Popen(args, stdout=PIPE, stderr=PIPE, startupinfo=startupinfo)))

Некоторые версии python 2.7 могут потребоваться:

 startupinfo=None
    if platform_name == 'Windows':
      # this startupinfo structure prevents a console window from popping up on Windows
      startupinfo = subprocess.STARTUPINFO()
      startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
    processes.append((uid, Popen(args, stdout=PIPE, stderr=PIPE, startupinfo=startupinfo)))
...