Golang如何在现有PDF文件中添加图像

Golang如何在现有PDF文件中添加图像 你好,

我需要在一个现有的PDF文件中添加一张图片和两段文字。 首先,我想知道用Go语言是否可以实现这个功能。 如果你能描述一个解决方案或实现方法,那就太好了(我知道如何为新建的文件操作)。

我在网上做了一些研究,但我是法国人(人无完人),在结果丛林中筛选对我来说并不容易。 我看到过像Pdftron这样的解决方案,但我不能使用付费方案,并且我更喜欢开源解决方案。 我会继续我的研究,但如果你能帮助我……

非常感谢。

5 回复

保留打印-签署-扫描的工作流程,将签名图像插入文件并保留在某些司法管辖区可能被视为签名伪造,而在其他地区则可能完全没有法律效力。

更多关于Golang如何在现有PDF文件中添加图像的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


JPL:

首先,我想知道用 Go 语言是否可以实现。

这通常是可行的。

不过,通常你也不会想去编辑 PDF 文件。你要么从一些非 PDF 的源文件生成它们,要么使用 PDF 编辑器来编辑。PDF 是一种处理起来很麻烦的容器格式,任何修改它的操作,其成败都取决于原始 PDF 文件是如何创建的。

这并没有真正使用Go,但我认为你可以找到用Go编写的封装/库来帮助执行这些命令。

使用convert(或任何可用的工具)来转换PDF中的图像。 然后使用该PDF,通过pdftkmultistamp操作覆盖目标PDF文档。

几年前我使用PHP做过这个(同时使用了PDFjsjSignature)来制作一个简单的编辑器,用于向PDF文件添加签名和注释。

您好,

感谢您的回答。

关于PDF格式,我无法做出让步。

我来解释一下我的问题。 我们是一个帮助年轻人的教育机构。 我们组织专业实习。 我们通过电子邮件以PDF格式发送实习协议。 公司或协会通过电子邮件发回签署好的协议。我们将所有内容都以PDF格式存储。 目前,他们打印协议,手动签名,扫描,然后将协议以PDF或图片形式发送回来。 我想简化这个流程,用一个工具来帮助他们整合签名,而无需打印协议或进行扫描。他们中很多是非常小的企业或协会,没有扫描仪,返回的协议只是一张(用手机拍的)照片。

我想到了一个替代方案,但不知道是否可行。 将PDF转换为图片,合并签名和协议图片。再将图片转换为PDF。我目前还不知道如何操作,但正在研究。 协议有两页(正面和背面)。

如果您能帮助我。不是给我一个现成的解决方案(虽然…… ;o)) ),而是给我一些可以探索的方向。

非常感谢。

在Go语言中,你可以使用开源的第三方库来操作现有的PDF文件并添加图像和文字。推荐使用 unidoc/unipdf/v3 库,它是一个功能强大的开源PDF处理库,支持编辑现有PDF文件。

以下是一个示例代码,展示如何打开一个现有的PDF文件,在指定位置添加一张图片和两段文字:

package main

import (
    "fmt"
    "os"
    "github.com/unidoc/unipdf/v3/common/license"
    "github.com/unidoc/unipdf/v3/creator"
    "github.com/unidoc/unipdf/v3/model"
)

func init() {
    // 设置UniDoc的免费许可证(有使用限制,适合开发测试)
    err := license.SetMeteredKey("你的免费许可证密钥")
    if err != nil {
        panic(err)
    }
}

func main() {
    // 打开现有的PDF文件
    inputPath := "input.pdf"
    f, err := os.Open(inputPath)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    pdfReader, err := model.NewPdfReader(f)
    if err != nil {
        panic(err)
    }

    // 获取PDF页数
    numPages, err := pdfReader.GetNumPages()
    if err != nil {
        panic(err)
    }

    // 创建新的PDF编辑器
    c := creator.New()

    // 遍历每一页
    for i := 1; i <= numPages; i++ {
        page, err := pdfReader.GetPage(i)
        if err != nil {
            panic(err)
        }

        // 将现有页面添加到编辑器
        err = c.AddPage(page)
        if err != nil {
            panic(err)
        }

        // 如果是第一页,添加图像和文字
        if i == 1 {
            // 添加图像
            img, err := c.NewImageFromFile("image.png")
            if err != nil {
                panic(err)
            }
            img.SetPos(50, 50) // 设置图像位置(x, y)
            img.ScaleToWidth(100) // 设置图像宽度
            err = c.Draw(img)
            if err != nil {
                panic(err)
            }

            // 添加第一段文字
            p := c.NewParagraph("第一段文字内容")
            p.SetPos(50, 200)
            p.SetFontSize(12)
            err = c.Draw(p)
            if err != nil {
                panic(err)
            }

            // 添加第二段文字
            p2 := c.NewParagraph("第二段文字内容")
            p2.SetPos(50, 220)
            p2.SetFontSize(12)
            err = c.Draw(p2)
            if err != nil {
                panic(err)
            }
        }
    }

    // 保存修改后的PDF文件
    outputPath := "output.pdf"
    err = c.WriteToFile(outputPath)
    if err != nil {
        panic(err)
    }

    fmt.Println("PDF文件已成功修改并保存为", outputPath)
}

注意:

  1. 你需要先安装 unidoc/unipdf/v3 库:
    go get github.com/unidoc/unipdf/v3
    
  2. 需要注册UniDoc的免费许可证密钥(有使用限制,适合开发测试),可以在UniDoc官网申请。
  3. 图像位置和文字位置通过 SetPos(x, y) 设置,坐标原点在页面左下角。
  4. 这个示例只在第一页添加内容,你可以根据需要修改条件。

如果你需要更复杂的操作(如多页添加、文字样式调整等),unipdf 库提供了丰富的API支持。

回到顶部