小编Ols*_*son的帖子

如何从Python中填写的表单中提取PDF字段?

我正在尝试使用Python来处理一些使用Adobe Acrobat Reader填写和签名的PDF表单.

我试过了:

  • pdfminer演示:它没有任何倾倒在填写数据.
  • pyPdf:当我尝试使用PdfFileReader(f)加载文件时,它将核心最大化了2分钟,我就放弃并杀死了它.
  • Jython和PDFBox:工作得很好但启动时间过长,如果这是我唯一的选择,我只需要用直接的Java编写一个外部工具.

我可以继续寻找图书馆并尝试它们,但我希望有人已经有了这个有效的解决方案.


更新:根据史蒂文的回答,我调查了pdfminer,它很好地完成了这个工作.

from argparse import ArgumentParser
import pickle
import pprint
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdftypes import resolve1, PDFObjRef

def load_form(filename):
    """Load pdf form contents into a nested list of name/value tuples"""
    with open(filename, 'rb') as file:
        parser = PDFParser(file)
        doc = PDFDocument()
        parser.set_document(doc)
        doc.set_parser(parser)
        doc.initialize()
        return [load_fields(resolve1(f)) for f in
                   resolve1(doc.catalog['AcroForm'])['Fields']]

def load_fields(field):
    """Recursively load form fields"""
    form = field.get('Kids', None)
    if form: …
Run Code Online (Sandbox Code Playgroud)

python forms pdf

38
推荐指数
3
解决办法
3万
查看次数

我可以在Pool.imap调用的函数中使用多处理队列吗?

我正在使用python 2.7,并尝试在自己的进程中运行一些CPU繁重的任务.我希望能够将消息发送回父进程,以使其了解进程的当前状态.多处理队列似乎是完美的,但我无法弄清楚如何让它工作.

所以,这是我的基本工作示例,减去队列的使用.

import multiprocessing as mp
import time

def f(x):
    return x*x

def main():
    pool = mp.Pool()
    results = pool.imap_unordered(f, range(1, 6))
    time.sleep(1)

    print str(results.next())

    pool.close()
    pool.join()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我尝试过以几种方式传递Queue,并且它们收到错误消息"RuntimeError:Queue对象应该只通过继承在进程之间共享".这是我根据我发现的早期答案尝试的方法之一.(我在尝试使用Pool.map_async和Pool.imap时遇到同样的问题)

import multiprocessing as mp
import time

def f(args):
    x = args[0]
    q = args[1]
    q.put(str(x))
    time.sleep(0.1)
    return x*x

def main():
    q = mp.Queue()
    pool = mp.Pool()
    results = pool.imap_unordered(f, ([i, q] for i in range(1, 6)))

    print str(q.get())

    pool.close()
    pool.join()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

最后,0适应方法(使其成为全局)不会生成任何消息,它只是锁定. …

python queue pool multiprocessing

25
推荐指数
1
解决办法
1万
查看次数

两个进程如何在Windows 7中侦听同一端口?

我在Windows 7中运行两个stunnel实例,配置为侦听同一个端口,看起来它们都在同一端口上成功侦听(只使用socket()/ bind()/ listen()).两个实例似乎都成功通过所有调用,并且它们显示在netstat中:

C:\>netstat -ano | grep 8000
  TCP    0.0.0.0:8000           0.0.0.0:0              LISTENING       5828
  TCP    0.0.0.0:8000           0.0.0.0:0              LISTENING       5852
Run Code Online (Sandbox Code Playgroud)

第一个要监听的是获取所有传入的请求.

这与我的所有期望完全相反.(我当时希望让EADDRINUSE告诉我港口很忙.)所以....

  1. 为什么/如何运作?这种行为在某些情况下有用吗?
  2. 如果另一个应用程序要捕获传入的请求,我不希望实例成功运行...如何使端口独占?

sockets windows-7

8
推荐指数
1
解决办法
5042
查看次数

如何在Python(2.7)中消除衍生进程中的Windows控制台?

可能重复:
在没有控制台的情况下使用Popen在pythonw中运行进程

我在Windows上使用python 2.7来使用dcraw和PIL自动执行批量RAW转换.

问题是我每次运行dcraw时都会打开一个Windows控制台(每隔几秒就会发生一次).如果我使用.py运行脚本它不那么烦人,因为它只打开主窗口,但我更愿意只呈现GUI.

我是这样介入的:

args = [this.dcraw] + shlex.split(DCRAW_OPTS) + [rawfile]
proc = subprocess.Popen(args, -1, stdout=subprocess.PIPE)
ppm_data, err = proc.communicate()
image = Image.open(StringIO.StringIO(ppm_data))
Run Code Online (Sandbox Code Playgroud)

感谢Ricardo Reyes

次要修订到配方,在2.7看来,你需要得到STARTF_USESHOWWINDOW来自_subprocess(您也可以使用pywin32,如果你想要的东西,可能有点不太容易发生变化),所以为后人:

suinfo = subprocess.STARTUPINFO()
suinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(args, -1, stdout=subprocess.PIPE, startupinfo=suinfo)
Run Code Online (Sandbox Code Playgroud)

python windows subprocess popen

6
推荐指数
1
解决办法
2357
查看次数

标签 统计

python ×3

forms ×1

multiprocessing ×1

pdf ×1

pool ×1

popen ×1

queue ×1

sockets ×1

subprocess ×1

windows ×1

windows-7 ×1