【发布时间】:2018-02-07 16:03:54
【问题描述】:
我需要在我的主 pdf 中添加多个 pdf(每个单页)。这些需要添加到特定页码之后,而不是附加到末尾。
我该怎么做
1:在特定页码处合并pdf
2:pdfCopy.AddDocument 不可用。我已经测试了 5.4.3、5.4.5 和 5.5.10 版本。我在这里想念什么?都说要用5.X,我是……
'PdfCopy' does not contain a definition for 'AddDocument' and no extension method 'AddDocument' accepting a first argument of type 'PdfCopy' could be found (are you missing a using directive or an assembly reference?)
3:pageToInsert at 大于源中总页数时如何处理?
到目前为止,我已经查看了大量文档。都告诉使用 PdfCopy 和 .AddDocument...
Merging multiple PDFs using iTextSharp in c#.net
这是我的第一次尝试......
using System;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
namespace PdfMergeTest
{
public partial class Form1 : Form
{
private const string baseFile = "baseFile.tmp";
private const string baseTempPdfFileName = "temp.pdf";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnMerge_Click(object sender, EventArgs e)
{
if (!CheckBasePaths())
return;
//get the files to merge to baseFile
var filesToMerge = GetAllFilesToMerge();
if (filesToMerge.Length == 0)
return;
//get basefile to which we need to merge the above files, it is with .tmp ext
var baseFileWithPath = GetBaseFile();
if (string.IsNullOrWhiteSpace(baseFileWithPath))
return;
//temp base pdf
var tempPdfWithPath = GetBaseTempFile();
if (string.IsNullOrWhiteSpace(tempPdfWithPath))
return;
//loop through the files to merge and merge into baseFile
var page = 2; //page where to merge the file, we are not appending to the end. Actual code will find the page from source where to merge and will add 1 to it
foreach (FileInfo toMerge in filesToMerge)
{
//copy the base file as temp file for source; for debugging purposes at this time
File.Copy(baseFileWithPath, tempPdfWithPath, true);
//start merging, first at #2, second at #4, third at #6 and so on
MergeFiles(baseFileWithPath, tempPdfWithPath, toMerge.FullName, page);
page += 2;
}
}
private bool CheckBasePaths()
{
if (string.IsNullOrWhiteSpace(txtBaseDir.Text))
{
MessageBox.Show("No Base Directory");
return false;
}
if (string.IsNullOrWhiteSpace(txtFilesToMergeToBase.Text))
{
MessageBox.Show("No files to merge Directory");
return false;
}
if (!Directory.Exists(txtBaseDir.Text))
{
MessageBox.Show("Base dir does not exist");
return false;
}
if (!Directory.Exists(txtFilesToMergeToBase.Text))
{
MessageBox.Show("Files to merge dir does not exist");
return false;
}
return true;
}
private FileInfo[] GetAllFilesToMerge()
{
DirectoryInfo d = new DirectoryInfo(txtFilesToMergeToBase.Text);
FileInfo[] files = d.GetFiles("*.pdf");
if (files.Length == 0)
MessageBox.Show("No files to merge");
return files;
}
private String GetBaseFile()
{
var myBaseFile = Path.Combine(txtBaseDir.Text, baseFile);
if (!File.Exists(myBaseFile))
{
myBaseFile = "";
MessageBox.Show("Base file missing");
}
return myBaseFile;
}
private String GetBaseTempFile()
{
var myBaseTempFile = Path.Combine(txtBaseDir.Text, baseTempPdfFileName);
return myBaseTempFile;
}
private void MergeFiles(string originalFile, string sourceFile, string toMergeFile, int insertPage)
{
Document document = null;
PdfCopy pdfCopy = null;
PdfReader pdfReader = null;
try
{
//Step#1: create a document object
document = new Document();
//Step#2: create a writer that listen to the document
pdfCopy = new PdfSmartCopy(document, new FileStream(originalFile, FileMode.Create));
if (pdfCopy == null)
return;
//Step#3: open document
document.Open();
//Step#4: create a reader for the toMergeFile and add document
pdfReader = new PdfReader(toMergeFile);
//add the entire document instead of page by page
pdfCopy.AddDocument(pdfReader);
pdfReader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (pdfReader != null) pdfReader.Close();
if (pdfCopy != null) pdfCopy.Close();
if (document != null) document.Close();
}
}
}
}
我使用.AddPage 关注了以下内容,但这不是我想要的。
http://www.worldbestlearningcenter.com/index_files/csharp-combine-pdf-files.htm
【问题讨论】:
-
AddDocument()方法当然存在于 iTextSharp 5.4.5 和 5.4.11 中,但它在 5.0.0 中不可用。也许您的环境中有不同版本的 iTextSharp,也许您正在使用旧版本而没有意识到您正在使用该旧版本。如何发现?创建一个简单的 Hello World 示例,并查看生产者行(请参阅 Adobe Reader 中的文档属性)。这会告诉你你实际使用的版本。 -
我已经设置了一个新的测试并下载了 5.4.5 和 5.5.10 版本。所以上面的测试代码来自我的测试项目。 AddDocument 不可用。现在我下载的压缩包,即使是 5.5.10,实际上包含旧版本?你能指出我正确的网址吗?
-
使用
iTextSharp.text和iTextSharp.text.pdf并且 dll 是 pdfa。这对你来说是否正确@BrunoLowagie? -
当你说 并且 dll 是 pdfa 时,你把我弄糊涂了。为什么需要 PDF/A DLL 来合并文档???请听从我的建议并创建一个简单的 PDF。查看文档属性并检查生产者行中提到的版本号。
-
我正在从 sourceforge.net 下载 dll 并且看起来没有正确更新。我使用 nuget 下载了 5.5.10,它有 .AddDocument。您能否指点我一个示例,该示例将 pdf 添加到基本 pdf 中的特定页码之后而不是末尾?我也将在短时间内运行我的测试,看看我是否遇到任何问题。