- 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/
下面的代码正确地将值“foo”分配给命名字段,但该字段没有被“展平”。我一定是忽略了一个步骤,但我不知道它是什么。请指教。谢谢。 public byte[] FlattenSpecifiedFormF
我正在使用 iTextSharp 通过 C# 将页码添加到 PDF。在运行代码分析时,怀疑输出的 MemoryStream 被处理了不止一次。 See this warning generated b
我正在使用 iTextSharp 填写 PDF 上的一些表单域。 PdfReader pdfReader = new PdfReader(templateFile); //http://stackov
我正在使用 ColdFusion 11 和 Java (com.lowagie.text.pdf.PdfStamper) 来填写 pdf,但是当我输入一个带有单个撇号的值时,例如 32' 它仅在 pd
我现在迷路了。 我试图完成的是在另一个(如水印)上添加一个 PDF。 问题是我似乎不明白使用的坐标系,因为 我的水印表现出乎意料。 这两个 PDF 具有不同的尺寸。 我的目标具有以下维度: 595高度
我使用 iText 5.4 PDFStamper 在我的 PDF 文档上使用以下代码进行数字签名: stamper = PdfStamper.createSignature(reader, os, '
我有下面的iText代码来读取文件并将其添加到主PDF文件中,所以它基本上是在现有PDF的绝对位置添加PDF页面。主 PDF 中的绝对位置和页码将动态确定。有时,它可能位于第 1 页上的 100,10
我正在尝试将新页面添加到 PdfStamper,但此代码不会将模板 pdf 字段添加到压模。 private void InsertNewPage(PdfStamper stamper, int pa
我正在开发一个系统,我必须在其中将一些图像添加到现有的 PDF 文档中。 这适用于 iText 5.1.3,但由于某种原因,在包含扫描图像的 PDF 中,它不会添加任何图像。 这是 PDF Docum
我这里指的是下面的方法。(Link 了解更多详情) public void setEncryption(boolean strength, Stri
我有这个代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws Servle
为什么 PdfStamper 会增加我每次使用的签名 pdf 的大小? 这是我的代码: private static void test(String src, String pwd, String
您好,我已经成功地使用 HTMLWorker 使用 asp.NET/C# 转换 gridview。 (1) 我已对生成的表格应用了一些有限的样式,但看不到如何应用表格样式(例如网格线)或应用其他格式样
我正在使用 PdfStamper 在运行时创建 PDF。我的问题是我无法增加 PDF 字段的字体大小。我已经试过了,但没有成功, stamper.AcroFields.SetFieldProperty
我可以使用 PDFStamper 和 PdfContentByte content.AddImage 方法将图像叠加到现有 PDF 文档上。 当现有文档顶部已覆盖图像时,我的问题就出现了。您实际上可以
我几乎(我认为)能够在不先保存的情况下使用 servlet 呈现 PDF。我已经能够成功设置它,但我一直坚持尝试在客户端浏览器中使用打印对话框打开 PDF。 我已经能够通过以下方式成功将我的 PDF
我正在使用 ITextSharp 将多页 PDF 文件拆分为单页文件。我还设法使用 MemoryStream 将这些单页 PDF 添加到 zip 文件中。 现在,我需要使用 PdfStamper 为这
这是我第一次使用 iText5 for .NET,到目前为止,除了一项任务外,一切都相当成功。 我创建了两个 VB.Net 类,每个类都成功返回一个有效的 MemoryStream,其中包含一个单页
我正在使用 iTextSharp 加载现有 PDF 并使用 PdfStamper 添加文本。我想要完全控制文本,这意味着我想要能够控制字体(仅 TrueType)、字体大小和坐标。现在,我正在使用 S
我正在尝试在我的应用程序中使用 iText 2.1.7。我将问题确定为以下代码: InputStream inputFile = ... OutputStream outputStream = ...
我是一名优秀的程序员,十分优秀!