如何避免标记为空<;TR<;TD>;使用Itext 5将单元格转换为PDF

如何避免标记为空<;TR<;TD>;使用Itext 5将单元格转换为PDF,itext,tagging,xmlworker,Itext,Tagging,Xmlworker,我使用文本5从html生成PDF作为输入。 作为PDF可访问性的一部分,添加 但是这里所有的空标记和非空标记都是标记。您能帮助我们避免标记非空html标记吗?我想有一种方法可以绕过它,就是遍历输出PDF文档上的StructTree,尝试在没有任何子项的情况下找到您要查找的标记,并将其从父项中删除。我不再使用iText 5,因为它已被弃用(只发布了安全修补程序),但使用iText 7,您可以执行以下操作: private void removeEmptyTag() throws IOExcepti

我使用文本5从html生成PDF作为输入。 作为PDF可访问性的一部分,添加


但是这里所有的空标记和非空标记都是标记。您能帮助我们避免标记非空html标记吗?

我想有一种方法可以绕过它,就是遍历输出PDF文档上的StructTree,尝试在没有任何子项的情况下找到您要查找的标记,并将其从父项中删除。我不再使用iText 5,因为它已被弃用(只发布了安全修补程序),但使用iText 7,您可以执行以下操作:

private void removeEmptyTag() throws IOException {
    final PdfDocument pdfDoc = new PdfDocument(new PdfReader(ORIG),
            new PdfWriter(DEST));
    PdfDictionary catalog = pdfDoc.getCatalog().getPdfObject();
    // Gets the root dictionary
    PdfDictionary structTreeRoot = catalog.getAsDictionary(PdfName.StructTreeRoot);
    manipulate(structTreeRoot);

    pdfDoc.close();
}

public boolean manipulate(PdfDictionary element) {

    if (element == null)
        return false;

    if (PdfName.TD.equals(element.get(PdfName.S))) {
        if (!element.containsKey(PdfName.K)) {
            return true;
        }
    }

    PdfArray kids = element.getAsArray(PdfName.K);
    if (kids == null) return false;
    for (int i = 0; i < kids.size(); i++) {
        if (manipulate(kids.getAsDictionary(i))) {
            kids.remove(i);
        }
    }

    return false;
}
private void removemptytag()引发IOException{
最终PDF文档pdfDoc=新PDF文档(新PDF阅读器(ORIG),
新PdfWriter(DEST));
PdfDictionary catalog=pdfDoc.getCatalog().getPdfObject();
//获取根字典
PdfDictionary structTreeRoot=catalog.getAsDictionary(PdfName.structTreeRoot);
操纵(structureeroot);
pdfDoc.close();
}
公共布尔操作(PdfDictionary元素){
if(元素==null)
返回false;
if(PdfName.TD.equals(element.get(PdfName.S))){
if(!element.containsKey(PdfName.K)){
返回true;
}
}
PdfArray kids=element.getAsArray(PdfName.K);
如果(kids==null)返回false;
对于(int i=0;i
这不是最优雅的东西,但我曾经创建过一个HTML文件,其中有一个空的td


名字
姓氏
年龄
吉尔
史密斯
前夕
杰克逊
94

然后我使用代码遍历它并删除空标记(或者更确切地说,没有子项的标记)。也许有一种直接使用xmlWorker的解决方案(我假设这就是您用来创建HTML文档的方法),或者有一种更好的后处理方法来替代我的建议。

我认为有一种方法可以解决这个问题,那就是遍历输出PDF文档上的StructTree,并尝试找到您要查找的标记,没有孩子,把它从父母那里拿走。我不再使用iText 5,因为它已被弃用(只发布了安全修补程序),但使用iText 7,您可以执行以下操作:

private void removeEmptyTag() throws IOException {
    final PdfDocument pdfDoc = new PdfDocument(new PdfReader(ORIG),
            new PdfWriter(DEST));
    PdfDictionary catalog = pdfDoc.getCatalog().getPdfObject();
    // Gets the root dictionary
    PdfDictionary structTreeRoot = catalog.getAsDictionary(PdfName.StructTreeRoot);
    manipulate(structTreeRoot);

    pdfDoc.close();
}

public boolean manipulate(PdfDictionary element) {

    if (element == null)
        return false;

    if (PdfName.TD.equals(element.get(PdfName.S))) {
        if (!element.containsKey(PdfName.K)) {
            return true;
        }
    }

    PdfArray kids = element.getAsArray(PdfName.K);
    if (kids == null) return false;
    for (int i = 0; i < kids.size(); i++) {
        if (manipulate(kids.getAsDictionary(i))) {
            kids.remove(i);
        }
    }

    return false;
}
private void removemptytag()引发IOException{
最终PDF文档pdfDoc=新PDF文档(新PDF阅读器(ORIG),
新PdfWriter(DEST));
PdfDictionary catalog=pdfDoc.getCatalog().getPdfObject();
//获取根字典
PdfDictionary structTreeRoot=catalog.getAsDictionary(PdfName.structTreeRoot);
操纵(structureeroot);
pdfDoc.close();
}
公共布尔操作(PdfDictionary元素){
if(元素==null)
返回false;
if(PdfName.TD.equals(element.get(PdfName.S))){
if(!element.containsKey(PdfName.K)){
返回true;
}
}
PdfArray kids=element.getAsArray(PdfName.K);
如果(kids==null)返回false;
对于(int i=0;i
这不是最优雅的东西,但我曾经创建过一个HTML文件,其中有一个空的td


名字
姓氏
年龄
吉尔
史密斯
前夕
杰克逊
94

然后我使用代码遍历它并删除空标记(或者更确切地说,没有子项的标记)。也许有一种直接使用xmlWorker的解决方案(我假设这就是您用来创建HTML文档的方法),或者有一种更好的后处理方法代替我的建议。

您可以直接使用(基本上是iText 7中HTML到PDF转换的解决方案)

在上面的代码中,您可以使用为标记定制行为,如中所述。在这个特定的例子中,我只是简单地将空的TD标记更改为Span元素,从而实现所需的行为(多余的TD标记消失)


(说实话,这依赖于TR工作者无法解析SPAN标记,因此它只是跳槽。如果我提出了更优雅的解决方案,我将更新答案)

您可以直接使用(基本上是iText 7中HTML到PDF转换的解决方案)

在上面的代码中,您可以使用为标记定制行为,如中所述。在这个特定的例子中,我只是简单地将空的TD标记更改为Span元素,从而实现所需的行为(多余的TD标记消失)


(老实说,这依赖于TR工作人员无法解析SPAN标记,因此它只是跳槽。如果我提出一个更优雅的解决方案,我将更新答案)

在将html转换为PDF时,是否有任何方法可以避免空标记。我可以看到您的代码在生成PDF后仍能正常工作。我在Itext 7中尝试了上述解决方案,但它在PDF报告中显示了混乱的数据。您能提供PDF文件吗?如何附加PDF文件,我没有任何附加选项。在将html转换为PDF时,有任何方法可以避免空标记。我可以看到您的代码在生成PDF后仍能工作。我在Itext 7中尝试了上述解决方案,但它在PDF报告中显示了混乱的数据。您能提供PDF文件吗?如何附加PDF文件,我没有任何附加选项。显然,您也可以使用xmlWorker()进行自定义处理,因此也可以使用iText 5进行自定义处理。感谢您宝贵的回复。如何使用Itext 5实现同样的效果。很抱歉@NagaSureshBabuP,但我不知道,但根据链接,有一个setTagFactory(),所以在查看特定标记时,您可能会更改行为。您不使用iText 7+pdfHTML有什么原因吗?还是尝试了上面的解决方案,NVDA也读取空空间(empty TD)(例如:)您显然还可以使用xmlWorker()进行自定义处理,所以可能是als
ConverterProperties props = new ConverterProperties();
props.setTagWorkerFactory(new DefaultTagWorkerFactory() {
                @Override
                public ITagWorker getCustomTagWorker(
                        IElementNode tag, ProcessorContext context) {
                    if (tag.name().equals(TagConstants.TD)) {
                        if (!tag.childNodes().isEmpty()) {
                            return new TdTagWorker(tag, context);
                        } else {
                            return new SpanTagWorker(tag, context);
                        }
                    }


                    return null;
                }
            });


PdfDocument doc = new PdfDocument(new PdfWriter(DEST));
doc.setTagged();

HtmlConverter.convertToPdf(new FileInputStream(ORIG), doc, props);