在生成的PDF中缺少图像

问题描述 投票:0回答:1

我正在尝试通过iText库将HTML页面转换为PDF。我经验不足,无法在PDF中添加图片。

[首先,我阅读了一个HTML模板(用作基础模板)。图像按<img>的位置放置<img src="http://clipartmag.com/image/iron-man-face-drawing-6.png" class="avatar-image">标签。我从该模板检索一个Document类。我将所需的内容添加到Document实例中。完成后,我将检索html并使用它生成PDF。

String resumeFilePath = String.format(RESUME_FILE_PATH, userProfileBean.getFirstname(), userProfileBean.getLastname());
            Document resumeAsHtml = createHtmlDocument(userProfileBean);
            HtmlConverter.convertToPdf(resumeAsHtml.html(), new FileOutputStream(resumeFilePath));
            File newResume = new File(resumeFilePath);

[在测试阶段,我什至单独创建了HTML页面,以查看所有内容-resumeAsHtml.html()。网页上有图像。但是当我打电话

HtmlConverter.convertToPdf(
    resumeAsHtml.html(), new FileOutputStream(resumeFilePath));

创建的PDF缺少图像。我还在日志中得到3个错误:

2019-09-29 10:06:22,678 ERROR c.i.s.c.p.s.CssParserStateController:495 - The rule @keyframes is unsupported. All selectors in this rule will be ignored.
2019-09-29 10:06:22,944 ERROR c.i.s.r.r.ResourceResolver:146 - Unable to retrieve image with given base URI (file:/Users/jklancic/dev/custom/resume/) and image source path (http://clipartmag.com/image/iron-man-face-drawing-6.png)
2019-09-29 10:06:22,947 ERROR c.i.h.a.i.DefaultHtmlProcessor:356 - Worker of type com.itextpdf.html2pdf.attach.impl.tags.DivTagWorker unable to process com.itextpdf.html2pdf.attach.impl.tags.ImgTagWorker

任何想法可能有什么问题吗?这是已经包含图像的模板:

<!DOCTYPE html>
<html>
<head>
<style>

#resume-header {
    margin-bottom: 25px;
}

#resume-body {
}

#clear {
    clear: both;
}

.header-left {
    width: 29%;
    height: 160px;
    float: left;
}

.header-right {
    padding-top: 10px;
    width: 70%;
    height: 160px;
    float: right;
}

.header-right h1,h2,h3 {
    text-align: left;
    font-family: verdana;
}

.header-right h1 {
    color: #4065a3;
    font-size: 34px;
    margin: 5px 0px 15px 0px;
}

.header-right h2 {
    font-size: 22px;
    margin: 5px 0px 5px 0px;
}

.header-right h3 {
    font-size: 10px
}

.avatar-image {
    display: block;
    margin-left: auto;
    margin-right: auto;
    height: 160px;
}

.info {
    margin: 0px 20px 0px 0px;
    font-family: verdana;
    font-size: 10px
}

span.section-header {
    color: #507fcc;
    font-family: verdana;
    font-size: 16px;
    margin: 0px 0px 0px 10px;
}

p.section-title {
    color: #000000;
    font-family: verdana;
    font-size: 12px;
}

p.section-subtitle {
    color: #9aa3b3;
    font-family: verdana;
    font-size: 12px;
    margin-left: 10px;
}

p.text {
    color: #000000;
    font-family: verdana;
    font-size: 10px;
}

ul.list {
    color: #000000;
    font-family: verdana;
    font-size: 10px;
    padding-left: 25px
}

div.web-profile {
    margin-top: 10px;
}

div.section-content {
    margin-bottom: 20px;
}

div.bottom-border {
    border-bottom: 1px solid #507fcc;
}

.primary {
    color: #507fcc;
}

.small-top-margin {
    margin: 2px 0px 0px 0px;
}

.small-bottom-margin {
    margin: 15px 0px 2px 0px;
}

</style>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/all.min.css">

</head>
<body>

<div id="resume-header">
    <div class="header-left">
        <img src="http://clipartmag.com/image/iron-man-face-drawing-6.png" class="avatar-image">
    </div>
    <div class="header-right" id="basic-info">
    </div>
    <div id="clear"></div>
</div>
<div id="resume-body">
    <div class="bottom-border" id="education-section">
        <i class="fas fa-graduation-cap primary"></i><span class="section-header">Education</span>
    </div>

    <div class="bottom-border" id="job-section">
        <i class="fas fa-briefcase primary"></i><span class="section-header">Work</span>
    </div>

    <div class="bottom-border" id="skill-section">
        <i class="fas fa-pencil-ruler primary"></i><span class="section-header">Skills</span>
    </div>

</div>

</body>
</html>
java itext7 html2pdf
1个回答
0
投票

iText有很多错误。不要评论您使用的版本,但是资源加载器有几个问题必须通过重载来解决(它不知道如何从base64装载图像,它不知道如何通过302重定向来装载资源。 ,...)。

在您的特定情况下,指示的错误是:

无法使用给定的基本URI(文件:/ Users / jklancic / dev / custom / resume /)和图像源路径(http://clipartmag.com/image/iron-man-face-drawing-6.png)检索图像

这表明iText正在尝试访问地址“文件:/ Users / jklancic / dev / custom / resume / http://clipartmag.com/image/iron-man-face-drawing-6.png”。在c.i.s.r.r.ResourceResolver:146进行调试以确认。

如果您能够升级到新版本,请尝试这样做,否则,您应使资源加载器过载以进行修复。

请记住,您应该首先确定确切的问题(当前就像一个错误的基本+路径组合问题),无论如何,我解决了实现自定义ITextUserAgent的许多相关问题,如下所示:

final ITextRenderer renderer = new ITextRenderer();
{
    final TextUserAgent userAgent = new TextUserAgent(renderer.getOutputDevice());
    renderer.getSharedContext().setUserAgentCallback(userAgent);
    userAgent.setSharedContext(renderer.getSharedContext());
}

您必须实施自定义TextUserAgent来解决您的特定问题(iText现在不免费):

public class TextUserAgent extends ITextUserAgent {

    public TextUserAgent(ITextOutputDevice outputDevice) {
        super(outputDevice);
    }

    @Override
    public ImageResource getImageResource(final String uri) {
        final ImageResource legacy = super.getImageResource(uri);
        if (legacy != null && legacy.getImage() != null) {
            return legacy;
        }
        return alternativeImageResource(uri);
    }
...
© www.soinside.com 2019 - 2024. All rights reserved.