Java Itext PDF打印,打印文件被Java锁定

用户5281858

我有一个问题,我的代码将PDF转换为可打印的格式,从而锁定了我的pdf文件。

我的代码:

public class PDFPrinter {

public PDFPrinter(File file) {
    try {
        FileInputStream fis = new FileInputStream(file);
        FileChannel fc = fis.getChannel();
        ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
        fis.close();
        fc.close();
        PDFFile pdfFile = new PDFFile(bb); // Create PDF Print Page
        PDFPrintPage pages = new PDFPrintPage(pdfFile);

        // Create Print Job
        PrinterJob pjob = PrinterJob.getPrinterJob();
        PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
        Paper a4paper = new Paper();
        double paperWidth = 8.26;
        double paperHeight = 11.69;
        a4paper.setSize(paperWidth * 72.0, paperHeight * 72.0);

        /*
         * set the margins respectively the imageable area
         */
        double leftMargin = 0.3;
        double rightMargin = 0.3;
        double topMargin = 0.5;
        double bottomMargin = 0.5;

        a4paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0,
                (paperWidth - leftMargin - rightMargin) * 72.0,
                (paperHeight - topMargin - bottomMargin) * 72.0);
        pf.setPaper(a4paper);

        pjob.setJobName(file.getName());
        Book book = new Book();
        book.append(pages, pf, pdfFile.getNumPages());
        pjob.setPageable(book);

        // Send print job to default printer
        if (pjob.printDialog()) {
            pjob.print();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (PrinterException e) {
        JOptionPane.showMessageDialog(null, "Printing Error: "
                + e.getMessage(), "Print Aborted",
                JOptionPane.ERROR_MESSAGE);
        e.printStackTrace();
    }
}

class PDFPrintPage implements Printable {
    private PDFFile file;

    PDFPrintPage(PDFFile file) {
        this.file = file;
    }

    public int print(Graphics g, PageFormat format, int index)
            throws PrinterException {
        int pagenum = index + 1;

        // don't bother if the page number is out of range.
        if ((pagenum >= 1) && (pagenum <= file.getNumPages())) {
            // fit the PDFPage into the printing area
            Graphics2D g2 = (Graphics2D) g;
            PDFPage page = file.getPage(pagenum);
            double pwidth = format.getImageableWidth();
            double pheight = format.getImageableHeight();

            double aspect = page.getAspectRatio();
            double paperaspect = pwidth / pheight;

            Rectangle imgbounds;

            if (aspect > paperaspect) {
                // paper is too tall / pdfpage is too wide
                int height = (int) (pwidth / aspect);
                imgbounds = new Rectangle(
                        (int) format.getImageableX(),
                        (int) (format.getImageableY() + ((pheight - height) / 2)),
                        (int) pwidth, height);
            } else {
                // paper is too wide / pdfpage is too tall
                int width = (int) (pheight * aspect);
                imgbounds = new Rectangle(
                        (int) (format.getImageableX() + ((pwidth - width) / 2)),
                        (int) format.getImageableY(), width, (int) pheight);
            }

            // render the page
            PDFRenderer pgs = new PDFRenderer(page, g2, imgbounds, null,
                    null);
            try {
                page.waitForFinish();
                pgs.run();
            } catch (InterruptedException ie) {
            }

            return PAGE_EXISTS;
        } else {
            return NO_SUCH_PAGE;
        }
    }
}
}

我称它为:

new PDFPrinter(file);

一切正常,但是在我开始打印后,PDF文件已被Java锁定。怎么了??当我重新启动Java时,它可以再次运行,但是只有一次,然后再次被锁定。

用户5281858

我找到了另一种解决方案...

为了每一个:

public static void printPdf (String filePath, String jobName) throws IOException, PrinterException {

    FileInputStream fileInputStream = new FileInputStream(filePath);
    byte[] pdfContent = new byte[fileInputStream.available()];
    fileInputStream.read(pdfContent, 0, fileInputStream.available());
    ByteBuffer buffer = ByteBuffer.wrap(pdfContent);

    final PDFFile pdfFile1 = new PDFFile(buffer);
    pdf_print_engine pages1 = new pdf_print_engine(pdfFile1);
    PrinterJob pjob = PrinterJob.getPrinterJob();
    PageFormat pfDefault = PrinterJob.getPrinterJob().defaultPage();
    Paper defaultPaper = new Paper();
    defaultPaper.setImageableArea(0, 0, defaultPaper.getWidth(), defaultPaper.getHeight());
    pfDefault.setPaper(defaultPaper);
    pjob.setJobName("Test");
    if (pjob.printDialog()) {
        // validate the page against the chosen printer to correct
        // paper settings and margins
        pfDefault = pjob.validatePage(pfDefault);
        Book book = new Book();

        book.append(pages1, pfDefault, pdfFile1.getNumPages());
        pjob.setPageable(book);

        try {
            pjob.print();
        } catch (PrinterException exc) {
            System.out.println(exc);
        }
    }

玩转守则

提姆

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Java从数据库在Itext Pdf报告上打印印地语文本?

来自分类Dev

iText冲压-Java

来自分类Dev

结合使用iText和Java来避免在打印和合并pdf文件时出现内存泄漏和不必要的内存消耗的最佳实践是什么

来自分类Dev

用Java打印后删除PDF文件

来自分类Dev

从Java代码创建PDF文件[不使用iText]

来自分类Dev

Java Itext中包含多个段落的PDF

来自分类Dev

生成PDF Java spring mvc(不带IText)

来自分类Dev

Java iText中的PDF加密错误

来自分类Dev

验证数字签名pdf java IText

来自分类Dev

使用 iText 锁定 pdf

来自分类Dev

使用jasper report或iText for Java打印页面尺寸(20.5 x 14 cm)的自定义发票

来自分类Dev

使用jasper report或iText for Java打印页面大小(20.5 x 14 cm)的自定义发票

来自分类Dev

仅允许在itext Pdf中打印

来自分类Dev

iText直接打印

来自分类Dev

合并文档以在iText(Java)中创建目录

来自分类Dev

无法在Java itext中删除whiteSpace

来自分类Dev

iText7 Java添加文本问题

来自分类Dev

无法在Java中更改itext图像边框

来自分类Dev

iText 7 java.lang.NoSuchMethodError

来自分类Dev

合并PDF并在Java中使用iText添加书签

来自分类Dev

如何在ITEXT PDF Java中添加用于登录的行?

来自分类Dev

iText Java签名PDF DocumentException:没有足够的空间

来自分类Dev

合并PDF并在Java中使用iText添加书签

来自分类Dev

如何使用itext 5.3.0在PDF文档中显示Java List <>?

来自分类Dev

PDF Java Itext 5.4.3中的无效预告片

来自分类Dev

iText Java无法正确解析PDF /中的文本

来自分类Dev

iText在java中验证pdf的完整性

来自分类Dev

IText 无法使用 Java 读取 PDF 中的空格

来自分类Dev

使用 IText 7 签署 Pdf 时的 Java 堆空间

Related 相关文章

热门标签

归档