如何将字符串转换为PDF?

7

目前我在使用asp.net c#中的Restful服务,以下是我得到的pdf字符串返回值,我想将其转换并保存为.pdf文件。我该怎么做?

static string HttpGet(string url)
        {
            HttpWebRequest req = WebRequest.Create(url)
                                 as HttpWebRequest;
            string result = null;
            using (HttpWebResponse resp = req.GetResponse()
                                          as HttpWebResponse)
            {


                StreamReader reader =
                    new StreamReader(resp.GetResponseStream());
                result = reader.ReadToEnd();
            }
            return result;
        }

/****************************** result returned ******************************/ 
%PDF-1.3
%����
3 0 obj
<<
/Linearized 1
/O 5
/H [ 526 186 ]
/L 47163
/E 46840
/N 1
/T 47053
>>
endobj                          
xref
3 11
0000000016 00000 n
0000000436 00000 n
0000000712 00000 n
0000000957 00000 n
0000001056 00000 n
0000001078 00000 n
0000046475 00000 n
0000046502 00000 n
0000046611 00000 n
0000046725 00000 n
0000000526 00000 n
trailer
<<
/Size 14
/Info 1 0 R
/Root 4 0 R
/Prev 47044
>>
startxref
0
%%EOF
4 0 obj
<<
/Type /Catalog
/Pages 2 0 R
>>
endobj

13 0 obj
<<
/Length 104
/P 0
/S 46
>>                   
stream

请查看此解决方案 https://dev59.com/Mabja4cB1Zd3GeqPg3tx - Tola Chhoeun
我也遇到了同样的问题。如何在Angular 8中进行下载? - Farida Anjum
3个回答

10
using (Stream stream = ... fetch the stream from somewhere)
{
    byte[] buffer = new byte[stream.Length];
    stream.Read(buffer, 0, buffer.Length);
    File.WriteAllBytes("foo.pdf", buffer);
}

如果这个RESTful服务是通过HTTP通信的,您可以使用WebClient来进行通信:

using (var client = new WebClient())
{
    client.DownloadFile("http://example.com/api", "foo.pdf");
}

嗨Darin,将字符串转换为PDF是否可能? - DEN
1
@DEN,PDF 是一种二进制格式。我不确定您所说的将字符串转换为 PDF 的意思。您能否请澄清一下? - Darin Dimitrov
我在上面的问题中犯了一个错误。我发布的示例结果返回的是字符串而不是流。或者那是以字符串形式编写的二进制代码,我不确定 :( ,我应该怎么做才能将上述内容转换为PDF文件? - DEN
@DEN,请尝试以下代码:File.WriteAllText("foo.pdf", someString); - Darin Dimitrov
@Darin,我已经成功实现了File.WriteAllText(..),但是当我打开foo.pdf时,它声称“图像数据不足”。为什么?(我已经编辑并展示了获取结果的方法) - DEN
2
@DEN,因为我说过PDF是二进制的。将其作为字符串没有意义。 - Darin Dimitrov

0

我曾经遇到过这种情况,我使用iTextSharp生成PDF并保存在磁盘上解决了它。

public void GeneratePdf(string htmlPdf)
{
    var pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
    var htmlparser = new HTMLWorker(pdfDoc);
    using (var memoryStream = new MemoryStream())
    {
        var writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
        pdfDoc.Open();

        htmlparser.Parse(new StringReader(htmlPdf));
        pdfDoc.Close();

        byte[] bytes = memoryStream.ToArray();
        File.WriteAllBytes(@"C:\file.pdf", bytes);

        memoryStream.Close();
    }
}

-1
在我的情况下,控制器获取保存在数据库中的PDF字节数组。在测试时,当我尝试使用System.Text.Encoding.UTF8.GetString(pdfByte)进行转换时,得到了"%PDF-1.3%����3 0 obj...."的结果。
上述解决方案已经实施,但是下载文件后无法在“Adobe Acrobat”中打开。
我将相同的'pdfByte'传递给下面的方法,成功下载PDF并能够在“Adobe Acrobat”中打开。
我使用iTextSharp.LGPLv2.Core来下载PDF文件,并使用iTextSharp 5.5.13.3来下载PDF。
private FileContentResult DownloadPDF(byte[] pdfByte, string fileName)
{
    byte[] pdf;
    using (var memoryStream = new MemoryStream())
    {
        using (PdfReader reader = new PdfReader(pdfByte))
        {
            var document = new Document(PageSize.A4, 50, 50, 60, 60);
            PdfCopy copy = new PdfSmartCopy(document, memoryStream);
            document.Open();
            copy.AddDocument(reader);
            reader.Close();
            document.Close();
        }
        pdf = memoryStream.ToArray();
    }
    return File(pdf, "application/pdf", fileName + ".pdf");
}

Or

private FileContentResult DownloadPdfFile(byte[] pdfByte, string fileName)
{
    byte[] pdf;
    var memoryStream = new MemoryStream();
    PdfReader reader = new PdfReader(pdfByte);
    var document = new Document(PageSize.A4, 50, 50, 60, 60);
    PdfCopy copy = new PdfSmartCopy(document, memoryStream);
    document.Open();
    for (int pagenumber = 1; pagenumber <= reader.NumberOfPages; pagenumber++)
    {
        copy.AddPage(copy.GetImportedPage(reader, pagenumber));
    }
    reader.Close();
    document.Close();
    pdf = memoryStream.ToArray();
    memoryStream.Close();
    return File(pdf, "application/pdf", fileName + ".pdf");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接