【问题标题】:Converting Printable to PDF将可打印文件转换为 PDF
【发布时间】:2013-10-25 16:10:03
【问题描述】:

我正在研究一个用户故事,该故事要求也能够将所有现有的打印输出打印为 PDF。为此,我将java.awt.Printable 渲染为BufferedImage,并使用Apache 的PDFBox 将此图像放入PDF,但使用此方法时我遇到了一些问题:

  • 如果我使用PDJPeg,图像会变得模糊。
  • 如果我使用PDPixelMap,则生成的 PDF 是全黑的。

我能想到的唯一其他方法是创建一个接口,即Printer,然后创建两个子类,即PhysicalPrinterPDFPrinter,但这需要我重新实现所有现有的java.awt.Printables 才能使用这个新界面。

这是我当前打印到 PDF 方法的 SSCCE:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.io.File;
import java.util.Random;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg;

public class Printer {
    private Printer() {}
    public static boolean printToPDF(String file, Printable printable) {
        try {
            PageFormat pageFormat = new PageFormat();
            PDDocument doc = new PDDocument();
            int width = (int)(pageFormat.getWidth());
            int height = (int)(pageFormat.getHeight());

            int currentPage = 0;
            while(true) {
                BufferedImage image = new BufferedImage(width, height,
                                                        BufferedImage.TYPE_INT_RGB);
                Graphics2D g2d = image.createGraphics();
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                     RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setColor(Color.WHITE);
                g2d.fillRect(0, 0, width, height);
                g2d.setColor(Color.BLACK);
                g2d.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12));

                if(printable.print(g2d, pageFormat, currentPage) == Printable.NO_SUCH_PAGE) {
                    break;
                }
                ImageIO.write(image, "png", new File("test.png"));

                PDPage page = new PDPage();
                doc.addPage(page);

                PDJpeg img = new PDJpeg(doc, image); //Blurry
                //PDPixelMap img = new PDPixelMap(doc, image); //Black
                PDPageContentStream content = new PDPageContentStream(doc, page);
                content.drawImage(img, 0, 0);
                content.close();

                ++currentPage;
            }

            doc.save(file);
            doc.close();
        } catch(Exception e) {
            e.printStackTrace();
        }

        return true;
    }
    public static void main(String[] args) {
        Printable printable = new Printable() {
            @Override
            public int print(Graphics g, PageFormat pf, int index) 
            throws PrinterException {
                if(index > 0) {
                    return NO_SUCH_PAGE;
                }

                Graphics2D g2d = (Graphics2D)g;
                g2d.translate(pf.getImageableX(), pf.getImageableY());
                Random rand = new Random();

                for(int i = 0; i < 30; ++i) {
                    int x = rand.nextInt((int)pf.getImageableWidth());
                    int y = rand.nextInt((int)pf.getImageableHeight());

                    g2d.drawString("Test", x, y);
                }

                return PAGE_EXISTS;
            }
        };

        printToPDF("Test.pdf", printable);
    }
}

编辑

我设法解决了黑色PDPixelMap,它使用错误的图像类型归结为BUfferedImage。我将它从BufferedImage.TYPE_INT_RGB 更改为BufferedImage.TYPE_4BYTE_ABGR。不幸的是,生成的 PDF 仍然模糊不清。

【问题讨论】:

标签: java image pdf printing


【解决方案1】:

我认为两个可能对您有所帮助的框架是 ITextPDFRenderer。 IText 在 4.2 版之前是免费的(如果我没记错的话),而 PDFRenderer 是 LGPL 2.1 许可证。例如,最好查看教程,这些教程在网络上很多。我认为两者都是您想要完成的可行解决方案。我个人使用 PDFRenderer。

【讨论】:

  • PDFRenderer 上的文档似乎缺少(不存在?),据我了解,免费版本的 IText 许可证要求披露使用它的项目的源代码。
  • 我会再次查看 IText 许可证,但如果你只是在谷歌上搜索 PDFRenderer 和教程或示例,你会发现一些东西!
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2018-02-13
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多