求照片格式转pdf格式功能的window平台开源工具

要想一款具有照片格式转pdf格式功能的window平台开源工具,大家有推荐的吗 :smiley:

1 Like

其实论便利性感觉不如chrome和firefox :doge: 当然edge也行

考虑到开源
emm……

我找找

LibreOffice可以以奇怪的方式做到(LibreOffice相当于Office套装)

又考虑到批量……

我推荐pdftk,就是没有GUI界面,只能CLi命令行有点不友好

用虚拟打印机啊,图片批量打印为pdf

FreePic2Pdf,免费,好用。应该不开源。

可以试试 PDFArrnger,开源,免费,支持 Windows 平台,支持将图片转换成 PDF。

打开软件,直接将图片拖入窗口并排序,再保存即可。

Windows右键直接打印图片成pdf,不需要软件

PDFill
FreePic2Pdf
:grinning:貌似不开源

Tichau/FileConverter: File Converter is a very simple tool which allows you to convert and compress files using the context menu in windows explorer. (github.com)

python打包exe后,直接拖入图片文件/文件夹到程序图标上,自动合并成pdf,格式的话jpg、png没问题,其他格式没试过

"""
更新日期:
2024.03.27

功能:
PDF导出为图片,图片合并为一个PDF
"""
import os
import sys
import tkinter.messagebox

import filetype
import fitz

try:
    drop_paths = sys.argv[1:]
except IndexError:
    drop_paths = []


def pdf_to_image(pdf_path: str):
    """将pdf每页导出为图片"""
    doc = fitz.open(pdf_path)
    # 根据页数分别处理,如果是单页则直接导出图片,如果为多页则导出到一个文件夹中
    pages_count = doc.page_count
    filetitle = os.path.basename(os.path.splitext(pdf_path)[0])
    dirpath = os.path.dirname(pdf_path)
    if pages_count == 1:
        pix = doc[0].get_pixmap(dpi=300)
        # 使用官方的pix.save方法保存图片
        pix.save(f'{dirpath}/{filetitle}.png')
        # 使用PIL库保存图片
        # image = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)
        # image.save(f'{dirpath}/{filetitle}.png')
    elif pages_count > 1:
        os.mkdir(f'{dirpath}/{filetitle}')
        for index, page in enumerate(doc, start=1):
            pix = page.get_pixmap(dpi=300)
            # 使用官方的pix.save方法保存图片
            pix.save(f'{dirpath}/{filetitle}/{index}.png')
            # 使用PIL库保存图片
            # image = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)
            # image.save(f'{dirpath}/{filetitle}/{index}.png')


def image_to_pdf(images: list, output: str = 'output.pdf'):
    """将图片合并为pdf"""
    merged_pdf = fitz.open()  # 最终合并的PDF

    for image_file in images:
        # 读取图片,转为PDF流
        img = fitz.open(image_file)
        # rect = img[0].rect  # 读取图片尺寸
        pdf_bytes = img.convert_to_pdf()
        img.close()
        # 读取PDF流,转为PDF对象
        img_page = fitz.open("pdf", pdf_bytes)
        # 插入
        merged_pdf.insert_pdf(img_page)

    dirpath = os.path.dirname(images[0])
    merged_pdf.save(f'{dirpath}/{output}')
    merged_pdf.close()


def is_image(file: str):
    """文件是否是图片"""
    return filetype.is_image(file)


def is_pdf(file: str):
    """文件是否是pdf"""
    kind = filetype.guess(file)
    if kind is None:
        return False

    guess_type = kind.extension
    if guess_type == 'pdf':
        return True
    else:
        return False


def get_files(folder: str):
    """获取文件夹下所有文件路径"""
    files = []
    for dirpath, dirnames, filenames in os.walk(folder):
        for j in filenames:
            filepath_join = os.path.normpath(os.path.join(dirpath, j))
            files.append(filepath_join)

    return files


def show_info():
    tkinter.Tk().withdraw()
    tkinter.messagebox.showinfo(title='使用说明',
                                message='直接将文件/文件夹拖到程序上使用。\n拖入图片:合并为1个PDF\n拖入PDF:导出每页为图片')


def main():
    # 收集全部文件
    files = []
    for path in drop_paths:
        if os.path.isfile(path):
            files.append(path)
        else:
            walks = get_files(path)
            files += walks

    # 按文件类型分类
    images = [i for i in files if is_image(i)]
    pdfs = [i for i in files if is_pdf(i)]

    # 如果同时存在图片和pdf,则不做处理直接退出
    if images and pdfs:
        return

    if images:  # 图片转pdf
        image_to_pdf(images)
    elif pdfs:  # pdf导出图片
        for pdf in pdfs:
            pdf_to_image(pdf)


if __name__ == '__main__':
    if drop_paths:
        main()
    else:
        show_info()

免费开源.

万能格式转换. 不仅仅是 图片=>pdf

支持鼠标右键快捷操作.

2 Likes

这个就可以