使用 itextsharp 绘制完整的线条
Draw full line using itextsharp
为了从 HTML 到 PDF 的转换,我使用了 wkhtmltopdf
因为 css 支持..但是我想绘制 pdf 页面的完整线宽..我使用了 HR
和 DIV
但它在它之前和之后留下了一些空白,因为我将参数作为 args+= "--margin-top 10mm --margin-bottom 10mm --margin-right 3mm --margin-left 3mm ";
.. 所以我为此使用 ITextsharp.. 但它没有画线
我尝试了以下代码:
PdfContentByte cb;
// DO PAGE NUMBER
byte[] bytes1 = System.IO.File.ReadAllBytes(@"E:\temp\test_QA.pdf");
var FontColour = new BaseColor(97, 123, 149);
iTextSharp.text.Font baseFontNormal = FontFactory.GetFont("Calibri", 9, iTextSharp.text.Font.NORMAL, FontColour);
using (MemoryStream stream = new MemoryStream())
{
PdfReader reader = new PdfReader(bytes1);
var doc = new iTextSharp.text.Document();
PdfWriter writer = PdfWriter.GetInstance(doc, stream);
writer.PageEvent = new iTextEvents();
//Open the document for writing
doc.Open();
cb = writer.DirectContent;
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
cb.MoveTo(0, doc.PageSize.Height - 55);
cb.LineTo(doc.PageSize.Width, doc.PageSize.Height - 55);
cb.SetColorStroke(FontColour);
cb.Stroke();
//Move the pointer and draw line to separate footer section from rest of page
cb.MoveTo(0, doc.PageSize.GetBottom(150));
cb.LineTo(doc.PageSize.Width, doc.PageSize.GetBottom(55));
cb.SetColorStroke(FontColour);
cb.Stroke();
}
bytes1 = stream.ToArray();
System.IO.File.WriteAllBytes(@"E:\download.pdf", bytes1);
//doc.Close();
}
知道这里缺少什么吗?
您同时使用 Document
/PdfWriter
对(创建新 PDF)和 PdfReader
/PdfStamper
对(处理现有 PDF)写入同一个流!你不应该期望它会产生垃圾以外的任何东西。而是仅使用 PdfReader
/PdfStamper
对并更改其 OverContent
.
此外,您的代码在另一个方面是错误的:您首先创建路径(cb.MoveTo
、cb.LineTo
),然后设置颜色(cb.SetColorStroke
),然后尝试使用路径 (cb.Stroke
)。根据 PDF 规范,这将创建无效内容:路径的创建和使用之间不得有其他指令。
因此,使用这样的东西(未经测试,只是在此处的编辑器中更改了代码):
var FontColour = new BaseColor(97, 123, 149);
using (MemoryStream stream = new MemoryStream())
{
using (PdfReader reader = new PdfReader(@"E:\temp\test_QA.pdf"))
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
Rectangle rect = reader.GetPageSize(1);
PdfContentByte cb = stamper.GetOverContent(1);
cb.SetColorStroke(FontColour);
cb.MoveTo(0, rect.Height - 55);
cb.LineTo(rect.Width, rect.Height - 55);
cb.MoveTo(0, rect.GetBottom(150));
cb.LineTo(rect.Width, rect.GetBottom(55));
cb.Stroke();
}
System.IO.File.WriteAllBytes(@"E:\download.pdf", stream.ToArray());
}
为了从 HTML 到 PDF 的转换,我使用了 wkhtmltopdf
因为 css 支持..但是我想绘制 pdf 页面的完整线宽..我使用了 HR
和 DIV
但它在它之前和之后留下了一些空白,因为我将参数作为 args+= "--margin-top 10mm --margin-bottom 10mm --margin-right 3mm --margin-left 3mm ";
.. 所以我为此使用 ITextsharp.. 但它没有画线
我尝试了以下代码:
PdfContentByte cb;
// DO PAGE NUMBER
byte[] bytes1 = System.IO.File.ReadAllBytes(@"E:\temp\test_QA.pdf");
var FontColour = new BaseColor(97, 123, 149);
iTextSharp.text.Font baseFontNormal = FontFactory.GetFont("Calibri", 9, iTextSharp.text.Font.NORMAL, FontColour);
using (MemoryStream stream = new MemoryStream())
{
PdfReader reader = new PdfReader(bytes1);
var doc = new iTextSharp.text.Document();
PdfWriter writer = PdfWriter.GetInstance(doc, stream);
writer.PageEvent = new iTextEvents();
//Open the document for writing
doc.Open();
cb = writer.DirectContent;
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
cb.MoveTo(0, doc.PageSize.Height - 55);
cb.LineTo(doc.PageSize.Width, doc.PageSize.Height - 55);
cb.SetColorStroke(FontColour);
cb.Stroke();
//Move the pointer and draw line to separate footer section from rest of page
cb.MoveTo(0, doc.PageSize.GetBottom(150));
cb.LineTo(doc.PageSize.Width, doc.PageSize.GetBottom(55));
cb.SetColorStroke(FontColour);
cb.Stroke();
}
bytes1 = stream.ToArray();
System.IO.File.WriteAllBytes(@"E:\download.pdf", bytes1);
//doc.Close();
}
知道这里缺少什么吗?
您同时使用 Document
/PdfWriter
对(创建新 PDF)和 PdfReader
/PdfStamper
对(处理现有 PDF)写入同一个流!你不应该期望它会产生垃圾以外的任何东西。而是仅使用 PdfReader
/PdfStamper
对并更改其 OverContent
.
此外,您的代码在另一个方面是错误的:您首先创建路径(cb.MoveTo
、cb.LineTo
),然后设置颜色(cb.SetColorStroke
),然后尝试使用路径 (cb.Stroke
)。根据 PDF 规范,这将创建无效内容:路径的创建和使用之间不得有其他指令。
因此,使用这样的东西(未经测试,只是在此处的编辑器中更改了代码):
var FontColour = new BaseColor(97, 123, 149);
using (MemoryStream stream = new MemoryStream())
{
using (PdfReader reader = new PdfReader(@"E:\temp\test_QA.pdf"))
using (PdfStamper stamper = new PdfStamper(reader, stream))
{
Rectangle rect = reader.GetPageSize(1);
PdfContentByte cb = stamper.GetOverContent(1);
cb.SetColorStroke(FontColour);
cb.MoveTo(0, rect.Height - 55);
cb.LineTo(rect.Width, rect.Height - 55);
cb.MoveTo(0, rect.GetBottom(150));
cb.LineTo(rect.Width, rect.GetBottom(55));
cb.Stroke();
}
System.IO.File.WriteAllBytes(@"E:\download.pdf", stream.ToArray());
}