以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  iTextSharp怎么实现多个pdf的合并呢?并且在合并的pdf右上角输入页码?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=189240)

--  作者:cnsjroom
--  发布时间:2023/11/19 2:52:00
--  iTextSharp怎么实现多个pdf的合并呢?并且在合并的pdf右上角输入页码?
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

--  作者:有点蓝
--  发布时间:2023/11/19 19:43:00
--  
第三方组件请自行研究组件的开发文档。
--  作者:cnsjroom
--  发布时间: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编辑过]