我已经在网上寻找如何做到这一点的例子。我发现了一些似乎更复杂一些的事情,然后他们需要做到。所以我的问题是,使用iTextSharp,是否有一种相当简洁的方式将一个PDF文档附加到另一个PDF文档?是否有直接的方式来使用iTextSharp将一个PDF文档附加到另一个PDF文档?
理想情况下,这不会涉及第三个文件。只需打开第一个PDF文档,将第二个PDF文档附加到第一个PDF文档,然后关闭它们。
我已经在网上寻找如何做到这一点的例子。我发现了一些似乎更复杂一些的事情,然后他们需要做到。所以我的问题是,使用iTextSharp,是否有一种相当简洁的方式将一个PDF文档附加到另一个PDF文档?是否有直接的方式来使用iTextSharp将一个PDF文档附加到另一个PDF文档?
理想情况下,这不会涉及第三个文件。只需打开第一个PDF文档,将第二个PDF文档附加到第一个PDF文档,然后关闭它们。
好的,这不是直接的,但它的工作原理和令人惊讶的快速。 (它使用第三个文件,没有打开和追加的东西。)我在文档/示例中发现了这个。这里的代码:
private void CombineMultiplePDFs(string[] fileNames, string outFile) {
int pageOffset = 0;
ArrayList master = new ArrayList();
int f = 0;
Document document = null;
PdfCopy writer = null;
while (f < fileNames.Length) {
// we create a reader for a certain document
PdfReader reader = new PdfReader(fileNames[ f ]);
reader.ConsolidateNamedDestinations();
// we retrieve the total number of pages
int n = reader.NumberOfPages;
ArrayList bookmarks = SimpleBookmark.GetBookmark(reader);
if (bookmarks != null) {
if (pageOffset != 0) {
SimpleBookmark.ShiftPageNumbers(bookmarks, pageOffset, null);
}
master.AddRange(bookmarks);
}
pageOffset += n;
if (f == 0) {
// step 1: creation of a document-object
document = new Document(reader.GetPageSizeWithRotation(1));
// step 2: we create a writer that listens to the document
writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create));
// step 3: we open the document
document.Open();
}
// step 4: we add content
for (int i = 0; i < n;) {
++i;
if (writer != null) {
PdfImportedPage page = writer.GetImportedPage(reader, i);
writer.AddPage(page);
}
}
PRAcroForm form = reader.AcroForm;
if (form != null && writer != null) {
writer.CopyAcroForm(reader);
}
f++;
}
if (master.Count > 0 && writer != null) {
writer.Outlines = master;
}
// step 5: we close the document
if (document != null) {
document.Close();
}
}
是的。我在iText论坛上看到一个名为PdfManipulation的类。但是使用这个类将涉及第三个文件。
该类最初在VB.Net中。我从post on vbforums.com下载它。显然,它没有合并文件功能,所以我根据该类中的代码编写了一个。
这是写在没有iTextSharp的机器上。这可能有错误。我甚至不确定页码是基于0还是1。但给它一个镜头。
public static void MergePdfFiles(IEnumerable<string> files, string output) {
iTextSharp.text.Document doc;
iTextSharp.text.pdf.PdfCopy pdfCpy;
doc = new iTextSharp.text.Document();
pdfCpy = new iTextSharp.text.pdf.PdfCopy(doc, new System.IO.FileStream(output, System.IO.FileMode.Create));
doc.Open();
foreach (string file in files) {
// initialize a reader
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(file);
int pageCount = reader.NumberOfPages;
// set page size for the documents
doc.SetPageSize(reader.GetPageSizeWithRotation(1));
for (int pageNum = 1; pageNum <= pageCount; pageNum++) {
iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, pageNum);
pdfCpy.AddPage(page);
}
reader.Close();
}
doc.Close();
}
我不知道如何处理PDF文件,但是对于postscript,您只需连接文件。如果你有pdf2ps和PS2PDF安装,下面将做的工作:
pdf2ps file1.pdf file1.ps
pdf2ps file2.pdf file2.ps
cat file1.ps file2.ps > combined.ps
ps2pdf combined.ps combined.pdf
我不是pdf2ps或PS2PDF专家。我只使用ps2pdf,当我这样做时,它将文本留为文本(我仍然可以从生成的pdf中选择和复制文本)。当我执行上述步骤时(pdf-> ps,combine,ps-> pdf),我最终得到的pdf就像图像一样。不知道为什么。
我真的可能会错过一些东西,但我做了更简单的事情。我承认这个解决方案可能不会更新书签(如迄今为止的最佳答案),但它对我来说完美无瑕。由于我将文档与可填写的表单合并,因此我使用了PdfCopyFields而不是PdfCopy。
下面是代码(我已经去除了所有的错误处理,以使实际的代码更明显,加try..finally如果你打算使用的代码,关闭打开的资源):
void MergePdfStreams(List<Stream> Source, Stream Dest)
{
PdfCopyFields copy = new PdfCopyFields(Dest);
foreach (Stream source in Source)
{
PdfReader reader = new PdfReader(source);
copy.AddDocument(reader);
}
copy.Close();
}
你可以通过任何流,无论是一个FileStream,一个MemoryStream(读取来自数据库的PDF文件时非常有用,无需临时文件等等)
使用范例:
void TestMergePdfStreams()
{
List<Stream> sources = new List<Stream>()
{
new FileStream("template1.pdf", FileMode.Open),
new FileStream("template2.pdf", FileMode.Open),
new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"])
};
MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create));
}
这适用于试图合并/附加两个PDF文档与表单域!更简单!谢谢。 – 2012-01-27 18:29:55
页码从1 – 2016-03-01 15:35:16