【发布时间】:2014-08-29 14:13:32
【问题描述】:
我正在尝试使用 PdfCopy 基于另一个文件创建一个新的 pdf 文件。 生成过程中一切正常,生成的文件可以在我的桌面上毫无问题地打开,但文件似乎已损坏并且我必须使用的服务不接受:
调用“sign”时出现SignService错误,可能是文件格式错误。
我注意到生成的 pdf 总是比原始模板轻,所以我将模板版本与生成的版本进行了比较。丢失数据有一些很大的部分,尤其是一大堆 xml。我猜 PdfCopy 不会复制我的每一个原始 pdf,但我不知道我错过了什么。
这是我的方法:
byte[] completedDocument = null;
string originalUri = Path.Combine(this.PdfPath, pdfName);
string generatedUri = Path.Combine(this.PdfGeneratedPath, generatedPdfName);
using(MemoryStream streamCompleted = new MemoryStream())
{
using(Document doc = new Document())
{
PdfCopy copy = new PdfCopy(doc, streamCompleted);
copy.PdfVersion = PdfWriter.VERSION_1_6;
doc.Open();
copy.Open();
byte[] mergedDocument = null;
PdfReader pdfReader = new PdfReader(originalUri);
int pdfPageNumber = pdfReader.NumberOfPages;
using(MemoryStream streamTemplate = new MemoryStream())
{
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, streamTemplate))
{
AcroFields acrofields = pdfStamper.AcroFields;
foreach (KeyValuePair<string, AcroFields.Item> field in acrofields.Fields)
{
string data;
if (pdfFieldsValues.TryGetValue(field.Key, out data))
{
if (data == null)
{
data = string.Empty;
}
acrofields.SetField(field.Key, data);
}
}
pdfStamper.FormFlattening = true;
pdfStamper.Writer.CloseStream = false;
}
mergedDocument = streamTemplate.ToArray();
}
pdfReader = new PdfReader(mergedDocument);
for (int page = 1; page <= pdfPageNumber; page++)
{
if (!excludedPages.Any(s => s == page))
{
copy.AddPage(copy.GetImportedPage(pdfReader, page));
}
}
doc.Close();
copy.Close();
}
completedDocument = streamCompleted.ToArray();
}
File.WriteAllBytes(generatedUri, completedDocument);
我尝试上传“mergedDocument”而不是“completedDocument”并且我的服务接受它,所以我很确定它与这部分有关:
for (int page = 1; page <= pdfPageNumber; page++)
{
if (!excludedPages.Any(s => s == page))
{
copy.AddPage(copy.GetImportedPage(pdfReader, page));
}
}
或 pdfCopy 初始化
【问题讨论】:
-
与其创建新文档并仅导入您想要的页面,您是否可以尝试只删除您不想要的页面? stackoverflow.com/a/8751668/231316
-
我必须使用的服务 - 请说明该服务对 PDF 文件的要求。如果没有,请询问服务提供商导致错误的原因。
-
请不要编辑您的帖子以“添加解决方案”,这违反了 Stack Overflow 的政策和意图。 (您可能不知道,因为您在注册时没有阅读介绍性教程......)只需添加您的解决方案作为答案。
标签: c# pdf copy itextsharp