iText 7无法设置页边距。

6

我有一个HTML字符串,需要将其转换为PDF,但我需要的PDF必须具有特定的大小和边距。我按照示例所示进行了操作,现在我有了设置的宽度和高度的PDF,但我无法更改或删除边距,请帮助我。

 using (FileStream fs = new FileStream(somePDFFile, FileMode.OpenOrCreate, FileAccess.Write))
            {

                iText.Kernel.Pdf.PdfWriter pdfWriter = new iText.Kernel.Pdf.PdfWriter(fs);

                iText.Kernel.Pdf.PdfDocument pdfDoc = new iText.Kernel.Pdf.PdfDocument(pdfWriter);

                var v = pdfDoc.GetDefaultPageSize().ApplyMargins<iText.Kernel.Geom.Rectangle>(1, 1, 1, 1, true);
                pdfDoc.GetDefaultPageSize().SetWidth(250f);
                pdfDoc.GetDefaultPageSize().SetHeight(200f);
                pdfDoc.GetCatalog().SetLang(new iText.Kernel.Pdf.PdfString("en-US"));
                //Set the document to be tagged
                pdfDoc.SetTagged();



                iText.Html2pdf.ConverterProperties props = new iText.Html2pdf.ConverterProperties();

                iText.Html2pdf.HtmlConverter.ConvertToPdf(htmlString, pdfDoc, props);

                pdfDoc.Close();



            }
1个回答

17

我搜索了答案,但只找到了这种方法:

public void createPdf(String src, String dest) throws IOException {
    ConverterProperties properties = new ConverterProperties();
    properties.setBaseUri(new File(src).getParent());
    List<IElement> elements =
            HtmlConverter.convertToElements(new FileInputStream(src), properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.setTagged();
    Document document = new Document(pdf);
    document.setMargins(100, 50, 50, 100);
    for (IElement element : elements) {
        document.add((IBlockElement)element);
    }
    document.close();
}
换句话说:我将HTML转换为元素列表,然后将这些元素添加到一个文档中,在该文档中我定义了一个边距。

我的首选解决方案将是在<body>标签的级别上定义边距,就像在如何给页面的body设置边距?中所做的那样。不幸的是,我发现目前还不支持这种方式(我已经向iText开发团队提交了一个问题单来解决这个问题)。

我还尝试了convertToDocument()方法,但我无法将immediateFlush设置为false。我也请团队研究了这个问题。

也许还可以引入一个属性,但我不太确定这应该是ConverterProperties属性、PdfDocument属性还是PdfWriter属性。

更新:

您可以使用CSS中的@page规则来定义边距。例如:

<style>
    @page {
        margin-top: 200pt;
    }
</style>

这将创建一个顶部边距为200pt的PDF文档。


工作正常。谢谢,我会问另一件事情,因为也许我在一开始选择了复杂的方式。作为初始数据,我不仅有HTML,还使用非常旧的工具将HTML转换为PDF,但没有任何设置,因此输出为A4格式的PDF和标准边距。但是正如我所说,我需要创建具有自定义宽度、高度和边距的PDF。因此,也许有一种方法可以将现有的A4 PDF文档修改为自定义大小和自定义边距(但我没有找到方法),或者创建一个带有设置的新文档(这很容易),但我没有找到如何将现有PDF内容添加到新文档中。 - Petr Gavrilov
我不确定我是否理解了你的问题。[1.] 你不能从现有的PDF中重新排版内容。这不是iText的问题,而是PDF固有的问题。[2.] 你可以更改现有PDF的页面大小,但内容保持不变。[3.] 你可以将现有PDF的完整页面导入到新的PDF中。我不确定这是否回答了你所有的附加问题。请随意发布一个新问题,详细说明上述三个事项中哪一个适用于你的问题。 - Bruno Lowagie
抱歉我的英语不好,我不是母语使用者。据我所知,如果我将A4大小的PDF调整为300*200,内容将保持不变,并且在这个新矩形中,我将看到原始内容的一部分,内容不会自动调整以适应新比例。另外,如果我有一个只有两行和二维码的A4大小的PDF,我能否将这两行和二维码提取出来,并将其放入具有自定义大小和所有设置的新PDF中,因为我需要一个小矩形的PDF,仅包含此内容而没有多余空白。如果可以,请告诉我如何操作。谢谢。 - Petr Gavrilov
你的问题的第一部分:是的,你理解得很好。内容不会改变;如果你将页面大小缩小,你将“剪辑”现有内容。至于你问题的第二部分:这并非不可能,但很困难。@mkl曾经回答过一个类似的问题,但我找不到那个答案。也许你可以把它作为一个新问题发布,这样mkl就可以回答了。 - Bruno Lowagie
无论如何,非常感谢。我已经找到了解决方案,并且据我所知,如果您需要从HTML创建具有特殊设置的PDF,则这是最佳方法。我将在新帖子中提出关于从一个副本复制到另一个副本的问题。 - Petr Gavrilov
感谢@BrunoLowagie的回答。 - shaishav shukla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接