【发布时间】:2017-03-25 06:09:47
【问题描述】:
如何使用 itext7 在内存流中创建 PDF 而不是物理文件? 我不知道如何在最新版本中做到这一点,有什么帮助吗?
我尝试了以下代码,但没有正确填充 pdfSM:
string filePath = "./abc.pdf";
MemoryStream pdfSM = new ByteArrayOutputStream();
PdfDocument doc = new PdfDocument(new PdfReader(filePath), new PdfWriter(pdfSM));
.......
doc.close();
完整的测试代码如下供您参考,它在将 filePath 传递到 PdfWriter 时有效,但不适用于内存流:
public static readonly String sourceFolder = "../../FormTest/";
public static readonly String destinationFolder = "../../Output/";
static void Main(string[] args)
{
String srcFilePattern = "I-983";
String destPattern = "I-129_2014_";
String src = sourceFolder + srcFilePattern + ".pdf";
String dest = destinationFolder + destPattern + "_flattened.pdf";
MemoryStream returnSM = new MemoryStream();
PdfDocument doc = new PdfDocument(new PdfReader(src), new PdfWriter(returnSM));
PdfAcroForm form = PdfAcroForm.GetAcroForm(doc, false);
foreach (PdfFormField field in form.GetFormFields().Values)
{
var fieldName = field.GetFieldName();
var type = field.GetType();
if (fieldName != null)
{
if (type.Name.Equals("PdfTextFormField"))
{
field.SetValue("T");
}
}
}
form.FlattenFields();
doc.Close();
}
【问题讨论】:
-
“pdfSM 未正确填充”,您能否定义一下您的实际意思?您是否收到任何编译错误?您是否遇到任何运行时错误?
-
PdfWriter 类支持 filePath 作为构造函数和流,当我传入路径时,它与创建的 PDF 一起工作,但是,传递 Stream 没有返回任何内容,没有编译或运行时错误,因为我是 iText 的新手,也许我只是不知道如何使用这个类,这就是我需要帮助的原因
-
我没有看到你关闭
doc,也没有看到你在流中检索数据gem。 -
是否可以在不创建物理文件的情况下将文件保存到内存流?
-
@ZachJinUS-Advisory 是的,但我没有看到您在任何地方关闭
doc,因此很可能完整的PDF 永远不会写入MemoryStream。 (这可以解释您的问题。)或者您使用错误的方法从MemoryStream获取byte[]。很难说,因为您发布的问题不到一半。