我使用以下方法获取2个pdf (CADPDF & TemplatePDF ),并将它们叠加为另一个pdf (FinalPDF)。
public void MergePDFs(string CADPDF, string TemplatePDF, string FinalPDF, string oldData, string newData, string jobNumber, string customer, string designer, string date)
{
PdfReader reader = new PdfReader(TemplatePDF);
PdfReader reader2 = new PdfReader(CADPDF);
PdfStamper stamper = new PdfStamper(reader, new FileStream(FinalPDF, FileMode.Append, FileAccess.Write));
PSModel psModel = powerSHAPE.ActiveModel;
try
{
AcroFields fields = stamper.AcroFields;
fields.SetField("oldDataField", oldData);
fields.SetField("newDataField", newData);
fields.SetField("jobNumberField", jobNumber);
fields.SetField("customerField", customer);
fields.SetField("dateField", date);
fields.SetField("designerField", designer);
stamper.FormFlattening = false;
PdfImportedPage page = stamper.GetImportedPage(reader2, 1);
PdfContentByte cb;
cb = stamper.GetOverContent(1);
cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(1).Height);
stamper.Close();
}
catch
{
System.Windows.MessageBox.Show("Unable to merge drawing with template!");
}
stamper.Close();
}一切都运行得很好,但是现在如果这个FinalPDF已经存在,我需要追加另一个页面。我已经将FileStream的FileMode更改为附加,但是FinalPDF是覆盖的,而不是附加的。
如有任何指示,将不胜感激。
发布于 2017-04-24 19:24:47
通过使用内存流和iTextSharp数组,我在使用byte[]时取得了最好的效果。我使用PdfSmartCopy类生成一个空白PDF,然后从不同的源中以byte[]的形式检索所需的元素。
使用以下方法使用byte[]返回数据的PdfStamper
public byte[] GetContentToMerge(string CADPDF, string TemplatePDF, string oldData, string newData, string jobNumber, string customer, string designer, string date)
{
using (MemoryStream ms = new MemoryStream())
{
PdfReader reader = new PdfReader(TemplatePDF);
PdfReader reader2 = new PdfReader(CADPDF);
// Use a Memory stream instead of a filestream
PdfStamper stamper = new PdfStamper(reader, ms);
//PSModel psModel = powerSHAPE.ActiveModel;
try
{
AcroFields fields = stamper.AcroFields;
fields.SetField("oldDataField", oldData);
fields.SetField("newDataField", newData);
fields.SetField("jobNumberField", jobNumber);
fields.SetField("customerField", customer);
fields.SetField("dateField", date);
fields.SetField("designerField", designer);
stamper.FormFlattening = false;
PdfImportedPage page = stamper.GetImportedPage(reader2, 1);
PdfContentByte cb;
cb = stamper.GetOverContent(1);
cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(1).Height);
stamper.Close();
reader.Close();
reader2.Close();
// The content you wanted to create is in a memory stream.
// It can bee appended to a PDF as a byte[]
byte[] ContentToAppend = ms.ToArray();
return ContentToAppend;
}
catch
{
System.Windows.MessageBox.Show("Unable to merge drawing with template!");
}
stamper.Close();
}
// If we made it here, something went wrong.
return new byte[0];
}使用该方法,您可以从父方法调用它并以编程方式执行追加操作。
public void MergePDFs(string CADPDF, string TemplatePDF, string FinalPDF, string oldData, string newData, string jobNumber, string customer, string designer, string date)
{
using (Document oDoc = new Document())
using (MemoryStream ms = new MemoryStream())
{
PdfSmartCopy oPDF = new PdfSmartCopy(oDoc, ms);
oDoc.Open();
// If the FinalPDF file already exists, load it's data into the PDF 1st.
if (File.Exists(FinalPDF))
{
byte[] bytesFinalPDF = File.ReadAllBytes(FinalPDF);
oPDF.AddDocument(new PdfReader(bytesFinalPDF));
}
// If it doesn't exist, the oPDF is blank at this point.
// Second add the CAD and Template data to the PDF
// We do this by calling the GetContentToMerge method which returns the byte array of data that was created using the stamper.
byte[] ContentToAdd = GetContentToMerge(CADPDF, TemplatePDF, oldData, newData, jobNumber, customer, designer, date);
if (ContentToAdd.Length > 0)
{
oPDF.AddDocument(new PdfReader(ContentToAdd));
}
oDoc.Close();
// Take whatever went into oPDF object's memory stream and write it to a file with path FinalPDF
File.WriteAllBytes(FinalPDF, ms.ToArray());
}
}**我没有调试这个100%,所以它可能需要一些清理检查是否存在文件,读/写权限等.
https://stackoverflow.com/questions/43595055
复制相似问题