使用 Pyqt4 从 URL 下载数千个 PDF

2024-05-12

理想情况下,我试图从给定网站下载数千个 PDF。然而,由于某种原因,它甚至无法下载 100 个 PDF。我不知道为什么。这是代码:

#!/usr/bin/env python
import time
from pyPdf import PdfFileWriter, PdfFileReader
import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from xhtml2pdf import pisa
import sys 
from PyQt4.QtCore import *
from PyQt4.QtGui import*
from PyQt4.QtWebKit import *

class Foo(QWidget):
    def __init__(self, parent=None):
        super(Foo, self).__init__(parent)    

        self.count  = -1
        text_file = open("input.txt", "r")
        self.params = text_file.read().split('\n')
        self.url    = 'http://www.asdfasdfasdf.com/Property.aspx?mode=details&pin={0}'

        self.gridLayout = QGridLayout(self)
        #self.tabWidget = QTabWidget(self)
        #self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)

        self.mapper = QSignalMapper(self)
        self.mapper.mapped.connect(self.on_mapper_mapped)

        for i in range(100):
            grabber = QWebView()
            grabber.loadFinished.connect(self.mapper.map)

            self.mapper.setMapping(grabber, i)
            #self.tabWidget.addTab(grabber, "opener {0}".format(str(i)))

            grabber.loadFinished.emit(True)

    @pyqtSlot(int)
    def on_mapper_mapped(self, gNumber):
        self.count += 1
        if self.count < len(self.params):
            #gParam = self.params[self.count]
            gParam = self.params[self.count]

            opener = self.mapper.mapping(gNumber)
            opener.load(QUrl(self.url.format(gParam)))
            printer = QPrinter()
            #setting format
            printer.setPageSize(QPrinter.A4)
            printer.setOutputFormat(QPrinter.PdfFormat)
            #export file as c:\tem_pdf.pdf
            PIDString = gParam[:2] + '-' + gParam[2:4] + '-' + gParam[4:7] + '-' + gParam[7:10] + '-' + gParam[10:14]
            printer.setOutputFileName(PIDString + '.pdf')
            def convertIt():
                opener.print_(printer)

            QObject.connect(opener, SIGNAL("loadFinished(bool)"), convertIt)
            print str(self.count) + ' of ' + str(len(self.params))



if __name__ == "__main__":
    import  sys

    app = QApplication(sys.argv)
    main = Foo()
    #main.show()
    app.exec_()
    sys.exit

理想情况下,我也想添加页脚,但如果我尝试这样做,它就会出错。 Input.txt 有 100 个数字(仅用于测试,我需要它在 85000 上工作)。它适用于真正的小数字,例如 5 或 10,但不适用于 100。 QwebView 实例有限制吗?我应该管理它才能使其发挥作用吗?

当我为 100 个 PDF 运行此代码时,它将打印出 20 个 PDF。如果我将范围更改为小于 100,则会有重复的 PDF,但肯定会超过 20。

另外,我收到此错误:

qpainter::begin:返回 false


我认为既然您正在尝试制作“PyQt 应用程序”,您应该首先利用它提供的功能。

尝试看看Q网络访问管理器 http://doc.qt.io/qt-5/qnetworkaccessmanager.html控制您的所有请求和其他一切,Q网络请求 http://doc.qt.io/qt-5/qnetworkrequest.html, Q网络回复 http://doc.qt.io/qt-5/qnetworkreply.html.

它甚至会照顾您的线程并根据需要实现并行性。下载时不会冻结您的应用程序。

稍微看一下我的这段代码。它并不能完全满足您的要求,但对于您需要进行的所有设置来说,这是一个非常好的过滤示例。

# Subclass QNetworkAccessManager Here
from PyQt5.QtCore import QByteArray
from PyQt5.QtCore import QFile, pyqtSlot
from PyQt5.QtCore import QIODevice
from PyQt5.QtCore import QUrl
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtNetwork import QNetworkAccessManager
from PyQt5.QtNetwork import QNetworkRequest


class NetworkAccessManager(QNetworkAccessManager):

    signal_add_image = pyqtSignal()
    dialog = None
    download_finished = False
    message_buffer = None
    reply = None

    def __init__(self):
        QNetworkAccessManager.__init__(self)
        self.reply = self.get(QNetworkRequest(QUrl("")))

    # Save image data in QByteArray buffer to the disk (google_image_logo.png
    # in the same directory)
    @pyqtSlot()
    def slot_finished(self):
        image_file = QFile("resources/browser_images/image_required_browser")
        if image_file.open(QIODevice.ReadWrite):
            image_file.write(self.message_buffer)
            image_file.close()
            self.signal_add_image.emit()
            # QMessageBox.information(None, "Hello!", "File has been saved!")
        else:
            pass
            # QMessageBox.critical(None, "Hello!", "Error saving file!")
        self.download_finished = True
        self.dialog.close()

    # Append current data to the buffer every time readyRead() signal is
    # emitted
    @pyqtSlot()
    def slot_read_data(self):
        self.message_buffer += self.reply.readAll()

    def request_image(self, url, progress_bar, dialog):
        self.reply.deleteLater()
        self.download_finished = False
        self.dialog = dialog
        self.message_buffer = QByteArray()
        url = QUrl(url)
        req = QNetworkRequest(url)
        req.setRawHeader(b'User-Agent',
                                    b'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36')
        self.reply = self.get(req)
        self.reply.readyRead.connect(self.slot_read_data)
        self.reply.finished.connect(self.slot_finished)
        self.reply.downloadProgress.connect(progress_bar)

    def get_reply(self):
        return self.reply

    def done(self):
        return self.download_finished

    def set_reply(self, reply):
        self.reply = reply

    def del_reply(self):
        self.reply.deleteLater()

NETWORK_ACCESS_MANAGER = NetworkAccessManager()

希望它能给你带来一些光明”)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Pyqt4 从 URL 下载数千个 PDF 的相关文章

随机推荐

  • 禁用从特定函数参数推导模板参数的更好方法?

    这是我想做的 template
  • 数组排序错误:“二元运算符 '<' 无法应用于两个 'Int?'操作数”

    这是按 tableView 时间戳中的每个单元格对数组进行排序的代码 self ProjectsArray sorted by project project2 gt Bool in return project timestamp int
  • coreapi 操作,没有当前文档

    我正在尝试使用 coreapi 和 Django Rest Framework 进行发布 我正在关注这个tutorial https wsvincent com official django rest framework tutorial
  • 以点作为分隔符分割字符串

    我想知道我是否要在一个字符串上分割字符串 正确的方式 我的代码是 String fn filename split return fn 0 我只需要字符串的第一部分 这就是我返回第一项的原因 我问这个是因为我在 API 中注意到 意味着任何
  • 多次显示admob插页式广告怎么办?

    我有一个小型游戏应用程序 它有一个故事板 里面创建了像开始菜单 游戏区域 分数这样的场景 我在其中添加了 admob 横幅视图和插页式广告 我的横幅视图工作正常 但我的插页式广告只能工作一次 我在 viewdidload 上加载插页式广告
  • 如何管理 OSGi 构建依赖项?

    我们已将 OSGi 运行时 Equinox 嵌入到自定义客户端 服务器应用程序中 以促进插件开发 到目前为止一切进展顺利 由于 Eclipse 内置的清单编辑器 依赖项管理和导出向导 我们一直使用 Eclipse 来构建插件 使用 Ecli
  • Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

    我在 Amazon S3 上使用 getObject 和 putObject 请求 并在创建访问存储桶的策略时发现 如果我不允许 listBucket 则会收到 访问被拒绝 错误 这样做的问题是 listBucket 意味着用户可以列出存储
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • 使用 Twitter 引导模式而不是确认对话框

    我正在尝试使用 twitter 引导模式而不是自定义确认对话框 我的职能 function getConfirm confirmMessage if confirmMessage undefined confirmMessage confi
  • 自定义身份验证中间件 - 如何检查请求是匿名还是授权?

    我正在尝试编写自己的身份验证中间件代码 在老式的 HttpModule 中 当请求 授权 页面时 我可以使用 OnAuthenticateRequest 我的中间件代码是这样的 public async Task Invoke HttpCo
  • 启动时修改@RequestMappings

    是否可以更改 RequestMapping启动时的值 基本上我想要的是创建一个注释 Api Api Version V1 这意味着请求映射应该修改为 api dogs to api v1 dogs 我想在类级别 适用于所有 和方法级别 重新
  • 如何使用 pandas 对一系列值进行编码

    我有一个 pandas 数据框并且有一列age 我想将其编码为按特定范围分隔的分类值 例如 15岁以下的年龄应为0 15到30之间的年龄应更改为1等等 我找到了这种方法来做到这一点 在经历了关于使用的巨大困惑之后 and and age X
  • 未调用派生类的 C++/cli 静态构造函数

    如上所述在我的另一篇帖子中 https stackoverflow com q 29410579 2505186从 VS 2008 net 3 5 迁移到 VS 2013 并使用 net 4 0 而不是 4 5 后 我发现我的应用程序出现了
  • 为什么 EF DataBase First 不使用 getdate()?

    我首先使用 EF 4 1 和数据库 示例表 CREATE TABLE dbo Product ID int IDENTITY 1 1 not null Title nvarchar 200 not null CreateDate datet
  • 某些表格后的分页符

    我的问题是 我有一个页面 其中包含几个要打印的 html 表格 有些表有很多行 有些则没有 我想要做的是将第一个和第二个表 大表 打印在单独的页面中 其余表 小表 每页打印两个 如何在我想要的位置放置分页符 我试过 但这会在每个表格后面添加
  • 单个语句中的多个复合赋值:是否是未定义行为?

    我找不到明确的答案 以下代码是否有未定义的行为 int x 2 x x x 2 5 该行为是未定义的 让我们看一下稍微简单的表达式 x x 1 在C 11中 左边的值计算x相对于表达式的值计算是无序的 x 1 这意味着值计算x相对于分配而言
  • 如何在Mac上使用eclipse安装jetty

    我是一个新手 jetty 和 RESTful API 我想使用 Jetty 创建 REST 服务 并希望将嵌入式 jetty 与 eclipse 一起使用 任何人都可以建议我在 Mac OS 中使用 Eclipse 安装 Jetty Jet
  • RecyclerView.OnScrollListener:一次滚动实例被多次调用

    我有一个水平布局的回收视图 一次只有一个视图可见 mRecyclerView findViewById R id rvmain mRecyclerView setOnFlingListener null final SnapHelper s
  • 数组和关联数组合并

    如何实现第三个数组 合并Array1和Array2 在 PHP 中做到这一点的最佳方法是什么 非常感谢 Array2 具有类似索引 键 即 Array1 中 id 的关联值 Array1 Array 0 gt Array id gt 56
  • 使用 Pyqt4 从 URL 下载数千个 PDF

    理想情况下 我试图从给定网站下载数千个 PDF 然而 由于某种原因 它甚至无法下载 100 个 PDF 我不知道为什么 这是代码 usr bin env python import time from pyPdf import PdfFil