Foxtable(狐表)用户栏目专家坐堂 → iTextSharp怎么实现多个pdf的合并呢?并且在合并的pdf右上角输入页码?


  共有1152人关注过本帖树形打印复制链接

主题:iTextSharp怎么实现多个pdf的合并呢?并且在合并的pdf右上角输入页码?

帅哥哟,离线,有人找我吗?
cnsjroom
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
iTextSharp怎么实现多个pdf的合并呢?并且在合并的pdf右上角输入页码?  发帖心情 Post By:2023/11/19 2:52:00 [只看该作者]

iTextSharp怎么实现多个pdf的合并,生成新的pdf呢?并且在合并的pdf右上角输入页码?
pdf 目录中有多个pdf文件,每个文件都有顺序号,名称格式为:【编号0】 - 名称封面页.pdf,【编号1】 - 名称目录页.pdf,【编号2】 - 名称123.pdf,【编号3】 - 名称123456.pdf……
1、怎么实现获取每个pdf文件的页数,并将所有pdf的页数进行汇总统计。【已实现】
2、怎么实现以pdf文件名称前面的编号012345678……为顺序,依次将多个pdf文件合并成一个名为合并.pdf文件呢?
3、怎么实现在新生成的pdf中从封面页+目录页页数之后开始,假定封面页1页,目录页2页在新的pdf文件右上角指定位置X200Y30从1开始输入页码。



以下内容是专门发给有点蓝浏览


1、怎么实现获取每个pdf文件的页数,并将所有pdf的页数进行汇总统计。【已实现】
获取目录下pdf对应的所有页码总数:
Dim ymsum As Integer = 0
For Each File As String In FileSys.GetFiles("C:\Users\Administrator\Desktop") '遍历指定目录下的文件
    If FileSys.GetName(File).Contains(".pdf") Then '找到名称中含pdf的文件
        Output.Show(File)       
        Dim reader As New iTextSharp.text.pdf.PdfReader(File) '获取文件的页数
        output.Show(reader.NumberOfPages)
        ymsum = ymsum + reader.NumberOfPages '统计总的页数
    End If    
Next
Output.Show(ymsum) '输出指定目录下的pdf文件的所有页码数


2、怎么实现以pdf文件名称前面的编号012345678……为顺序,依次将多个pdf文件合并成一个pdf文件呢?
获取文件名称中的序号数字:
For Each File As String In FileSys.GetFiles("C:\Users\Administrator\Desktop") '遍历指定目录下的文件
    Dim filename As String = FileSys.GetName(File)
    If filename.Contains(".pdf") Then
        If filename.Contains("-名称") Then
            Output.Show(filename)
            Dim Values() As String
            Values = filename.split("-名称")
            For Index As Integer = 0 To Values.Length - 1
                If Values(1).Contains("名称") = True Then
                    Output.Show("名称:" & Values(1).Replace("名称", "")) 
                End If 
                 If Values(0).Contains("编号") = True Then
                    Output.Show("序号:" & Values(0).Replace("【编号", "").Replace("】", "")) 
                End If 
            Next
        End If
    End If  
Next

输出结果为:
【编号0】 - 名称封面页.pdf
名称:封面页.pdf
序号:0
名称:封面页.pdf
序号:0
【编号1】 - 名称目录页.pdf
名称:目录页.pdf
序号:1
名称:目录页.pdf
序号:1
【编号2】 - 名称123.pdf
名称:123.pdf
序号:2
名称:123.pdf
序号:2
【编号3】 - 名称123456.pdf
名称:123456.pdf
序号:3
名称:123456.pdf
序号:3


3、怎么实现在新生成的pdf中从封面页+目录页页数之后开始,假定封面页1页,目录页2页在新的pdf文件右上角指定位置X200Y30从1开始输入页码。

获取封面页+目录页页码总数:
Dim ymsum As Integer = 0
For Each File As String In FileSys.GetFiles("C:\Users\Administrator\Desktop") '遍历指定目录下的文件
    If FileSys.GetName(File).Contains("封面页.pdf") Then '找到名称中含pdf的文件
        Dim reader As New iTextSharp.text.pdf.PdfReader(File) '获取文件的页数
        ymsum = ymsum + reader.NumberOfPages '统计总的页数
        reader.Close()
    End If
    If FileSys.GetName(File).Contains("目录页.pdf") Then '找到名称中含pdf的文件
        Dim reader As New iTextSharp.text.pdf.PdfReader(File) '获取文件的页数
        ymsum = ymsum + reader.NumberOfPages '统计总的页数
        reader.Close()
    End If
Next
Output.Show("封面+目录数:" & ymsum) 

求助部分:怎么实现多个pdf合并,并写入页码
For Each File As String In FileSys.GetFiles("C:\Users\Administrator\Desktop") '遍历指定目录下的文件
    If FileSys.GetName(File).Contains(".pdf") Then '找到名称中含pdf的文件
        Output.Show(File)
        Dim reader As New iTextSharp.text.pdf.PdfReader(File) '获取文件的页数
        Dim document As New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1)) '根据第一页的大小创建一个新的PDF文档;
        Dim n As Integer = ymsum '获取原始PDF文件的总页数;
        Dim baos As New IO.FileStream("d:\123456.pdf", IO.FileMode.Create, IO.FileAccess.Write) '创建一个新的PDF文件流,用于输出修改后的PDF;
        Dim copy As New iTextSharp.text.pdf.PdfCopy(document, baos) '创建一个PdfCopy对象,用于将多个PDF文件合并为一个PDF文件,此处将原始PDF文件的每一页加入到新的PDF文件中;
        copy.ViewerPreferences = iTextSharp.text.pdf.PdfWriter.HideToolbar Or iTextSharp.text.pdf.PdfWriter.HideMenubar Or iTextSharp.text.pdf.PdfWriter.HideWindowUI '设置PDF文件的阅读选项,包括隐藏工具栏、菜单栏和窗口UI;
        '往pdf中写入内容
        document.Open()
        For i As Integer = 1 To n
            Dim page As iTextSharp.text.pdf.PdfImportedPage = copy.GetImportedPage(reader, i)
            copy.AddPage(page) '将新的PDF文件写入到PDF流中;
        Next
        '关闭PDF文件和流,释放资源。
        document.Close()
        reader.Close()
    End If
Next

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107861 积分:548662 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/11/19 19:43:00 [只看该作者]

第三方组件请自行研究组件的开发文档。

 回到顶部
帅哥哟,离线,有人找我吗?
cnsjroom
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)第三方组件请自行研究组件的开发文档...  发帖心情 Post By:2023/11/19 23:21:00 [只看该作者]

当前合并pdf代码,且可以成功合并


片段1
Dim reader1 As New iTextSharp.text.pdf.PdfReader("d:\12345678.pdf") '获取文件的页数
Dim document As New iTextSharp.text.Document(reader1.GetPageSizeWithRotation(1)) '根据第一页的大小创建一个新的PDF文档;
片段2
'Dim document As New iTextSharp.text.Document() '根据第一页的大小创建一个新的PDF文档;
接上片段1或片段2其中一个
Dim baos As New IO.FileStream("d:\123456.pdf", IO.FileMode.Create, IO.FileAccess.Write) '创建一个新的PDF文件流,用于输出修改后的PDF;
Dim copy As New iTextSharp.text.pdf.PdfCopy(document, baos) '创建一个PdfCopy对象,用于将多个PDF文件合并为一个PDF文件,此处将原始PDF文件的每一页加入到新的PDF文件中;
copy.ViewerPreferences = iTextSharp.text.pdf.PdfWriter.HideToolbar Or iTextSharp.text.pdf.PdfWriter.HideMenubar Or iTextSharp.text.pdf.PdfWriter.HideWindowUI '设置PDF文件的阅读选项,包括隐藏工具栏、菜单栏和窗口UI;

For Each File As String In FileSys.GetFiles("C:\Users\Administrator\Desktop") '遍历指定目录下的文件
    If FileSys.GetName(File).Contains(".pdf") Then '找到名称中含pdf的文件
        Output.Show(File)
        Dim reader As New iTextSharp.text.pdf.PdfReader(File) '获取文件的页数
        
        Dim n As Integer = reader.NumberOfPages '获取原始PDF文件的总页数;
        '往pdf中写入内容
        document.Open()
        For i As Integer = 1 To n
            Dim page As iTextSharp.text.pdf.PdfImportedPage = copy.GetImportedPage(reader, i)
            copy.AddPage(page) '将新的PDF文件写入到PDF流中;
        Next
        '关闭PDF文件和流,释放资源。
        reader.Close()
    End If
Next
document.Close()

baos.Close() '关闭PDF文件流,释放资源。


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:itextsharp 中文帮助文档.rar


合并pdf且编码:红色部分代码提示如下报错  老师们有没有办法解决呢?
---------------------------
版本:2022.8.18.1
---------------------------
代码执行出错,错误信息:

iTextSharp.text.DocumentException: The original document was reused. Read it again from file.

   在 iTextSharp.text.pdf.PdfStamperImp..ctor(PdfReader reader, Stream os, Char pdfVersion, Boolean append)

   在 UserCode.Test()
---------------------------
确定   
---------------------------

Dim time As String = Format(Date.now, "yyyyMMddHHmmss") 
Dim document As New iTextSharp.text.Document()
Dim totalCount As Integer = 0 '初始化计数器变量为0 
Dim outpdf As String = "d:\" & time & "123456888.pdf"
 
Dim baos As New IO.FileStream(outpdf, IO.FileMode.Create, IO.FileAccess.Write) 
Dim copy As New iTextSharp.text.pdf.PdfCopy(document, baos) 
copy.ViewerPreferences = iTextSharp.text.pdf.PdfWriter.HideToolbar Or iTextSharp.text.pdf.PdfWriter.HideMenubar Or iTextSharp.text.pdf.PdfWriter.HideWindowUI
Dim outpdf1 As String = "d:\" & time & "888.pdf"
For Each file As String In FileSys.GetFiles("C:\Users\Administrator\Desktop") 
    If file.Contains(".pdf") Then 
        Dim reader As New iTextSharp.text.pdf.PdfReader(File) 
        Dim pageCount As Integer = reader.NumberOfPages '获取文件的页数
        totalCount += pageCount '将文件的页数累加到计数器中 
        document.Open()
        For i As Integer = 1 To pageCount '遍历每一页 
            Dim stamper As New iTextSharp.text.pdf.PdfStamper(reader, New IO.FileStream(outpdf1, IO.FileMode.Append)) '创建PdfStamper对象 
            Dim cb As iTextSharp.text.pdf.PdfContentByte = stamper.GetOverContent(i) '获取当前页的PdfContentByte对象 
            cb.BeginText() '开始添加标识符 
            Dim bf As iTextSharp.text.pdf.BaseFont = iTextSharp.text.pdf.BaseFont.CreateFont() 
            cb.SetFontAndSize(bf, 10)
            
            cb.ShowTextAligned(iTextSharp.text.Element.ALIGN_CENTER, "Page " & (totalCount - pageCount + i), 300, 20, 0) 
            cb.EndText() 
            stamper.Close() '关闭PdfStamper对象 
            Dim page As iTextSharp.text.pdf.PdfImportedPage = copy.GetImportedPage(reader, i) 
            copy.AddPage(page) 
        Next 
        reader.Close() 
    End If 
Next 
document.Close() 
baos.Close()
[此贴子已经被作者于2023/11/20 0:16:56编辑过]

 回到顶部