【问题标题】:I need to append multiple filestreams to the same pdf file我需要将多个文件流附加到同一个 pdf 文件
【发布时间】:2019-05-20 06:45:20
【问题描述】:

我有一个函数可以将ZPL(斑马标签) 转换为 PDF 格式并保存文件。我想要做的不是每次都覆盖文件,而是想将文件流附加到文件(如果存在),写入新的(如果不存在)。

我尝试使用 filemode.append 设置一个新的文件流,但这似乎没有什么不同。

private static void SaveLabel(string label, string labelDir, string caseNumber)
    {
        var zpl = Encoding.UTF8.GetBytes(label);
        var fileName = $@"{labelDir}\{caseNumber}.pdf";

        // adjust print density (8dpm), label width (4 inches), label height (6 inches), and label index (0) as necessary
        var request = (HttpWebRequest)WebRequest.Create("http://api.labelary.com/v1/printers/8dpmm/labels/4x6/0/");
        request.Method = "POST";
        request.Accept = "application/pdf"; // omit this line to get PNG images back
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = zpl.Length;

        var requestStream = request.GetRequestStream();
        requestStream.Write(zpl, 0, zpl.Length);
        requestStream.Close();

        try
        {
            var response = (HttpWebResponse)request.GetResponse();
            var responseStream = response.GetResponseStream();
            if (!File.Exists(fileName))
                File.Create(fileName);

            using (var fileStream = File.Open(fileName, FileMode.Append))
            {
                responseStream?.CopyTo(fileStream);
                responseStream?.Close();
                fileStream.Close();
            }
        }
        catch (WebException e)
        {
            Console.WriteLine(@"Error: {0}", e.Status);
        }
    }

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    我首先检查文件是否存在(这意味着货件将有多个标签)。如果没有,则正常处理。如果是,则将该文件读入新的 pdf 文件。然后将当前响应流的内容读入第二个新的 pdf 文件。

    然后我删除目标文件以释放新组合 pdf 的名称。然后我使用建议的 PDFSharp 链接并合并页面并保存为原始文件名。无论生成多少包装标签,这都将启用文件的连续附加。

    private static void SaveLabel(string label, string labelDir, string caseNumber)
        {
            var zpl = Encoding.UTF8.GetBytes(label);
            var destFileName = $@"{labelDir}\{caseNumber}.pdf";
    
            // adjust print density (8dpm), label width (4 inches), label height (6 inches), and label index (0) as necessary
            var request = (HttpWebRequest)WebRequest.Create("http://api.labelary.com/v1/printers/8dpmm/labels/4x6/0/");
            request.Method = "POST";
            request.Accept = "application/pdf"; // omit this line to get PNG images back
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = zpl.Length;
    
            var requestStream = request.GetRequestStream();
            requestStream.Write(zpl, 0, zpl.Length);
            requestStream.Close();
    
            try
            {
                var response = (HttpWebResponse)request.GetResponse();
                var responseStream = response.GetResponseStream();
    
                if (File.Exists(destFileName))
                {
                    var oldStream = File.OpenRead(destFileName);
                    var oldFileName = $@"{labelDir}\{caseNumber}-1.pdf";
                    using (var fileStream = File.Open(oldFileName, FileMode.Create))
                    {
                        oldStream.CopyTo(fileStream);
                        oldStream.Close();
                        fileStream.Close();
                    }
    
                    var newFileName = $@"{labelDir}\{caseNumber}-2.pdf";
                    using (var fileStream = File.Open(newFileName, FileMode.Create))
                    {
                        responseStream?.CopyTo(fileStream);
                        responseStream?.Close();
                        fileStream.Close();
                    }
    
                    File.Delete(destFileName);
    
                    using (var pdfOne = PdfReader.Open(oldFileName, PdfDocumentOpenMode.Import))
                    {
                        using (var pdfTwo = PdfReader.Open(newFileName, PdfDocumentOpenMode.Import))
                        {
                            using (var outPdf = new PdfDocument())
                            {
                                CopyPages(pdfOne, outPdf);
                                CopyPages(pdfTwo, outPdf);
    
                                outPdf.Save(destFileName);
                            }
                        }
                    }
    
                    File.Delete(oldFileName);
                    File.Delete(newFileName);
                }
                else
                {
                    using (var fileStream = File.Open(destFileName, FileMode.Create))
                    {
                        responseStream?.CopyTo(fileStream);
                        responseStream?.Close();
                        fileStream.Close();
                    }
                }
            }
            catch (WebException e)
            {
                Console.WriteLine(@"Error: {0}", e.Status);
            }
        }
    

    【讨论】:

    • 您能否添加说明,说明您所做的更改以及解决问题的原因?
    • 我首先检查文件是否存在(这意味着货物将有多个标签)。如果没有,则正常处理。如果是,则将该文件读入新的 pdf 文件。然后将当前响应流的内容读入第二个新的 pdf 文件。然后我删除目标文件,释放新组合 pdf 的名称。然后我使用建议的 PDFSharp 链接并合并页面并保存为原始文件名。无论生成多少包标签,这都将启用文件的连续附加。
    • 点击答案下方的“编辑”链接并将其添加到您的代码上方。
    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2019-04-03
    • 2018-12-06
    • 2019-08-15
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多