【问题标题】:Why is flying saucer always printing PDF on A4 paper?为什么飞碟总是在 A4 纸上打印 PDF?
【发布时间】:2017-08-08 22:04:08
【问题描述】:

我正在尝试使用飞碟将 html 文档保存为 PDF,但是当我从 Adob​​e Reader 中查看文档属性时,生成的文档总是以 A4 尺寸结束(页面大小:8.26 x 11.69 英寸)。

我确实阅读了文档,并且传递了 css @page {size: letter;} 样式。虽然它确实对输出有影响,但在 Adob​​e Reader 中页面大小始终保持为 8.26 x 11.69。例如,如果我将页面大小设置为合法,我的 PDF 仍然是 A4 的大小,但文档的顶部丢失,就好像它从“纸”上掉下来一样。

我不确定问题出在 itext 方面还是飞碟方面。我使用的是相当旧的版本,所以我的第一步是升级到最新的 9.1.6 版本的飞碟。我也从 itext 2.0.8 迁移到 openPDF 1.0.1,但我仍然得到相同的行为。

我还在调试器中跟踪到 ITextRenderer 中的 com.lowagie.text.Document 创建,此时传递的文档大小是正确的。这让我认为问题可能出在 openPDF / iText 中,但我找不到我做错了什么。

【问题讨论】:

  • 我使用飞碟 9.1.1 做了一个快速测试,它对我有用。对于size:letter,生成的 PDF 为 21,59 × 27,94 厘米,这是正确的(我在欧洲,我没有英寸值)。你如何通过@page 声明?
  • 感谢您测试@obourgain。我在我的 html 文档的<head> 部分添加了<style type="text/css"> @page { size: letter; } </style>

标签: pdf itext flying-saucer


【解决方案1】:

事实证明,PDF 生成正确地使用了@page size 声明,并且该问题后来在我们的软件中出现。我没有注意到的是,在生成 PDF 之后,调用了另一种方法将多个 PDF 合并为一个。这个方法可能不应该被调用,但那是另一回事了。

底线是这个方法创建了一个new com.lowagie.text.Document(),默认情况下创建一个A4大小的文档,然后遍历pdf的所有页面,使用pdfWriter.getImportedPage(pdfReader, currentPage++)将页面添加到新文档中。这些导入的页面没有保留其原始大小。

我通过在创建合并文档对象时传递第一页的页面大小来修复它:

document = new Document(pdfReader.getPageSize(1));

【讨论】:

    【解决方案2】:

    真正的问题是您(不知不觉地)使用不再受支持的软件。任何仍然具有命名空间 lowagie(iText 的创始人和 CTO)的东西都已经过时了。

    如果你只是想把HTML转成pdf,为什么不直接使用iText,省去中间人呢?

    我们为您提供多种选择。

    1. XMLWorker(将 HTML 转换为 pdf 的基于 iText5 的代码)
    2. pdfHTML(基于 iText7 的插件,可将 HTML5/CSS3 转换为 pdf)

    这是一个使用 pdfHTML 的相当广泛的代码示例:

    public void createPdf(String src, String dest, String resources) throws IOException {
        try {
            FileOutputStream outputStream = new FileOutputStream(dest);
    
            WriterProperties writerProperties = new WriterProperties();
            //Add metadata
            writerProperties.addXmpMetadata();
    
            PdfWriter pdfWriter = new PdfWriter(outputStream, writerProperties);
    
            PdfDocument pdfDoc = new PdfDocument(pdfWriter);
            pdfDoc.getCatalog().setLang(new PdfString("en-US"));
            //Set the document to be tagged
            pdfDoc.setTagged();
            pdfDoc.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
    
            //Set meta tags
            PdfDocumentInfo pdfMetaData = pdfDoc.getDocumentInfo();
            pdfMetaData.setAuthor("Joris Schellekens");
            pdfMetaData.addCreationDate();
            pdfMetaData.getProducer();
            pdfMetaData.setCreator("iText Software");
            pdfMetaData.setKeywords("example, accessibility");
            pdfMetaData.setSubject("PDF accessibility");
            //Title is derived from html
    
            // pdf conversion
            ConverterProperties props = new ConverterProperties();
            FontProvider fp = new FontProvider();
            fp.addStandardPdfFonts();
            fp.addDirectory(resources);//The noto-nashk font file (.ttf extension) is placed in the resources
    
            props.setFontProvider(fp);
            props.setBaseUri(resources);
            //Setup custom tagworker factory for better tagging of headers
            DefaultTagWorkerFactory tagWorkerFactory = new AccessibilityTagWorkerFactory();
            props.setTagWorkerFactory(tagWorkerFactory);
    
            HtmlConverter.convertToPdf(new FileInputStream(src), pdfDoc, props);
            pdfDoc.close();
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    您可以在http://itextpdf.com/itext7/pdfHTML找到更多信息

    【讨论】:

    • 感谢您的回复。我正在尝试以最少的更改来解决现有产品中的问题。升级到最新的 itext 可能会更加努力。不过出于好奇,我们的 2.0.8 许可证是否可以让我们升级到最新版本?
    • 我是一名 iText 开发人员。你必须通过销售来解决这个问题。他们应该很乐意为您提供帮助。
    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多