pdf转png
2018-10-12 13:56:43 SanBaDao 阅读数 1306
  • 6.小项目.图片解码播放器

    本课程是《朱有鹏老师嵌入式linux核心课程》第6部分,是一个课程后的小项目。用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器,实现了对BMP、JPG、PNG等格式图片进行解码播放的功能。

    7522 人正在学习 去看看 朱有鹏

    pdf转png,可以用php的一个扩展imagick,我使用过程中,老是导致cpu占100%,所以,我又尝试开发了另一种方法,就是有Ghostscript,这种方法也能实现pdf转图片,并可以设置图片类型为png等。下面着重介绍这种方法:

在windows上实现如下:

Pdf2PngforWindows

这是一个nodejs库,运行环境是Windows,如果你想运行在Linux上,
请参考:https://github.com/sanpangzi/Pdf2PngforLinux
本库在windows下,可以把一个多页的pdf转成多个png图片

怎么使用这个库?

  1. 首先下载到本地任意文件夹,使用之前,确保已安装npm,nodejs
  2. 进入下载后的文件夹,比如:D:\appweb\pdftopngforWindows
    进入之后,运行: npm install
    这个命令,会安装所需的两个模块tmp及filesource
  3. 安装完以上两个模块,就可以运行测试了,测试命令如下:
    node convert.js
    不出意外的话,你会看到test文件夹下,有4张图片,分别是1.png 2.png 3.png 4.png

说明

本代码是借助Ghostscript实现的,这个Ghostscript可以像本文一样,直接放入文件夹内,也可以删除本文的executables文件夹,
自己安装Ghostscript,设置环境变量,在path里加入你的安装路径,如果你安装的是64位的Ghostscript,
要把D:\appweb\pdftopngforWindows\lib\pdf2png.js里的gs改为gswin64;
之后,把D:\appweb\pdftopngforWindows\lib\pdfPageCount.js里的gs改为gswin64

在Linux上实现如下:

Pdf2PngforLinux

这是一个nodejs库,运行环境是linux,如果你想运行在windows上,
请参考:https://github.com/sanpangzi/Pdf2PngforWindows
本库在Linux下,可以把一个多页的pdf转成多页png图片

怎么使用这个库?

  1. 首先下载到本地任意文件夹,使用之前,确保已安装npm,nodejs
  2. 进入下载后的文件夹,比如:/usr/local/pdftopngforLinux
    进入之后,运行: npm install
    这个命令,会安装所需的两个模块tmp及filesource
  3. 本代码是借助Ghostscript实现的,这个Ghostscript需要预先安装,安装方法如下:
    sudo apt-get update
    sudo apt-get install ghostscript
  4. 安装完以上两个模块,就可以运行测试了,测试命令如下:
    node convert.js
    不出意外的话,你会看到test文件夹下,有4张图片,分别是1.png 2.png 3.png 4.png

 

2015-01-13 16:05:04 catoop 阅读数 8520
  • 6.小项目.图片解码播放器

    本课程是《朱有鹏老师嵌入式linux核心课程》第6部分,是一个课程后的小项目。用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器,实现了对BMP、JPG、PNG等格式图片进行解码播放的功能。

    7522 人正在学习 去看看 朱有鹏

在项目开发中经常会有将“word转换为pdf”、“将word转换为图片”、将“pdf转换为图片” 的需求。

针对如上需求,写一下自己在这方面的实现:

1、word转换为pdf ,前面有文章已经写过,参考地址: http://blog.csdn.net/catoop/article/details/42527349

2、word转换为图片,实现思路为 word——>pdf——>png   第一步转换参考前面写过的文章

3、pdf转换为图片,我们实现思路 pdf——>png


本文重点说一下 pdf 到 png 的转换:

首先我们要做如下准备:

1、GhostScript 安装

2、ImageMagick 安装


下面做一下分解:

一、GhostScript 安装和测试

我们先下载安装 GhostScript,官网地址:http://ghostscript.com/download/gsdnld.html(我已经下载过一个免安装版本,官方9.15版本 http://download.csdn.net/detail/catoop/8363115),这个建议大家使用官方最新版本。

(这里下载可以直接运行的版本 ghostscript-9.15-linux-x86_64.tgz ,下载解压后,直接复制到 /usr/bin 目录下,命名为gs 即可,如果/usr/bin目录下已经存在该文件,记得备份之前的文件后再拷贝过去)

安装成功后,输入命令 gs -version 如果有如下输出,说明安装成功,打印的是版本。

GPL Ghostscript 9.15 (2014-09-22)
Copyright (C) 2014 Artifex Software, Inc.  All rights reserved.

然后用如下命令转换输出一个pdf测试,命令:

gs -dNOSAFER -r300 -dBATCH -sDEVICE=pngalpha -dNOPAUSE -dEPSCrop -sOutputFile=testfilepng/%d.png testfile.pdf

执行命令后,会有如下输出,其中Page为转换的页码,其他输出是因为一些字体问题而出现的数据,只要能输出到最后一页中间不中断,就说明文件解析转换成功,下面是我转换的一个文件的输出内容:

GPL Ghostscript 9.15 (2014-09-22)
Copyright (C) 2014 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 38.
Page 1
Page 2
Page 3
Substituting font Helvetica for ArialMT.
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 5956124 4561384 9518216 8029777 3 done.
Substituting font Helvetica-Bold for Arial-BoldMT.
Loading NimbusSanL-Bold font from %rom%Resource/Font/NimbusSanL-Bold... 6013452 4628661 10043208 8183225 3 done.
Page 4
Page 5
Page 6
至此,GhostScript 的安装和测试已经成功。

PS:关于 gs 命令的很多参数,需要的对照官网进行研究吧。很强大的。
 

二、ImageMagick 安装

下载安装 ImageMagick,官网下载地址:http://www.imagemagick.org/script/download.php ,其中有很多连接,找一个能下载的下载安装(都是国外网站,需要的就拨一下VPN吧)

安装成功后,使用命令 convert -version 查看ImageMagick 版本号,验证是否安装成功,如下:

[root@localhost ghostscript-9.15-linux-x86_64]# convert -version
Version: ImageMagick 6.5.4-7 2012-04-10 Q16 OpenMP http://www.imagemagick.org
Copyright: Copyright (C) 1999-2009 ImageMagick Studio LLC

执行命令,进行pdf转换测试:

convert /opt/shanhy/testfile.pdf /opt/shanhy/testpdfpng/%d.$pic

至此,ImageMagick 安装和测试完成。


有的朋友可能会问,上面我们使用 ghostscript 已经可以转换文件图片,为什么还要安装ImageMagick呢?

这里解释一下:ImageMagick 的 convert 命令重点和强大之处是图片的处理能力,很多时候,我们需要直接对pdf转换出来的图片进行处理。这种情况下,使用 convert 命令会满足我们很多需求,关于 convert 命令的很多参数,大家查看关于 ImageMagick 的资料了解,这里也不做赘述。

另外说一下:convert 命令直接把pdf 转换为图片,是依赖的 ghostscript 库,所以 ghostscript 可以单独进行图片转换,而 convert 在安装ghostscript 之前,只能进行单独的图片处理,不能直接转换 pdf 为图片。


最后跟大家提一下,在我们的业务应用实现中,建议大家讲文件转换的命令写到shell 脚本中,使用程序调用脚本。虽然也可以通过代码调用 api 实现,不过我觉得还是使用系统的shell 处理,效率会高一些。


谢谢!










2019-06-05 19:48:38 qq_20866687 阅读数 251
  • 6.小项目.图片解码播放器

    本课程是《朱有鹏老师嵌入式linux核心课程》第6部分,是一个课程后的小项目。用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器,实现了对BMP、JPG、PNG等格式图片进行解码播放的功能。

    7522 人正在学习 去看看 朱有鹏

一、本文目的:

之前已经完成了Word转PDF,PDF加水印,PDF转PNG操作的逻辑功能,但是作为简单的工具软件带简单的可操作界面是必不可少的,因此本章节将完成其界面的书写。

二、软件思路

本软件界面较为简单,界面如下:

1、其中Path文本框用于输入文件工作目录

2、Rate进度条用来显示文件转换进度

3、input,ouput分别展示待处理文件目录和处理结果文件所在目录

4、help用来打开readme帮助用户熟悉软件的使用方法

5、→Go 用来运行程序,执行文件的转换操作

三、废话不多说,上代码:

# word2pdf.py
import os
import win32com.client
from PyPDF2 import PdfFileWriter, PdfFileReader     # 将PyPDF2 库中的PdfFileWriter, PdfFileReader导出到工作空间
import fitz                                          # 它依赖于库 pymupdf
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import time

def ConvertDocToPdf(src, dst):
    '''
    :param src: 待转换word文档 
    :param dst: 转换完成后的pdf文档
    :return: 
    '''
    if not os.path.exists(src):
        print(src + "not exist, couldn't convert")
        return False
    # 如果文件存在就删除
    if os.path.exists(dst):
        os.remove(dst)
    o = win32com.client.Dispatch("Kwps.Application")
    o.Visible = False
    doc = o.Documents.Open(src);
    doc.ExportAsFixedFormat(dst, 17)
    o.Quit();
    if os.path.exists(dst):
        return True
    else:
        return False


def addMark2PDF(input_pdf, output_pdf, watermark_pdf_jishu, water_pdf_oushu):
    '''
    :param input_pdf:  输入的pdf文件 (待加水印) 
    :param output_pdf: 输出的pdf文件 (已加水印) 
    :param watermark_pdf_jishu: 奇数页水印
    :param water_pdf_oushu: 偶数页水印
    :return: 
    '''
    if(os.path.exists(output_pdf)):      # 若原有pdf已经存在,则删除之
        os.remove(output_pdf)
    if(not os.path.exists(input_pdf)):       # 若待加水印pdf不存在,则提示报错
        print("Target File is not exist!")
        return False
    if(os.path.exists(watermark_pdf_jishu)):
        watermark_jishu = PdfFileReader(watermark_pdf_jishu)
        watermark_page_jishu = watermark_jishu.getPage(0)      # 取得奇数页水印页
    else:
        return  False
    if(os.path.exists(water_pdf_oushu)):
        watermark_oushu = PdfFileReader(water_pdf_oushu)
        watermark_page_oushu = watermark_oushu.getPage(0)      # 取得奇数页水印页
    else:
        return False
    pdf = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()
    for page in range(pdf.getNumPages()):     # 对获取文件每页打水印
        if(page % 2 == 0):
            pdf_page = pdf.getPage(page)
            pdf_page.mergePage(watermark_page_jishu)
            pdf_writer.addPage(pdf_page)
        else:
            pdf_page = pdf.getPage(page)
            pdf_page.mergePage(watermark_page_oushu)
            pdf_writer.addPage(pdf_page)
    pdf_writer.write(open(output_pdf, "wb"))
    return True

# 函数: 将加水印后的PDF文件存储为逐张图片
def PdfConvertPng(filename, output_file = ''):
    '''
    :param filename:  需要转换的pdf文档名称
    :param output_file  文件位置
    :return: 
    '''
    doc = fitz.open(filename)
    for pg in range(doc.pageCount):
        page = doc[pg]    # 取pdf每页分别转为图片
        rotate = int(0)
        zoom_x = 2.0
        zoom_y = 2.0
        trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pm = page.getPixmap(matrix=trans, alpha=False)
        picFile = str(pg) + '.png';
        rightOutfile = os.path.join(output_file, picFile);
        pm.writePNG(rightOutfile)


# 函数: 完成PDF 转 word功能  #  暂不需要, 需要再添加

# 函数: 将总结文档中文档整理为要求格式, 并上传到CSDN博客
def convertToBlog(word_path, output_path, wate_mark_A, water_mark_B):
    '''
    将word_path中的文档处理完成后, 处理后文件存放到output_path目录下
    :param word_path: 
    :param output_path: 
    :return: 
    '''
    list = os.listdir(word_path)
    total = len(list)
    target = 0
    for file in list:
        pos = file.find('.')
        dirPath = os.path.join(output_path, file[0:pos])
        if(os.path.exists(dirPath)):
            target = target + 1
            value = (target / total) * 100
            ui.progressBar.setValue(value)
            app.processEvents()
            continue      # 说明已经转过, 不再处理
        else:
            os.mkdir(dirPath)
        try:
            # 第一步, word 转pdf
            pdfFileName = file[0:pos] + '.pdf';
            rightInFileName = os.path.join(word_path, file)
            rightOutFileName = os.path.join(dirPath, pdfFileName)
            ConvertDocToPdf(rightInFileName, rightOutFileName)

            # 第二步, pdf 加水印
            pdfMarkFileName = file[0:pos] + '(水印版).pdf';
            rightOutMarkFileName = os.path.join(dirPath, pdfMarkFileName)
            success = addMark2PDF(rightOutFileName, rightOutMarkFileName, wate_mark_A, water_mark_B)
            if(success == False):
                rightOutMarkFileName = os.path.join(dirPath, pdfFileName)

            # 第三步, pdf 转图片
            PdfConvertPng(filename = rightOutMarkFileName, output_file = dirPath)
        except:
            mes = str(file) + " 转换失败 ..."
            print(mes)
            pass
        finally:
            target = target + 1
            value = (target / total) * 100
            ui.progressBar.setValue(value)
            app.processEvents()

class Ui_OfficeManager(object):

    def setupUi(self, OfficeManager):
        OfficeManager.setObjectName("OfficeManager")
        OfficeManager.resize(291, 112)
        self.centralwidget = QtWidgets.QWidget(OfficeManager)
        self.centralwidget.setObjectName("centralwidget")
        self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(40, 40, 201, 21))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(40, 10, 241, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 31, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(10, 40, 31, 16))
        self.label_2.setObjectName("label_2")
        self.commandLinkButton = QtWidgets.QCommandLinkButton(self.centralwidget)
        self.commandLinkButton.setGeometry(QtCore.QRect(230, 30, 61, 41))
        self.commandLinkButton.setObjectName("commandLinkButton")
        OfficeManager.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(OfficeManager)
        self.statusbar.setObjectName("statusbar")
        OfficeManager.setStatusBar(self.statusbar)
        self.menubar = QtWidgets.QMenuBar(OfficeManager)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 291, 23))
        self.menubar.setObjectName("menubar")
        self.menuPath = QtWidgets.QMenu(self.menubar)
        self.menuPath.setObjectName("menuPath")
        self.menuHelp = QtWidgets.QMenu(self.menubar)
        self.menuHelp.setObjectName("menuHelp")
        self.menuoutput = QtWidgets.QMenu(self.menubar)
        self.menuoutput.setObjectName("menuoutput")
        OfficeManager.setMenuBar(self.menubar)
        self.actionInputFile = QtWidgets.QAction(OfficeManager)
        self.actionInputFile.setObjectName("actionInputFile")
        self.actionOutputFile = QtWidgets.QAction(OfficeManager)
        self.actionOutputFile.setObjectName("actionOutputFile")
        self.actionWaterMark = QtWidgets.QAction(OfficeManager)
        self.actionWaterMark.setObjectName("actionWaterMark")
        self.actionRead_me = QtWidgets.QAction(OfficeManager)
        self.actionRead_me.setObjectName("actionRead_me")
        self.actionfile = QtWidgets.QAction(OfficeManager)
        self.actionfile.setObjectName("actionfile")
        self.actionwatermask = QtWidgets.QAction(OfficeManager)
        self.actionwatermask.setObjectName("actionwatermask")
        self.actionfile_2 = QtWidgets.QAction(OfficeManager)
        self.actionfile_2.setObjectName("actionfile_2")
        self.menuPath.addAction(self.actionfile)
        self.menuPath.addAction(self.actionwatermask)
        self.menuHelp.addAction(self.actionRead_me)
        self.menuoutput.addAction(self.actionfile_2)
        self.menubar.addAction(self.menuPath.menuAction())
        self.menubar.addAction(self.menuoutput.menuAction())
        self.menubar.addAction(self.menuHelp.menuAction())

        self.lineEdit.setText(r'E:\document')   # 默认路径

        self.retranslateUi(OfficeManager)
        QtCore.QMetaObject.connectSlotsByName(OfficeManager)

    def retranslateUi(self, OfficeManager):
        _translate = QtCore.QCoreApplication.translate
        OfficeManager.setWindowTitle(_translate("OfficeManager", "MainWindow"))
        self.label.setText(_translate("OfficeManager", "Path"))
        self.label_2.setText(_translate("OfficeManager", "Rate"))
        self.commandLinkButton.setText(_translate("OfficeManager", "Go"))
        self.menuPath.setTitle(_translate("OfficeManager", "input"))
        self.menuHelp.setTitle(_translate("OfficeManager", "help"))
        self.menuoutput.setTitle(_translate("OfficeManager", "output"))
        self.actionInputFile.setText(_translate("OfficeManager", "InputFile"))
        self.actionOutputFile.setText(_translate("OfficeManager", "OutputFile"))
        self.actionWaterMark.setText(_translate("OfficeManager", "WaterMark"))
        self.actionRead_me.setText(_translate("OfficeManager", "Read me"))
        self.actionfile.setText(_translate("OfficeManager", "file"))
        self.actionwatermask.setText(_translate("OfficeManager", "watermask"))
        self.actionfile_2.setText(_translate("OfficeManager", "file"))
        self.actionfile.triggered.connect(self.action_file)
        self.actionwatermask.triggered.connect(self.action_watermark)
        self.actionfile_2.triggered.connect(self.action_file2)
        self.actionRead_me.triggered.connect(self.action_read_me)

    def action_file(self):
        self.is_path_ok()
        os.startfile(str(self.wordPath))

    def action_watermark(self):
        self.is_path_ok()
        os.startfile(str(self.waterMarkPath))

    def action_file2(self):
        self.is_path_ok()
        os.startfile(str(self.outputPath))

    def action_read_me(self):
        self.is_path_ok()
        file_name = r'readme.txt'
        file_name = os.path.join(self.path, file_name)
        with open(file_name, 'w') as fw:
            content = '使用说明:\n'
            content += '1. 请将需要转换的文件放置到inputFile文件夹下, 初次使用请使用→OK Button生成文件夹\n'
            content += '2. 请确保waterMark目录下存在水印文件pdf, 并分别命名为water_mark_1和water_mark_2, 缺1将无法加水印\n'
            fw.write(content)
        fw.close()
        os.startfile(str(self.path))

    def click_button(self):
        ui.commandLinkButton.clicked.connect(self.file_convert)

    def is_path_ok(self):
        self.path = self.lineEdit.text()
        if(not os.path.exists(self.path)):       # 文本框内目录不存在则创建
            os.mkdir(self.path)
        self.wordPath = os.path.join(self.path, r'inputFile')
        self.outputPath = os.path.join(self.path, r'outputFile')
        self.waterMarkPath = os.path.join(self.path, r'waterMark')

        # 保证三个目录均存在
        if(not os.path.exists(self.wordPath)):
            os.mkdir(self.wordPath)
        if (not os.path.exists(self.outputPath)):
            os.mkdir(self.outputPath)
        if (not os.path.exists(self.waterMarkPath)):
            os.mkdir(self.waterMarkPath)

    def file_convert(self):
        self.progressBar.setValue(0)
        app.processEvents()
        time.sleep(0.5)
        path = self.lineEdit.text()
        if(not os.path.exists(path)):       # 文本框内目录不存在则创建
            os.mkdir(path)
        wordPath = os.path.join(path, r'inputFile')
        outputPath = os.path.join(path, r'outputFile')
        waterMarkPath = os.path.join(path, r'waterMark')
        WaterMarkA = os.path.join(waterMarkPath, r'water_mark_1.pdf')
        waterMarkB = os.path.join(waterMarkPath, r'water_mark_2.pdf')

        # 保证三个目录均存在
        if(not os.path.exists(wordPath)):
            os.mkdir(wordPath)
        if (not os.path.exists(outputPath)):
            os.mkdir(outputPath)
        if (not os.path.exists(waterMarkPath)):
            os.mkdir(waterMarkPath)
        try:
            convertToBlog(word_path=wordPath, output_path=outputPath, wate_mark_A=WaterMarkA, water_mark_B=waterMarkB)
        except:
            print("Unexpected error:", sys.exc_info()[0])

# 多线程执行
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_OfficeManager()
    ui.setupUi(MainWindow)
    ui.click_button()
    MainWindow.show()
    sys.exit(app.exec_())

四、注意事项:
1. 请将需要转换的文件放置到inputFile文件夹下, 初次使用请使用→OK Button生成文件夹
2. 请确保waterMark目录下存在水印文件pdf, 并分别命名为water_mark_1和water_mark_2, 缺1将无法加水印
 

2012-07-03 22:38:01 Dikar 阅读数 0
  • 6.小项目.图片解码播放器

    本课程是《朱有鹏老师嵌入式linux核心课程》第6部分,是一个课程后的小项目。用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器,实现了对BMP、JPG、PNG等格式图片进行解码播放的功能。

    7522 人正在学习 去看看 朱有鹏

linux下将图片转换为pdf,linux下刚好有现成的工具

 

主要是利用 

ImageMagick的convert工具

 

具体见

http://www.imagemagick.org/script/formats.php?ImageMagick=ub4j63teftfck37e2tnt9nh253

 

使用时可以用如下简单的命令:

 

convert *jpg +compress output.pdf 

 

如果是tif的图片还能直接转成pdf,需要先用convert转成jpg才可以

 convert lab.tif -resize 50% resize.jpg

 

 

如果是将多个pdf合并为一个pdf,可以使用linux下的gs

 

 gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=test.pdf  1.pdf 2.pdf  3.pdf

 

pdf转成tiff

 

windows

 

gswin32c -dNOPAUSE -q -g300x300 -sDEVICE=tiffg4 -dBATCH -sOutputFile=output_file_name.tif input_file_name.pdf

 

linux

 

gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffg4 -sOutputFile=/tmp/melbourne.tif -f /tmp/melbourne.pdf

 

参见:http://www.troubleshooters.com/linux/gs.htm

 

 

 

Details of Ghostscript output devices

http://pages.cs.wisc.edu/~ghost/doc/AFPL/8.00/Devices.htm#TIFF

 

2019-05-14 10:20:01 shenxiaomo1688 阅读数 313
  • 6.小项目.图片解码播放器

    本课程是《朱有鹏老师嵌入式linux核心课程》第6部分,是一个课程后的小项目。用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器,实现了对BMP、JPG、PNG等格式图片进行解码播放的功能。

    7522 人正在学习 去看看 朱有鹏

安装好ImageMagick后,运用命令convert -density 300 -quality 100 "/usr/local/tomcat/test/1.pdf" "/usr/local/tomcat/test/1.png"转图片时老是报错误,以下是错误详情:

convert: FailedToExecuteCommand `'gs' -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 '-sDEVICE=pngalpha' -dTextAlphaBits=4 -dGraphicsAlphaBits=4 '-r72x72'  '-sOutputFile=/tmp/magick-26757KhSit2bKyfwa%d' '-f/tmp/magick-26757lL6cdz2j5VDZ' '-f/tmp/magick-26757SnLQ7f7amJLO'' (1) @ error/pdf.c/InvokePDFDelegate/291.

convert: no images defined `/usr/local/tomcat/test/1.png' @ error/convert.c/ConvertImageCommand/3275.

原来,ImageMagick能实现图片格式之间的互转,如jpg转png,但是pdf转图片,ImageMagick还需依赖ghostscript,于是使用yum -y  install ghostscript,系统默认给我安装的版本是8.7.0,重新执行命令,还是失败,后来按照博友https://blog.csdn.net/wade1010/article/details/83271104的做法 ,具体如下:

进入Linux终端
wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs925/ghostscript-9.25.tar.gz
tar zxvf ghostscript-9.25.tar.gz
cd ghostscript-9.25
./configure --prefix=/usr
make all
make install
该方法在我第二次尝试时,在执行wget的时候一直报文件名过长,无法写入。没办法,只能去ghostscript官网https://www.ghostscript.com/download/gsdnld.html下载,此时ghostscript已升级到9.27版本,下载了一个tgz格式的安装后一直不起作用,后来到github https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs925/ghostscript-9.25.tar.gz找到9.25 tar.gz版本,下载好放到服务器,使用上面的方法进行安装。待安装完毕后,重新执行上面的命令,终于将pdf转成图片。

Python3 PDF转图片

阅读数 257

PDF文件转成PNG图片

阅读数 797

没有更多推荐了,返回首页