我正在研究使用iText 7.0.4在pdf上应用文本覆盖的要求。 Ovlery可以毫无问题地应用到源pdf上,我可以通过Acrobat文件->打印进行打印,并且可以使用覆盖信息很好地打印pdf。当我尝试使用PDFBox2.0.3 / Java代码打印pdf时,不会打印覆盖文本,但是pdf上的其余文本可以很好地打印。
通过查看pdf,其中包含一种字体,例如Arial MT(嵌入),类型:TrueType,编码:Ansi。我使用Arail作为叠加文字的字体。 通过Java代码打印时,我在日志中看到以下错误
13:27:49.813 [Finalizer]调试o.apache.pdfbox.io.ScratchFileBuffer-ScratchFileBuffer未关闭!
13:28:28.726 [main]调试o.apache.fontbox.ttf.PostScriptTable-没有为ArialMT字体提供PostScript名称信息
当我使用PDF Optimizer将pdf保存为新的pdf文档时,相同的代码将打印pdf包括叠加文本。 我看到除ArialMT字体外,还在属性-> pdf字体中添加了另一种字体ArialMT(嵌入子集)。
时非常有用关于在Java打印过程中为什么缺少文本的任何指针都是有帮助的。
下面是pdf链接和用于打印pdf的代码。
该代码适用于PDFBox 1.8.15,但不适用于2.0.10。
使用PDFBox 1.8.15版本执行“ Printingpdf.java”代码,我看到的日志跟踪为 “ 11:59:08.213 [main] INFO o.a.pdfbox.pdmodel.font.PDType0Font-使用字体SansSerif.plain代替Arial。” 与2.0.10版本执行的相同代码的日志跟踪为 “ 22:50:04.226 [main]调试o.apache.fontbox.ttf.PostScriptTable-没有为字体Calibri提供PostScript名称信息。”
PDF链接https://github.com/ashokvytla/myproject/blob/master/659192_print.pdf
package printing;
import java.awt.print.PrinterJob;
import java.io.File;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.PageRanges;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPageable;
public class Printingpdf {
public static PDDocument _pdfDocument=null;
public static void main(String[] args) {
try {
String printername="defaultprinter";
String templateFillablePDFFile = "printingdocs/659192_print.pdf";
PrinterJob printerjob=PrinterJob.getPrinterJob();
printerjob.setPrintService(PrintServiceLookup.lookupDefaultPrintService());
_pdfDocument = PDDocument.load(new File (templateFillablePDFFile));
//printerjob.setPageable(new PDFPageable(_pdfDocument)); //uncomment this 2.0.10
printerjob.setPageable(new PDPageable(_pdfDocument)); //Comment this for 2.0.10
PrintRequestAttributeSet attributes=new HashPrintRequestAttributeSet();
int pageRangesArr[][]={ {1,2} };
attributes.add(new PageRanges(pageRangesArr));
if(printerjob.printDialog()) {
printerjob.print(attributes);
}
System.out.println("printer name==>"+printername);
_pdfDocument.close();
} catch(Exception e) {e.printStackTrace();
}
}
}