- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我已经成功地使用 HTMLWorker 使用 asp.NET/C# 转换 gridview。
(1) 我已对生成的表格应用了一些有限的样式,但看不到如何应用表格样式(例如网格线)或应用其他格式样式(例如特定列的大列宽)。(2) 实际上,我想将此文本放到一个包含 Logo 等的预先存在的模板上。我之前为此使用过 PDF Stamper,但看不出如何同时使用 PDFStamper 和 HTMLWorker。 HTMLWorker 需要一个实现 iDocListener 的文档……但这似乎与使用 PDFStamper 不兼容。我想我正在寻找的是一种创建 PDFStamper、编写标题等,然后从网格中添加已解析 HTML 的方法。另一个问题是解析后的内容不与页面上的其他内容交互。例如下面我向页面添加了一个标题 block 。解析后的 HTML 不是从它下面开始,而是写在上面。我如何将已解析的 HTML 内容与 PDF 文档中的其余内容进行放置/交互?
提前致谢罗布
这是我已有的代码
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 30f, 0f);
HTMLWorker htmlWorker = new HTMLWorker(pdfDoc);
StyleSheet styles = new StyleSheet();
styles.LoadTagStyle("th", "size", "12px");
styles.LoadTagStyle("th", "face", "helvetica");
styles.LoadTagStyle("span", "size", "10px");
styles.LoadTagStyle("span", "face", "helvetica");
styles.LoadTagStyle("td", "size", "10px");
styles.LoadTagStyle("td", "face", "helvetica");
htmlWorker.SetStyleSheet(styles);
PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream);
pdfDoc.Open();
//Title - but this gets obsured by data, doesnt move it down
Font font = new Font(Font.FontFamily.HELVETICA, 14, Font.BOLD);
Chunk chunk = new Chunk(title, font);
pdfDoc.Add(chunk);
//Body
htmlWorker.Parse(sr);
最佳答案
首先让我给您几个链接,您有机会可以查看一下:
这些答案更深入地探讨了正在发生的事情,我建议您在有机会时阅读它们。特别是第二个会告诉你为什么你需要使用 pt
而不是 px
.
为了回答您的第一个问题,让我向您展示一种使用 HTMLWorker
的不同方式。类(class)。这个类有一个名为 ParseToList
的静态方法这会将 HTML 转换为 List<IElement>
.该列表中的对象都是 HTML 的 iTextSharp 特定版本。通常你会做 foreach
在这些上,只需将它们添加到文档中,但您可以在添加之前修改它们,这就是您想要做的。下面是采用静态字符串并执行此操作的代码:
string file1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File1.pdf");
using (FileStream fs = new FileStream(file1, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (Document doc = new Document(PageSize.LETTER))
{
using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
{
doc.Open();
//Our HTML
string html = "<table><tr><th>First Name</th><th>Last Name</th></tr><tr><td>Chris</td><td>Haas</td></tr></table>";
//ParseToList requires a StreamReader instead of just a string so just wrap it
using (StringReader sr = new StringReader(html))
{
//Create a style sheet
StyleSheet styles = new StyleSheet();
//...styles omitted for brevity
//Convert our HTML to iTextSharp elements
List<IElement> elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, styles);
//Loop through each element (in this case there's actually just one PdfPTable)
foreach (IElement el in elements)
{
//If the element is a PdfPTable
if (el is PdfPTable)
{
//Cast it
PdfPTable tt = (PdfPTable)el;
//Change the widths, these are relative width by the way
tt.SetWidths(new float[] { 75, 25 });
}
//Add the element to the document
doc.Add(el);
}
}
doc.Close();
}
}
}
希望您可以看到,一旦您可以访问原始 PdfPTable
您可以根据需要对其进行调整。
回答你的第二个问题,如果你想使用正常的 Paragraph
和 Chunk
带有 PdfStamper
的对象那么你需要使用 PdfContentByte
目的。您可以通过以下两种方式之一从压模中获取此内容,或者通过请求位于现有内容“上方”的压模,stamper.GetOverContent(int)
或位于现有内容“下方”的内容,stamper.GetUnderContent(int)
.两个版本都采用一个参数来说明要使用的页面。一旦你有了 PdfContentByte
你可以创建一个 ColumnText
对象绑定(bind)到它并使用这个对象的 AddElement()
添加普通元素的方法。在这样做之前(这会回答您的第三个问题),您需要至少创建一个“列”。当我这样做时,我通常会创建一个基本上覆盖整个页面的页面。 (这部分可能听起来很奇怪,但我们实际上是在制作一个单行单列的表格单元格来添加我们的对象。)
下面是针对 iTextSharp 5.1.1.0 的完整工作 C# 2010 WinForms 应用程序,它展示了上面的所有内容。首先,它会在桌面上创建一个通用 PDF。然后它基于第一个文档创建第二个文档,添加一个段落,然后添加一些 HTML。如有任何问题,请参阅代码中的注释。
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//The two files that we are creating
string file1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File1.pdf");
string file2 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File2.pdf");
//Create a base file to write on top of
using (FileStream fs = new FileStream(file1, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (Document doc = new Document(PageSize.LETTER))
{
using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
{
doc.Open();
doc.Add(new Paragraph("Hello world"));
doc.Close();
}
}
}
//Bind a reader to our first document
PdfReader reader = new PdfReader(file1);
//Create our second document
using (FileStream fs = new FileStream(file2, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (PdfStamper stamper = new PdfStamper(reader, fs))
{
StyleSheet styles = new StyleSheet();
//...styles omitted for brevity
//Our HTML
string html = "<table><tr><th>First Name</th><th>Last Name</th></tr><tr><td>Chris</td><td>Haas</td></tr></table>";
//ParseToList requires a StreamReader instead of just a string so just wrap it
using (StringReader sr = new StringReader(html))
{
//Get our raw PdfContentByte object letting us draw "above" existing content
PdfContentByte cb = stamper.GetOverContent(1);
//Create a new ColumnText object bound to the above PdfContentByte object
ColumnText ct = new ColumnText(cb);
//Get the dimensions of the first page of our source document
iTextSharp.text.Rectangle page1size = reader.GetPageSize(1);
//Create a single column object spanning the entire page
ct.SetSimpleColumn(0, 0, page1size.Width, page1size.Height);
ct.AddElement(new Paragraph("Hello world!"));
//Convert our HTML to iTextSharp elements
List<IElement> elements = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(sr, styles);
//Loop through each element (in this case there's actually just one PdfPTable)
foreach (IElement el in elements)
{
//If the element is a PdfPTable
if (el is PdfPTable)
{
//Cast it
PdfPTable tt = (PdfPTable)el;
//Change the widths, these are relative width by the way
tt.SetWidths(new float[] { 75, 25 });
}
//Add the element to the ColumnText
ct.AddElement(el);
}
//IMPORTANT, this actually commits our object to the PDF
ct.Go();
}
}
}
this.Close();
}
}
}
关于c# - iTextSharp HTMLWorker ParseHTML Tablestyle 和 PDFStamper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8414637/
我已经使用itextsharp dll(v5.5.9.0)从Asp.net Mvc中的HTML生成PDF。在这里,我使用的是HTMLWorker类。我得到的结果符合我的要求。现在工作正常。但它显示为[
我正在使用 java i text 生成 pdf。我的pdf中的一些数据来自html。我正在使用 HTMLWorker.parseToList 来创建它。 我的问题是它忽略了写在 html 标签内的背
Document document = new Document(PageSize.LETTER, 10, 10, 10, 10); StringReader reader = new StringR
我必须从 HTML 源创建 PDF 文件。目前,我正在处理有关输出文件中特殊(抛光)字符的问题,正是因为它们的缺失。 HTML 来源: Test: ąęłóćńśŁÓŃĆŻŹ
我对 HTMLWorker.Parse From iTextSharp 有问题Windows 窗体程序。每次当我执行代码时从 HTMLWorker.Parse 开始,它给出了 objectDispos
我无法在 iText 7 中找到 HTMLWorker、ParseXHtml、Document 和其他相关类(与 iText 5 不同)。谁能告诉我如何使用 iText 7 将 HTML 文件转换为
我使用 Ajax 将 Telerik MVC Editor 的内容作为字符串发送到 Controller :我出来的是: "Hello world! " 在 Controller 中,我使用以下命令将
我有以下一段用于在 Web 应用程序中导出 PDF 的代码,该代码创建带有 2x2 表格单元格的 PDF。 public static void myexport2() throws IOExcept
我正在尝试将 float 属性应用于 itext 中的 div。内容是一个HTML内容 Document document = new Document(PageSize.A4, 36, 72, 10
我正在使用 iTextSharp v.4 合并一大堆 html 文件。它工作正常,直到我需要升级到 iTextSharp v.5。 当我将流读取器(读取 html 文件的内容)传递给 HTMLWork
您好,我已经成功地使用 HTMLWorker 使用 asp.NET/C# 转换 gridview。 (1) 我已对生成的表格应用了一些有限的样式,但看不到如何应用表格样式(例如网格线)或应用其他格式样
我正在使用此代码以 pdf 格式邮寄数据表。但是在使用 html 解析器转换数据时,它显示异常为 Stack Empty。但是我以前做过这个并且它有效,我只是不能指出我现在缺少的东西。请帮忙!!!!!
我的 HTML 字符串有时包含中文单词,并且我的代码在中文单词的位置显示空白 我的 HTML 看起来像这样 Answer choices Percentage Responses 紅
我使用 iTextSharp (V 5.4.2.0) 将 html 页面转换为 pdf。但我希望能够设置一个新页面。 我已经试过了: 和标签 但它不起作用。创建一个 html 页面的最
我是一名优秀的程序员,十分优秀!