【问题标题】:iTextSharp new memory stream or juggle file paths?iTextSharp 新的内存流或杂耍文件路径?
【发布时间】:2015-07-27 16:45:11
【问题描述】:

我对编程仍然很陌生,我把自己装进了一个角落,看起来就像我制作的这个 WPF 应用程序一样。我创建了一个试图覆盖正在读入的文件的进程,所以我遇到了访问冲突。不过我的问题是……如果我对这个应用程序的要求是简单地标记一个对文件名最终兴趣为零的 pdf,我怎样才能读取文件并同时更改它,我不能有复制 pdf 的过程,它必须覆盖现有的 pdf 并且不创建重复文件,尽管文件名不同。我希望将文件读入内存流是答案,但我很难找到不在 java 中的文档,我无法从他们的示例中移植到 c#。

this is the error in VS

这是完成这项工作的代码。

for (int i = 0; i < filePaths.Length; ++i)
                {

                    PdfReader reader = new PdfReader(filePaths[i]);

                    PdfStamper stamper = new PdfStamper(reader, new FileStream(filePaths[i], FileMode.Create, FileAccess.Write));
                    BaseFont font = BaseFont.CreateFont(); // Helvetica, WinAnsiEncoding
                    for (int j = 0; j < reader.NumberOfPages; ++j)
                    {
                        PdfContentByte overContent = stamper.GetOverContent(j + 1);
                        overContent.SaveState();
                        overContent.BeginText();
                        overContent.SetFontAndSize(font, 10.0f);
                        overContent.SetTextMatrix(10, 5);
                        overContent.ShowText(clientName
                                            + " #" + clientID
                                            + " DOB:" + dobDate
                                            + " " + admitType
                                            + " @" + admitDate);
                        overContent.EndText();
                        overContent.RestoreState();
                    }
                    stamper.Close();
                }

                //reset form
                inputBox.Text = "";

                clientNameText.Text = "";
                clientIDText.Text = "";
                dobDateText.Text = "";
                admitTypeText.Text = "";
                admitDateText.Text = "";
                errorLabel.Text = "";

                doneImage.Visibility = Visibility.Visible;


            }

【问题讨论】:

    标签: c# wpf pdf itextsharp


    【解决方案1】:

    您正在使用PdfReader 的构造函数,它采用最常见的文件路径,但正如您所见,这意味着您无法写入文件,因为您仍在读取文件。

    幸运的是,有一个需要 raw byte array 的重载,因此您可以使用 System.IO.File.ReadAllBytes() 自行读取文件并将其传递给 PdfReader

    PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePaths[i]));
    

    【讨论】:

    • 所以这个 readAllBytes 不是通过文件路径读入并锁定文件,而是只拉入数据,然后可能只是引用它?
    • ReadAllBytes() 将文件的内容读入一个字节数组,然后该字节数组被传递。对于非常大的 PDF 或内存不足的机器或数百人同时访问的高性能网站,这可能是个问题,但对于日常常见使用而言,这不是问题。
    • 伙计,我尝试从字节列表构建一个字节数组,但从未成功,因为我无法弄清楚内存流语法,但如果你没有告诉我重载方法,我永远不会知道我不必重新发明轮子。它完美地工作......现在我可以将多个 pdf 拉入我的 filePaths 数组,并一次标记多个 pdf。谢谢一百万。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多