我最近發布了一個問題,如何將 PDF 位元組 [] 轉換為 Postscript。根據評論,這是不可能的。
無論如何,我一直在研究如何將 pdf 轉換為 Postscript 的其他問題。但仍然無法讓它作業。
我已經保存了我的 PDF,如何將現有的 PDF 轉換為 Postscript?有什么方法可以修改下面的代碼以達到結果?
import java.io.File;
import java.io.FileOutputStream;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.SimpleDoc;
import javax.print.StreamPrintService;
import javax.print.StreamPrintServiceFactory;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;
public class Printing {
public static void main(String[] args) {
try {
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
String psMimeType = DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType();
StreamPrintServiceFactory[] factories = StreamPrintServiceFactory.lookupStreamPrintServiceFactories(flavor, psMimeType);
System.out.println ("Available PS services: " factories.length);
System.out.println ("Format: " factories[0].getOutputFormat());
FileOutputStream outStream = new FileOutputStream("/path/to/your.ps");
StreamPrintService printService = factories[0].getPrintService(outStream);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.NA_LETTER);
PDDocument doc = PDDocument.load(new File("/path/to/my.pdf"));
SimpleDoc pdfDoc = new SimpleDoc(new PDFPrintable(doc, Scaling.SCALE_TO_FIT, false), flavor, null);
DocPrintJob newJob = printService.createPrintJob();
newJob.print(pdfDoc, aset);
outStream.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
編輯:我嘗試根據評論進行修改,但是當我嘗試加載檔案 f 時它崩潰了:
public static void MakePS(String pathToPdf) throws PrinterException, IOException, PrintException {
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
DocAttributeSet daset = new HashDocAttributeSet();
StreamPrintServiceFactory[] factories =
StreamPrintServiceFactory.lookupStreamPrintServiceFactories(flavor,
DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType());
if (factories.length == 0) {
throw new PrinterException("No PostScript factories available");
}
File f = new File(pathToPdf);
PDDocument document = null;
try {
document = PDDocument.load(f);
} catch (IOException e) {
System.out.println("Cannot load file to pdf document");
e.printStackTrace();
};
// Attributes are specified by https://docs.oracle.com/javase/7/docs/api/
// see package javax.print.attribute.standard
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.NA_LETTER);
aset.add(new PageRanges(1, document.getNumberOfPages()));
FileOutputStream fos = new FileOutputStream(pathToPdf);
factories[0].getPrintService(fos).createPrintJob().print(
new SimpleDoc(new PDFPrintable(document, Scaling.ACTUAL_SIZE, false), flavor, daset), aset);
fos.close();
document.close();
}
嘗試 PDDocument.load(f) 時出現以下錯誤:
16:37:05,448 ERROR [stderr] (pool-15-thread-1) Exception in thread "pool-15-thread-1" java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument
16:37:05,449 ERROR [stderr] (pool-15-thread-1) at com.app.servlet.PdfToPsFile.MakePS(PdfToPsFile.java:168)
16:37:05,450 ERROR [stderr] (pool-15-thread-1) at com.app.servlet.PrintServlet.lambda$doGet$1(PrintServlet.java:151)
16:37:05,451 ERROR [stderr] (pool-15-thread-1) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
16:37:05,451 ERROR [stderr] (pool-15-thread-1) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
16:37:05,452 ERROR [stderr] (pool-15-thread-1) at java.lang.Thread.run(Thread.java:748)
16:37:05,453 ERROR [stderr] (pool-15-thread-1) Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.pdmodel.PDDocument from [Module ".war:main" from Service Module Loader]
16:37:05,454 ERROR [stderr] (pool-15-thread-1) at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:211)
16:37:05,455 ERROR [stderr] (pool-15-thread-1) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:459)
16:37:05,456 ERROR [stderr] (pool-15-thread-1) at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:408)
16:37:05,457 ERROR [stderr] (pool-15-thread-1) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:389)
16:37:05,457 ERROR [stderr] (pool-15-thread-1) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:134)
′′′
uj5u.com熱心網友回復:
Tilman Hausherr 為我遇到的問題提供了正確答案。到目前為止,我可以使用此代碼生成一頁 PS 檔案。但不會產生額外的頁面。我在這篇文章中說您可以通過 Postscript 命令以某種方式列印,這不會使檔案膨脹。稍后將不得不對此進行調查。首先嘗試解決如何添加附加頁面。這是代碼:
public static void MakePSFile(String pathToPdf) {
try {
DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
String psMimeType = DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType();
StreamPrintServiceFactory[] factories = StreamPrintServiceFactory.lookupStreamPrintServiceFactories(flavor, psMimeType);
System.out.println("Available PS services: " factories.length);
System.out.println("Format: " factories[0].getOutputFormat());
FileOutputStream outStream = new FileOutputStream("c:/psFile.ps");
StreamPrintService printService = factories[0].getPrintService(outStream);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.NA_LETTER);
PDDocument doc = PDDocument.load(new File(pathToPdf));
SimpleDoc pdfDoc = new SimpleDoc(new PDFPrintable(doc, Scaling.SCALE_TO_FIT, false), flavor, null);
DocPrintJob newJob = printService.createPrintJob();
newJob.print(pdfDoc, aset);
outStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477272.html
