我将使用iTextSharp将数据插入到图形部门创建的PDF中。大多数此类数据是简单的数据到字段映射,但有些数据是需要添加的项目列表(例如,产品数据;用户可以拥有任意数量的产品,并且需要为所有数据显示数据)
是否可以使用iTextSharp执行此操作?显然,PDF模板不能用一定数量的字段创建,因为无法知道将有多少字段 - 它可以是1,或10,甚至100;我需要做的是“重复使用”PDF的一部分,并为循环中的每个项重复该部分。
可行吗?
答案 0 :(得分:1)
过去我需要做类似的事情。我需要创建一个包含未知数量的图像和内容的PDF。在我的例子中,“条目”由图像和一组字段定义。
我做的是我有一份文件。作为“条目”模板。然后我生成了一个temp。每个'Entry'的pdf文件,并将生成的文件名存储在List中。 在处理了所有“条目”之后,我将所有临时pdf文档合并为一个最终文档。
这里有一些代码可以让你有更好的想法(它不是可编译的,只是作为参考,因为我从我的旧项目中获取了某些部分)。
List<string> files = new List<string>(); // list of files to merge
foreach (string pageId in pages)
{
// create an intermediate page
string intermediatePdf = Path.Combine(_tempPath, System.Guid.NewGuid() + ".pdf");
files.Add(intermediatePdf);
string pdfTemplate = Path.Combine(_templatePath, _template);
CreatePage(pdfTemplate, intermediatePdf, pc, pageValues, imageMap, tmd);
}
// merge into resulting pdf file
string outputFolder = "~/Output/";
if (preview)
{
outputFolder = "~/temp/";
}
string pdfResult = Path.Combine(HttpContext.Current.Server.MapPath(outputFolder), Guid.NewGuid().ToString() + ".pdf");
PdfMerge.MergeFiles(pdfResult, files);
//////////////////////////////////////////////////////////////////////////
// delete temporary files...
foreach (string fd in files)
{
File.Delete(fd);
}
return pdfResult;
以下是合并模板的代码:
public class PdfMerge
{
public static void MergeFiles(string destinationFile, List<string> sourceFiles)
{
int f = 0;
// we create a reader for a certain document
PdfReader reader = new PdfReader(sourceFiles[f]);
// we retrieve the total number of pages
int n = reader.NumberOfPages;
// step 1: creation of a document-object
Document document = new Document(reader.GetPageSizeWithRotation(1));
// step 2: we create a writer that listens to the document
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(destinationFile, FileMode.Create));
// step 3: we open the document
document.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage page;
int rotation;
// step 4: we add content
while (f < sourceFiles.Count)
{
int i = 0;
while (i < n)
{
i++;
document.SetPageSize(reader.GetPageSizeWithRotation(i));
document.NewPage();
page = writer.GetImportedPage(reader, i);
rotation = reader.GetPageRotation(i);
if (rotation == 90 || rotation == 270)
{
cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
}
else
{
cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
}
}
f++;
if (f < sourceFiles.Count)
{
reader = new PdfReader(sourceFiles[f]);
// we retrieve the total number of pages
n = reader.NumberOfPages;
}
}
// step 5: we close the document
document.Close();
}
}
希望它有所帮助!