Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用itextsharp 5.5.5.0版将html页面转换为pdf文件_C#_.net_Pdf_Itext - Fatal编程技术网

C# 使用itextsharp 5.5.5.0版将html页面转换为pdf文件

C# 使用itextsharp 5.5.5.0版将html页面转换为pdf文件,c#,.net,pdf,itext,C#,.net,Pdf,Itext,我想将HTML页面转换为PDF页面。我有一个windows应用程序 我看了很多文章,但没有找到任何正确的解决方案。我还面临图像路径问题和其他一些问题,如输入字符串的格式不正确。请帮助我找到解决方案,以便我可以在windows应用程序中使用它 我正在使用以下代码 Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click Dim document As New Document()

我想将HTML页面转换为PDF页面。我有一个windows应用程序

我看了很多文章,但没有找到任何正确的解决方案。我还面临图像路径问题和其他一些问题,如输入字符串的格式不正确。请帮助我找到解决方案,以便我可以在windows应用程序中使用它

我正在使用以下代码

Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
    Dim document As New Document()
    Try
        PdfWriter.GetInstance(document, New FileStream(AppDomain.CurrentDomain.BaseDirectory + "\SCRA_Resources\SCRA.pdf", FileMode.Create))
        document.Open()
        Dim wc As New WebClient()
        Dim htmlText As String = wc.DownloadString(AppDomain.CurrentDomain.BaseDirectory + "\SCRA_Resources\SCRA.html")
        Dim htmlarraylist = HTMLWorker.ParseToList(New StringReader(htmlText), Nothing)
        For k As Integer = 0 To htmlarraylist.Count - 1
            document.Add(DirectCast(htmlarraylist(k), IElement))
        Next
        document.Close()
    Catch
    End Try
End Sub
当我运行这段代码时,我发现错误:找不到文件“C:\TestProjects\MergePDfs\MergePDfs\bin\Debug\help.gif”


我把这些图片放在保存html文件的地方。但是html工作人员在之前剪切了两个文件夹的路径。而且它也没有完全使用CSS。

让我看看你的代码,解释一些事情

首先扔掉你的
试试
抓捕
,避免以后再使用它们。听起来很奇怪,我知道。但从技术上讲,代码中的所有内容都是“试试这个”,因为每一行代码都可能失败。使用实际的
Try
命令的唯一原因是如果您有一个有效的
Catch
块,它实际上做了一些有用的事情。日志记录是一回事。显示错误消息是另一种情况,但由于您在VS中,这已经包括在内

接下来是这两行:

Dim htmlText As String = wc.DownloadString(AppDomain.CurrentDomain.BaseDirectory + "\SCRA_Resources\SCRA.html")
Dim htmlarraylist = HTMLWorker.ParseToList(New StringReader(htmlText), Nothing)
第一行的右半部分是“从一个非常特定的位置获取一些HTML”,左半部分是“并将其作为一个完全不知道原始特定位置的字符串放入变量”。如果没有意义,请读几遍,因为它应该解释为什么第二行找不到图像

你的图片链接都是相对的,但相对于什么?我知道你希望它是你的特定文件夹,但你实际上没有以任何方式指定它。HTML已经(或者可能已经,我可能已经十年没有这样做了)通过
base
标记实现了这一点,但我不知道iText是否支持这一点。因此,您需要告诉iText“当我说相对时,我指的是相对于此文件夹”

在继续之前,重要的是要了解您使用的是一个非常旧的、官方淘汰的、不再支持的助手类,该类缺少许多功能,最终会给您带来很多麻烦。多年前,
HTMLWorker
类被
XMLWorker
类取代。虽然
HTMLWorker
类听起来更合适,但可以将
XMLWorker
看作是“XHTML”而不是“XML”

好的,如果您无法使用
HTMLWorker
,可以通过实现
iTextSharp.text.html.simpleparser.IImageProvider
接口来解决这个问题。如果您这样做并且正在使用5.x系列,您应该希望得到一系列警告,因为如上所述,
HTMLWorker
已被正式淘汰。将为文档中的每个图像调用此接口的
GetImage
方法。下面是一个非常简单的实现,它为指定新位置的构造函数提供了一个参数。理想情况下,您应该添加一些错误处理(这是
Try\Catch
的一个很好的候选者,因为您的
Catch
可能包含一个明确的“未找到图像的图像”),如果您有绝对图像和相对图像的混合,您也应该检查这一点

Public Class RelativeRootImageProvider
    Implements iTextSharp.text.html.simpleparser.IImageProvider

    Public Property BasePath As String

    Public Sub New(basePath As String)
        Me.BasePath = basePath
    End Sub

    Public Function GetImage(src As String,
                             attrs As IDictionary(Of String, String),
                             chain As iTextSharp.text.html.simpleparser.ChainedProperties,
                             doc As IDocListener) As iTextSharp.text.Image Implements iTextSharp.text.html.simpleparser.IImageProvider.GetImage
        ''//This should also check to see if src is absolute and maybe try getting it first before the below.
        ''//The below could also have a File.Exists() check, too.
        Dim newSrc = System.IO.Path.Combine(BasePath, src)
        Return iTextSharp.text.Image.GetInstance(newSrc)
    End Function
End Class
要使用此功能,只需创建一个特殊集合并将其添加到其中:

''//Pick a folder
Dim RelativeImageRootPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)

''//Collection of providers
Dim providers As New System.Collections.Generic.Dictionary(Of String, Object)()

''//Add our image provider pointed to our specific folder
providers.Add(HTMLWorker.IMG_PROVIDER, New RelativeRootImageProvider(RelativeImageRootPath))
然后将提供程序作为
parsetList
方法的第三个参数传递:

Dim htmlarraylist = HTMLWorker.ParseToList(New StringReader(htmlText), Nothing, providers)

您可以共享任何现有代码吗?请共享您尝试过的代码以及您面临问题的特定领域。这是一个很好的起点:确保使用,而不是
HTMLWorker
。如果图像路径有问题,则需要创建自己的
ImageProvider
接口实现(请参见vs以比较工作示例与Oops,它不工作示例)。