gpt4 book ai didi

html - 使用 itextsharp 转换为 pdf 时不考虑字体大小和图像大小

转载 作者:行者123 更新时间:2023-11-28 10:59:10 38 4
gpt4 key购买 nike

我有一些代码可以使用 iTextSharp 将 HTML 转换为 PDF,但是,当我查看 PDF 时,字体大小和图像大小与 HTML 中指定的不同。

我的代码如下 - 任何帮助将不胜感激:

Public Function RenderPdf() As MemoryStream

Dim file As New MemoryStream()
Dim document As New iTextSharp.text.Document(Me.PageSize)
Dim writer As PdfWriter = PdfWriter.GetInstance(document, file)
document.Open()

Dim tagProcessors As DefaultTagProcessorFactory = Tags.GetHtmlTagProcessorFactory()
tagProcessors.RemoveProcessor(HTML.Tag.IMG) 'remove the default processor
tagProcessors.AddProcessor(HTML.Tag.IMG, New CustomImageTagProcessor()) 'use our new processor


Using document
'render each page that has been added
For Each page As HtmlPdfPage In Me._Pages
document.NewPage()

'generate this page of text
Dim output As New MemoryStream()
Dim html As New StreamWriter(output, Encoding.UTF8)

Dim sr As New StringReader(page._Html.ToString())

Dim cssFiles As New CssFilesImpl()
cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS())
Dim cssResolver As New StyleAttrCSSResolver(cssFiles)
Dim charset = Encoding.UTF8

Dim hpc As New HtmlPipelineContext(New CssAppliersImpl(New XMLWorkerFontProvider()))
hpc.SetAcceptUnknown(True).AutoBookmark(True).SetTagFactory(tagProcessors) 'inject the tagProcessors
Dim htmlPipeline As New pipeline.html.HtmlPipeline(hpc, New PdfWriterPipeline(document, writer))
Dim pipeline As New CssResolverPipeline(cssResolver, htmlPipeline)
Dim worker As New XMLWorker(pipeline, True)
Dim xmlParser As New iTextSharp.tool.xml.parser.XMLParser(True, worker, charset)
xmlParser.Parse(sr)

Next

'return the rendered PDF
Return file
End Using

End Function


Public Class CustomImageTagProcessor
Inherits iTextSharp.tool.xml.html.Image
Public Overrides Function [End](ctx As IWorkerContext, tag As Tag, currentContent As IList(Of IElement)) As IList(Of IElement)
Dim attributes As IDictionary(Of String, String) = tag.Attributes
Dim src As String
If Not attributes.TryGetValue(HTML.Attribute.SRC, src) Then
Return New List(Of IElement)(1)
End If

If String.IsNullOrEmpty(src) Then
Return New List(Of IElement)(1)
End If

If src.StartsWith("data:image/", StringComparison.InvariantCultureIgnoreCase) Then
' data:[<MIME-type>][;charset=<encoding>][;base64],<data>
Dim base64Data = src.Substring(src.IndexOf(",") + 1)
Dim imagedata = Convert.FromBase64String(base64Data)
Dim image = iTextSharp.text.Image.GetInstance(imagedata)

Dim list = New List(Of IElement)()
Dim htmlPipelineContext = GetHtmlPipelineContext(ctx)
list.Add(GetCssAppliers().Apply(New Chunk(DirectCast(GetCssAppliers().Apply(image, tag, htmlPipelineContext), iTextSharp.text.Image), 0, 0, True), tag, htmlPipelineContext))
Return list
Else
Return MyBase.[End](ctx, tag, currentContent)
End If
End Function
End Class

示例 HTML 是:

<html>
<head>
<style id="mceDefaultStyles" type="text/css">
//<![CDATA[
.mce-content-body div.mce-resizehandle {position: absolute;border: 1px solid black;background: #FFF;width: 5px;height: 5px;z-index: 10000}.mce-content-body .mce-resizehandle:hover {background: #000}.mce-content-body img[data-mce-selected], hr[data-mce-selected] {outline: 1px solid black;resize: none}.mce-content-body .mce-clonedresizable {position: absolute;opacity: .5;filter: alpha(opacity=50);z-index: 10000}
img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}

//]]>//
</style>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="http://localhost:60699/Scripts/tinymce/skins/lightgray/content.min.css"
rel="stylesheet" type="text/css" />
</head>
<body>
<style id="mceDefaultStyles" type="text/css">
//<![CDATA[
.mce-content-body div.mce-resizehandle {position: absolute;border: 1px solid black;background: #FFF;width: 5px;height: 5px;z-index: 10000}.mce-content-body .mce-resizehandle:hover {background: #000}.mce-content-body img[data-mce-selected], hr[data-mce-selected] {outline: 1px solid black;resize: none}.mce-content-body .mce-clonedresizable {position: absolute;outline: 1px dashed black;opacity: .5;filter: alpha(opacity=50);z-index: 10000}

//]]>//
</style>
<link href="http://localhost:59372/Call_Scripter/Scripts/tinymce/skins/lightgray/content.min.css"
rel="stylesheet" type="text/css" data-mce-href="http://localhost:59372/Call_Scripter/Scripts/tinymce/skins/lightgray/content.min.css" />
<p>
<br />
</p>
<table width="1000" align="center" class="" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" style="width: 560px; padding-left: 80px;" data-mce-style="width: 560px; padding-left: 80px;">
<strong><span style="font-size: 18px;" data-mce-style="font-size: 18px;">Company Name</span><br />
ABN: 65 999 999 999<br />
PO Box 999<br />
Suburb, State, Postcode Australia<br />
Phone: 02 9999 9999 Fax: 02 9999 9999<br />
Email: anemailaddress@blahblah.com.au<br />
Web: www.blahblah.com.au </strong>
</td>
<td valign="top" rowspan="2">
&nbsp;<strong><span style="font-size: 18px;" data-mce-style="font-size: 18px;">Tax Invoice</span>
</strong>
<table class="" data-mce-selected="1">
<tbody>
<tr>
<td width="170" style="font-weight: bold;" data-mce-style="font-weight: bold;">
Invoice Number:
</td>
<td style="font-weight: bold;" data-mce-style="font-weight: bold;">
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
Sales Order:
</td>
<td>
</td>
</tr>
<tr>
<td>
Invoice Date:
</td>
<td>
</td>
</tr>
<tr>
<td>
ABN:
</td>
<td>
65 090 839 197
</td>
</tr>
<tr>
<td>
Your Reference:
</td>
<td>
</td>
</tr>
<tr>
<td>
<strong>Page 1 of 1</strong>
</td>
<td>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td valign="bottom" style="padding-left: 160px;" data-mce-style="padding-left: 160px;">
<strong></strong>Australia
</td>
</tr>
<tr>
<td style="padding-right: 25px;" colspan="2" data-mce-style="padding-right: 25px;">
<hr style="background: rgb(0, 0, 0); width: 100%; height: 2px; color: rgb(0, 0, 0);
border-top-color: rgb(0, 0, 0); border-top-width: 1px; border-top-style: solid;
display: block;" data-mce-style="display: block; width: 100%; height: 2px; background: transparent; background-color: #000; border-top: solid 1px #000; color: #000;" />
</td>
</tr>
<tr>
<td align="right" valign="top" style="width: 560px; height: 900px; padding-left: 80px;"
colspan="2" data-mce-style="width: 560px; padding-left: 80px; height: 900px;">
<table class="" style="width: 920px;" data-mce-selected="1" data-mce-style="width: 920px;">
<tbody>
<tr>
<td>
<strong>Product</strong>
</td>
<td>
<strong>Item Description</strong>
</td>
<td align="center">
<strong>Qty</strong>
</td>
<td align="right">
<strong>Unit Price (Ex GST)</strong>
</td>
<td style="padding-left: 10px;" data-mce-style="padding-left: 10px;">
<strong>Unit</strong>
</td>
<td align="right">
<strong>Discount</strong>
</td>
<td align="right">
<strong>Net Amount</strong>
</td>
<td align="right">
<strong>GST</strong>
</td>
<td align="right">
<strong>Total</strong>
</td>
</tr>
<tr>
<td>
</td>
<td style="width: 220px;" data-mce-style="width: 220px;">
</td>
<td align="center">
1
</td>
<td align="right">
</td>
<td>
</td>
<td>
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td align="right" style="font-weight: bold;" colspan="2" data-mce-style="font-weight: bold;">
<table align="right" class="" style="width: 450px;" data-mce-selected="1" data-mce-style="width: 450px;">
<tbody>
<tr>
<td>
Total Page 1
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
</tr>
<tr>
<td>
Grand Total AUD
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
</tr>
<tr>
<td>
</td>
<td align="center" style="text-align: left;" colspan="2" data-mce-style="text-align: left;">
Balance Owing
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
$0.00
</td>
</tr>
<tr>
<td>
</td>
<td align="center" style="text-align: left;" colspan="2" data-mce-style="text-align: left;">
PAID IN FULL
</td>
<td align="right" style="width: 100px;" data-mce-style="width: 100px;">
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td style="padding-right: 25px;" colspan="2" data-mce-style="padding-right: 25px;">
<hr style="background: rgb(0, 0, 0); width: 100%; height: 2px; color: rgb(0, 0, 0);
border-top-color: rgb(0, 0, 0); border-top-width: 1px; border-top-style: solid;
display: block;" data-mce-style="display: block; width: 100%; height: 2px; background: transparent; background-color: #000; border-top: solid 1px #000; color: #000;" />
</td>
</tr>
</tbody>
</table>
<p>
</p>
</body>
</html>

最佳答案

我最终放弃了 iTextSharp 以进行 HTML 到 PDF 的转换,而是使用了这个解决方案 https://github.com/gmanny/Pechkin - 这意味着我可以用 1 行代码生成我的 PDF,并且 PDF 完美输出!

关于html - 使用 itextsharp 转换为 pdf 时不考虑字体大小和图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520048/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com