旧标题:iTextSharp 将 HTML 转换为 PDF“文档没有页面。”
我正在使用 iTextSharp 和 xmlworker 将 html 从视图转换为 ASP.NET Core 2.1 中的 PDF
我尝试了在网上找到的许多代码片段,但都生成了异常:
该文档没有页面。
这是我当前的代码:
public static byte[] ToPdf(string html)
{
byte[] output;
using (var document = new Document())
{
using (var workStream = new MemoryStream())
{
PdfWriter writer = PdfWriter.GetInstance(document, workStream);
writer.CloseStream = false;
document.Open();
using (var reader = new StringReader(html))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader);
document.Close();
output = workStream.ToArray();
}
}
}
return output;
}
Run Code Online (Sandbox Code Playgroud)
更新1
感谢 @Bruno Lowagie 的建议,我升级到了 iText7 和 pdfHTML,但我找不到太多关于它的教程。 …
根据 B\xc3\xb6hm-Jacopini 定理,只需使用三个语句即可编写算法:
\n\n许多老师认为定理是一种信仰行为,他们教导不要使用(goto、jump、break、multiple return 等),因为这些指令是邪恶的。
\n\n但当我要求解释时,没有人能够提供定理的证明。
\n\n就我个人而言,我不认为该定理是错误的,但我认为它在现实世界中的适用性并不总是更好的选择。
\n\n所以我做了一点搜索,这些是我的疑问:
\n\n该定理已经通过流程图结构的归纳得到了证明,但它真的适用于计算机程序吗?
\n根据维基百科“B\xc3\xb6hm 和 Jacopini\ 的算法作为程序转换算法并不真正实用,因此为该方向的进一步研究打开了大门”。
定理的一个结果证明,每个“goto”都可以通过归纳转化为选择或迭代,但是效率呢?\n我找不到任何证据表明每个算法都可以重写并保持相同的性能。
递归,递归算法真的可以仅使用序列、选择和迭代来编写吗?\n我知道某些递归算法可以优化为循环(想想尾递归),但真的可以适用于所有算法吗?
干净的代码,我知道滥用跳转可能会创建出可怕的代码,但我认为在某些情况下正确使用循环中的中断可以提高代码的可读性。
样本:
\n\nn = 0;\nwhile (n < 1000 || (cond1 && cond2) || (cond3 && cond4) || (cond5 && cond6)) \n{ \n n++; \n //The rest of code \n} \nRun Code Online (Sandbox Code Playgroud)\n\n可以重写为:
\n\nfor (n = 0; n < 1000; n++)\n{\n if (cond1 && …Run Code Online (Sandbox Code Playgroud) 我有这个示例查询:
context.BarcodeTipiDoc.AsQueryable().Where(d => d.Barcode.CompareTo(minBarcode) > 0);
Run Code Online (Sandbox Code Playgroud)
该查询运行速度非常慢,因为实体框架为“minBarcode”创建了 SqlParameternvarchar而不是varchar.
我试图设置列映射:
[Column("Barcode", TypeName = "varchar(21)")]
public string Barcode { get; set; }
Run Code Online (Sandbox Code Playgroud)
但什么都没有改变。
有没有办法告诉 Entity Framework sqlparameter 的正确类型?
这个查询几乎是即时的:
DECLARE @__minBarcode_0 AS Varchar(21)
SET @__minBarcode_0 = 'aa'
SELECT TOP(100) [d].[Barcode], [d].[contenttype], [d].[idvolume], [d].[path_documento], [d].[Progressivo], [d].[Stato]
FROM BarcodeTipiDoc AS [d]
WHERE [d].[Barcode] > @__minBarcode_0
Run Code Online (Sandbox Code Playgroud)
由实体框架生成的相同查询,由于 nvarchar 需要几分钟:
DECLARE @__minBarcode_0 AS nvarchar(21)
SET @__minBarcode_0 = 'aa'
SELECT TOP(100) [d].[Barcode], [d].[contenttype], [d].[idvolume], [d].[path_documento], [d].[Progressivo], [d].[Stato]
FROM BarcodeTipiDoc AS [d]
WHERE [d].[Barcode] …Run Code Online (Sandbox Code Playgroud)