c# – 如何使用iTextsharp将文件插入现有PDF文件夹的文件夹中
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何使用iTextsharp将文件插入现有PDF文件夹的文件夹中,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5043字,纯文字阅读大概需要8分钟。
内容图文
使用How to merge PDFs into a PDF Portfolio?中的答案,我已经能够使用iTextSharp创建PDF文件夹.但是,使用Adobe Acrobat我能够创建文件夹,并且我可以将文件放在这些文件夹中.
如何创建文件夹以及如何使用iTextSharp将文件放入PDF文件夹中的这些文件夹中?
我已经尝试使用pdf检查器程序来查看有和没有文件夹的投资组合之间的差异,但我还没有看到任何.我想我在找错了地方
编辑
对于我的这个特定用例,实际上可以预先创建包含文件夹的PDF文件夹.因此,能够在现有PDF文件夹中的文件夹中插入文件而不是实际创建文件夹本身更为重要.
解决方法:
下面是一些概念代码的证明,它创建了一个包含几个文件夹的新组合pdf,并将现有的pdf文件插入到每个文件夹中.这种方法基于使用文本编辑器查看使用原始帖子中链接的示例代码创建的pdf文件,然后使用Acrobat创建文件夹并将嵌入文件移动到该文件夹??中,保存pdf,然后查看使用文本编辑器进行更改.在代码中,我正在重新创建在比较组合pdf的两个版本时发现的更改,因此当它工作时(至少在我的机器上),它可能不是完成任务的最佳方式.
如果你想像我一样查看之前/之后的文件,使用iTextsharp创建组合,然后使用Acrobat打开并创建一个文件夹并将嵌入的文件移动到文件夹中,然后使用保存图标再次保存文件在工具栏上.不要使用文件 – >另存为…选项将文件另存为投资组合PDF. Acrobat重新组织文件并压缩或以其他方式将大量文件转换为您无法在文本编辑器中读取的二进制数据.我发现删除二进制流数据使得结构更容易遵循.只需摆脱每对流/ endstream关键字之间的所有内容.
Acrobat在投资组合pdf中做的一件事是嵌入一个Flash文件,该文件为投资组合提供动画和更具吸引力的主题.我无法弄清楚如何做到这一点,因此这段代码生成的文件看起来有点简单.
using System;
using System.IO;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.collection;
public class FolderWriter {
private const string Folder = @"C:\Path\to\your\pdf\files";
private const string File1 = @"Pdf File 1.pdf";
private const string File2 = @"Pdf File 2.pdf";
private readonly string file1Path = Path.Combine(Folder, File1);
private readonly string file2Path = Path.Combine(Folder, File2);
private readonly string[] keys = new[] {
"Type",
"File"
};
public void Write(Stream stream) {
using (Document document = new Document()) {
PdfWriter writer = PdfWriter.GetInstance(document, stream);
document.Open();
document.Add(new Paragraph("This document contains a collection of PDFs"));
PdfIndirectReference parentFolderObjectReference = writer.PdfIndirectReference;
PdfIndirectReference childFolder1ObjectReference = writer.PdfIndirectReference;
PdfIndirectReference childFolder2ObjectReference = writer.PdfIndirectReference;
PdfDictionary parentFolderObject = GetFolderDictionary(0);
parentFolderObject.Put(new PdfName("Child"), childFolder1ObjectReference);
parentFolderObject.Put(PdfName.NAME, new PdfString());
PdfDictionary childFolder1Object = GetFolderDictionary(1);
childFolder1Object.Put(PdfName.NAME, new PdfString("Folder 1"));
childFolder1Object.Put(PdfName.PARENT, parentFolderObjectReference);
childFolder1Object.Put(PdfName.NEXT, childFolder2ObjectReference);
PdfDictionary childFolder2Object = GetFolderDictionary(2);
childFolder2Object.Put(PdfName.NAME, new PdfString("Folder 2"));
childFolder2Object.Put(PdfName.PARENT, parentFolderObjectReference);
PdfCollection collection = new PdfCollection(PdfCollection.DETAILS);
PdfCollectionSchema schema = CollectionSchema();
collection.Schema = schema;
collection.Sort = new PdfCollectionSort(keys);
collection.Put(new PdfName("Folders"), parentFolderObjectReference);
writer.Collection = collection;
PdfFileSpecification fs;
PdfCollectionItem item;
fs = PdfFileSpecification.FileEmbedded(writer, file1Path, File1, null);
item = new PdfCollectionItem(schema);
item.AddItem("Type", "pdf");
fs.AddCollectionItem(item);
// the description is apparently used to place the
// file in a particular folder. The number between the < and >
// is used to put the file in the folder that has the matching id
fs.AddDescription(GetDescription(1, File1), false);
writer.AddFileAttachment(fs);
fs = PdfFileSpecification.FileEmbedded(writer, file2Path, File2, null);
item = new PdfCollectionItem(schema);
item.AddItem("Type", "pdf");
fs.AddCollectionItem(item);
fs.AddDescription(GetDescription(2, File2), false);
writer.AddFileAttachment(fs);
writer.AddToBody(parentFolderObject, parentFolderObjectReference);
writer.AddToBody(childFolder1Object, childFolder1ObjectReference);
writer.AddToBody(childFolder2Object, childFolder2ObjectReference);
document.Close();
}
}
private static string GetDescription(int id, string fileName) {
return string.Format("<{0}>{1}", id, fileName);
}
private static PdfDictionary GetFolderDictionary(int id) {
PdfDictionary dic = new PdfDictionary(new PdfName("Folder"));
dic.Put(PdfName.CREATIONDATE, new PdfDate(DateTime.Now));
dic.Put(PdfName.MODDATE, new PdfDate(DateTime.Now));
dic.Put(PdfName.ID, new PdfNumber(id));
return dic;
}
private static PdfCollectionSchema CollectionSchema() {
PdfCollectionSchema schema = new PdfCollectionSchema();
PdfCollectionField type = new PdfCollectionField("File type", PdfCollectionField.TEXT);
type.Order = 0;
schema.AddField("Type", type);
PdfCollectionField filename = new PdfCollectionField("File", PdfCollectionField.FILENAME);
filename.Order = 1;
schema.AddField("File", filename);
return schema;
}
}
内容总结
以上是互联网集市为您收集整理的c# – 如何使用iTextsharp将文件插入现有PDF文件夹的文件夹中全部内容,希望文章能够帮你解决c# – 如何使用iTextsharp将文件插入现有PDF文件夹的文件夹中所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。