【问题标题】:Path Sharing Violation Error when modifying existing pdf using iText7使用 iText7 修改现有 pdf 时出现路径共享冲突错误
【发布时间】:2020-02-14 16:28:37
【问题描述】:

我使用 Itext7 在 c# 中创建了一个 pdf,但在添加标题后我无法覆盖 pdf,它给出了路径共享冲突错误。我也在正确关闭文档。

我首先使用此代码创建至少 10 页的 Pdf:

           if(FileBrowser.Success) 
           {
            PdfWriter writer = new PdfWriter(path);


            PdfDocument pdf = new PdfDocument(writer);


            Document document = new Document(pdf, size);


            PdfPage page1 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            PdfPage page2 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            PdfPage page3 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            PdfPage page4 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            PdfPage page5 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content              

            PdfPage page6 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            PdfPage page7 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            PdfPage page8 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            PdfPage page9 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content           

            PdfPage page10 = pdf.AddNewPage();
            document.Add(new iText.Layout.Element.AreaBreak());
            //Add Content

            document.Close();
           }
           Header();  //Calling Header Function

那我就是用这个函数来添加Header

 void Header()
    {

        PdfDocument pdfDoc = new PdfDocument(new PdfReader(path), new PdfWriter(path));

        Document document = new Document(pdfDoc);


        Rectangle pageSize;
        PdfCanvas canvas;
        int n = pdfDoc.GetNumberOfPages();
        for (int i = 1; i <= n; i++)
        {
            PdfPage page = pdfDoc.GetPage(i);
            pageSize = page.GetPageSize();

            canvas = new PdfCanvas(page);
            canvas.BeginText().SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.HELVETICA), 7)
           .MoveText(pageSize.GetWidth() / 2 - 24, pageSize.GetHeight() - 10)
           .ShowText("Header Text")
           .EndText();

        }
        document.Close();

      }

它给了我这个错误:

IOException: Sharing violation on path C:\Users\dell-pc\Desktop\ty1234.pdf
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) (at <7ba07f088431485bb722f3b3373e87ee>:0)
System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode) (at <7ba07f088431485bb722f3b3373e87ee>:0)
(wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode)
iText.IO.Util.FileUtil.GetBufferedOutputStream (System.String filename) (at <57da1b8d8a184e278c732544ebe6412a>:0)
iText.Kernel.Pdf.PdfWriter..ctor (System.String filename, iText.Kernel.Pdf.WriterProperties properties) (at <3dc307d472b9422b8d3082a4addd20b6>:0)
iText.Kernel.Pdf.PdfWriter..ctor (System.String filename) (at <3dc307d472b9422b8d3082a4addd20b6>:0)
(wrapper remoting-invoke-with-check) iText.Kernel.Pdf.PdfWriter..ctor(string)
Panel.HeaderFooter () (at Assets/Scripts/Panel.cs:6253)
Panel+<ShowSaveDialogCoroutine>d__100.MoveNext () (at Assets/Scripts/Panel.cs:6244)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)

创建了 pdf,但是当它调用 Header() 函数时,它给出了 PdfDocument 行的错误,而不是替换现有的 pdf。 谁能帮我解决这个问题?

【问题讨论】:

  • 对此question 的公认答案似乎有一个很好的解决方案

标签: c# pdf itext pdf-generation sharing-violation


【解决方案1】:

您正在尝试创建 PdfReaderPdfWriter 处理同一个文件:

PdfDocument pdfDoc = new PdfDocument(new PdfReader(path), new PdfWriter(path));

那行不通;如果为文件构建,PdfReader 要求该文件在与它一起使用时保持不变,但PdfWriter 立即开始写入,截断它。

如果你想用编辑过的文件替换原始文件,你应该临时使用第二个文件。

或者,如果根本不需要临时文件,您可以先将文件读入内存(byte[]),将读取器指向该byte[],将写入器指向原始文件名。或者将作者指向ByteArrayOutputStream 并在编辑后将其内容写入文件。

【讨论】:

  • 天啊,非常感谢。我使用以下方法将现有的 pdf 转换为内存流: byte[] tempPDf =File.ReadAllBytes(path); MemoryStream 流 = 新 MemoryStream(tempPDf);然后使用以下命令读取流并将阅读器指向原始文件: PdfReader pdfReader = new PdfReader(stream); PdfDocument pdfDoc = new PdfDocument(pdfReader,new PdfWriter(path));它创造了奇迹。非常感谢@mkl
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多