将PDF文件转换为HTML格式
Aspose.PDF for C++ 提供了许多功能,可以将各种文件格式转换为PDF文档,并将PDF文件转换为各种输出格式。本文讨论了如何将PDF文件转换为HTML。Aspose.PDF for C++ 提供了使用InLineHtml方法将HTML文件转换为PDF格式的功能。我们收到许多关于将PDF文件转换为HTML格式的功能请求,并提供了此功能。请注意,此功能还支持XHTML 1.0。
Aspose.PDF for C++ 支持将PDF文件转换为HTML的功能。 主要任务如下,您可以使用 Aspose.PDF 库完成:
- 将 PDF 转换为 HTML;
- 将输出拆分为多页 HTML;
- 指定用于存储 SVG 文件的文件夹;
- 在转换过程中压缩 SVG 图像;
- 指定图像文件夹;
- 仅创建包含正文内容的后续文件;
- 透明文本渲染;
- PDF 文档层渲染。
Aspose.PDF for C++ 提供了一个两行代码,用于将源 PDF 文件转换为 HTML。SaveFormat enumeration
包含值 Html,允许您将源文件保存为 HTML。以下代码片段显示了将 PDF 文件转换为 HTML 的过程。
void ConvertPDFtoHTML()
{
std::clog << __func__ << ": Start" << std::endl;
// 路径名的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 文件名的字符串
String infilename("sample.pdf");
String outfilename("PDFToHTML.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
try {
// 以 HTML 格式保存输出
document->Save(outfilename, SaveFormat::Html);
}
catch (Exception ex) {
std::cerr << ex->get_Message() << std::endl;
}
std::clog << __func__ << ": Finish" << std::endl;
}
将输出拆分为多页HTML
当将包含多个页面的大型PDF文件转换为HTML格式时,输出显示为单个HTML页面。它可能会变得非常长。为了控制页面大小,可以在PDF到HTML转换过程中将输出拆分为多个页面。请尝试使用以下代码片段。
void ConvertPDFtoHTML_SplittingOutputToMultiPageHTML()
{
std::clog << __func__ << ": Start" << std::endl;
// 路径名称的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 文件名的字符串
String infilename("sample.pdf");
String outfilename("PDFToHTML.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
// 实例化HTML保存选项对象
auto htmlOptions = MakeObject<HtmlSaveOptions>();
// 指定将输出拆分为多个页面
htmlOptions->set_SplitIntoPages(true);
try {
// 以HTML格式保存输出
document->Save(_dataDir + outfilename, htmlOptions);
}
catch (Exception ex) {
std::cerr << ex->get_Message() << std::endl;
}
std::clog << __func__ << ": Finish" << std::endl;
}
指定存储SVG文件的文件夹
在PDF到HTML的转换过程中,可以指定SVG图像应保存到的文件夹。使用HtmlSaveOption class
SpecialFolderForSvgImages property
来指定一个特殊的SVG图像目录。此属性获取或设置在转换过程中遇到的SVG图像必须保存到的目录路径。如果参数为空或为null,那么任何SVG文件将与其他图像文件一起保存。
void ConvertPDFtoHTML_SpecifyFolderForStoringSVGfiles()
{
std::clog << __func__ << ": Start" << std::endl;
// 路径名称的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 文件名的字符串
String infilename("sample.pdf");
String outfilename("SaveSVGFiles_out.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
// 实例化HTML保存选项对象
auto htmlOptions = MakeObject<HtmlSaveOptions>();
// 指定在PDF到HTML转换过程中保存SVG图像的文件夹
htmlOptions->SpecialFolderForSvgImages = (_dataDir + String("\\svg\\"));
// 以HTML格式保存输出
document->Save(_dataDir + outfilename, htmlOptions);
std::clog << __func__ << ": Finish" << std::endl;
}
在转换过程中压缩SVG图像
要在将PDF转换为HTML的过程中压缩SVG图像,请尝试使用以下代码:
void ConvertPDFtoHTML_CompressingSVGimages()
{
std::clog << __func__ << ": Start" << std::endl;
// 路径名称的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 文件名称的字符串
String infilename("sample.pdf");
String outfilename("PDFToHTML.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
// 实例化HTML保存选项对象
auto htmlOptions = MakeObject<HtmlSaveOptions>();
// 指定在PDF到HTML转换过程中保存SVG图像的文件夹
htmlOptions->SpecialFolderForSvgImages = (_dataDir + String("\\svg\\"));
// 以HTML格式保存输出
document->Save(_dataDir + outfilename, htmlOptions);
std::clog << __func__ << ": Finish" << std::endl;
}
指定图像文件夹
我们还可以指定在PDF转换为HTML的过程中图像将被保存到的文件夹:
void ConvertPDFtoHTML_SpecifyFolderForStoringAllImages()
{
std::clog << __func__ << ": Start" << std::endl;
// 路径名称的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 文件名称的字符串
String infilename("sample.pdf");
String outfilename("PDFToHTML.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
// 实例化HTML保存选项对象
auto htmlOptions = MakeObject<HtmlSaveOptions>();
// 指定在PDF到HTML转换期间保存所有图像的文件夹
htmlOptions->SpecialFolderForAllImages = (_dataDir + String("\\images\\"));
// 保存输出为HTML格式
document->Save(_dataDir + outfilename, htmlOptions);
std::clog << __func__ << ": Finish" << std::endl;
}
Create Subsequent Files with Body Contents Only
最近,我们被要求引入一个功能,将PDF文件转换为HTML,并且用户可以仅获取每页的<body>
标签的内容。 这将生成一个包含 CSS、<html>
、<head>
详细信息的文件,以及其他文件中的所有页面仅包含 <body>
内容。
为了满足此要求,在 HtmlSaveOptions 类中引入了一个新属性 HtmlMarkupGenerationMode。
使用以下简单代码片段,您可以将输出 HTML 拆分为页面。在输出页面中,所有 HTML 对象必须准确定位在它们当前的位置(字体处理和输出、CSS 创建和输出、图像创建和输出),只是输出 HTML 将包含当前放置在标签内的内容(现在将省略“body”标签)。然而,使用这种方法时,链接到 CSS 是您的代码的责任,因为诸如将被剥离。为此,您可以通过 File.ReadAllText() 读取 CSS 并通过 AJAX 发送到一个网页,在该网页上将由 jQuery 应用。
void ConvertPDFtoHTML_CreateSubsequentFilesWithBodyContentsOnly()
{
std::clog << __func__ << ": Start" << std::endl;
// 用于路径名称的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 用于文件名的字符串
String infilename("sample.pdf");
String outfilename("CreateSubsequentFiles_out.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
// 实例化 HTML 保存选项对象
auto htmlOptions = MakeObject<HtmlSaveOptions>();
htmlOptions->HtmlMarkupGenerationMode = HtmlSaveOptions::HtmlMarkupGenerationModes::WriteOnlyBodyContent;
htmlOptions->set_SplitIntoPages(true);
// 以 HTML 格式保存输出
document->Save(_dataDir + outfilename, htmlOptions);
std::clog << __func__ << ": Finish" << std::endl;
}
透明文本渲染
如果源/输入 PDF 文件包含被前景图像遮挡的透明文本,则可能会出现文本渲染问题。因此,为了应对这种情况,可以使用 SaveShadowedTextsAsTransparentTexts 和 SaveTransparentTexts 属性。
void ConvertPDFtoHTML_TransparentTextRendering()
{
std::clog << __func__ << ": Start" << std::endl;
// 路径名称的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 文件名的字符串
String infilename("sample.pdf");
String outfilename("TransparentTextRendering_out.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
// 实例化 HTML 保存选项对象
auto htmlOptions = MakeObject<HtmlSaveOptions>();
htmlOptions->HtmlMarkupGenerationMode = HtmlSaveOptions::HtmlMarkupGenerationModes::WriteOnlyBodyContent;
htmlOptions->SaveShadowedTextsAsTransparentTexts = true;
htmlOptions->SaveTransparentTexts = true;
// 以 HTML 格式保存输出
document->Save(_dataDir + outfilename, htmlOptions);
std::clog << __func__ << ": Finish" << std::endl;
}
PDF 文档层渲染
我们可以在 PDF 转 HTML 转换过程中,将 PDF 文档层渲染到单独的层类型元素中:
void ConvertPDFtoHTML_DocumentLayersRendering()
{
std::clog << __func__ << ": Start" << std::endl;
// 路径名称的字符串
String _dataDir("C:\\Samples\\Conversion\\");
// 文件名称的字符串
String infilename("sample.pdf");
String outfilename("LayersRendering_out.html");
// 打开文档
auto document = MakeObject<Document>(_dataDir + infilename);
// 实例化 HTML 保存选项对象
auto htmlOptions = MakeObject<HtmlSaveOptions>();
// 指定在输出 HTML 中单独渲染 PDF 文档层
htmlOptions->set_ConvertMarkedContentToLayers(true);
// 将输出保存为 HTML 格式
document->Save(_dataDir + outfilename, htmlOptions);
std::clog << __func__ << ": Finish" << std::endl;
}