嘿大家所以我试图在Android上构建一个小样本打印应用程序,似乎无法打印现有的pdf。有很多关于使用画布创建自定义文档的文档,但我已经有了该文档。基本上我只是想能够读取pdf文档并将其作为文件输出流直接发送到要打印的打印机。任何帮助表示赞赏。
答案 0 :(得分:6)
基本上我只是希望能够阅读pdf文档并将其作为文件输出流直接发送到要打印的打印机。
除非您找到一些为Android提供此类API的特定打印机,否则这种情况并非严格可行。
如果您希望使用Android打印框架,则需要创建一个可以处理现有PDF文件的PrintDocumentAdapter
。 This sample project演示了one such PrintDocumentAdapter
,但它不是通用目的。
答案 1 :(得分:6)
我们可以通过创建自定义PrintDocumentAdapter
PdfDocumentAdapter.java
public class PdfDocumentAdapter extends PrintDocumentAdapter {
Context context = null;
String pathName = "";
public PdfDocumentAdapter(Context ctxt, String pathName) {
context = ctxt;
this.pathName = pathName;
}
@Override
public void onLayout(PrintAttributes printAttributes, PrintAttributes printAttributes1, CancellationSignal cancellationSignal, LayoutResultCallback layoutResultCallback, Bundle bundle) {
if (cancellationSignal.isCanceled()) {
layoutResultCallback.onLayoutCancelled();
}
else {
PrintDocumentInfo.Builder builder=
new PrintDocumentInfo.Builder(" file name");
builder.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
.build();
layoutResultCallback.onLayoutFinished(builder.build(),
!printAttributes1.equals(printAttributes));
}
}
@Override
public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor parcelFileDescriptor, CancellationSignal cancellationSignal, WriteResultCallback writeResultCallback) {
InputStream in=null;
OutputStream out=null;
try {
File file = new File(pathName);
in = new FileInputStream(file);
out=new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
byte[] buf=new byte[16384];
int size;
while ((size=in.read(buf)) >= 0
&& !cancellationSignal.isCanceled()) {
out.write(buf, 0, size);
}
if (cancellationSignal.isCanceled()) {
writeResultCallback.onWriteCancelled();
}
else {
writeResultCallback.onWriteFinished(new PageRange[] { PageRange.ALL_PAGES });
}
}
catch (Exception e) {
writeResultCallback.onWriteFailed(e.getMessage());
Logger.logError( e);
}
finally {
try {
in.close();
out.close();
}
catch (IOException e) {
Logger.logError( e);
}
}
}}
现在使用PrintManager
PrintManager printManager=(PrintManager) SurefoxBrowserScreen.getActivityContext().getSystemService(Context.PRINT_SERVICE);
try
{
PrintDocumentAdapter printAdapter = new PdfDocumentAdapter(Settings.sharedPref.context,filePath );
}
printManager.print("Document", printAdapter,new PrintAttributes.Builder().build());
}
catch (Exception e)
{
Logger.logError(e);
}
答案 2 :(得分:3)
对于那些对Karthik Bollisetti的kotlin版本感兴趣的人就可以了。
PdfDocumentAdapter
被重写为
class PdfDocumentAdapter(private val pathName: String) : PrintDocumentAdapter() {
override fun onLayout(
oldAttributes: PrintAttributes?,
newAttributes: PrintAttributes,
cancellationSignal: CancellationSignal?,
callback: LayoutResultCallback,
bundle: Bundle
) {
if (cancellationSignal?.isCanceled == true) {
callback.onLayoutCancelled()
return
} else {
val builder = PrintDocumentInfo.Builder(" file name")
builder.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(PrintDocumentInfo.PAGE_COUNT_UNKNOWN)
.build()
callback.onLayoutFinished(builder.build(), newAttributes == oldAttributes)
}
}
override fun onWrite(
pageRanges: Array<out PageRange>,
destination: ParcelFileDescriptor,
cancellationSignal: CancellationSignal?,
callback: WriteResultCallback
) {
try {
// copy file from the input stream to the output stream
FileInputStream(File(pathName)).use { inStream ->
FileOutputStream(destination.fileDescriptor).use { outStream ->
inStream.copyTo(outStream)
}
}
if (cancellationSignal?.isCanceled == true) {
callback.onWriteCancelled()
} else {
callback.onWriteFinished(arrayOf(PageRange.ALL_PAGES))
}
} catch (e: Exception) {
callback.onWriteFailed(e.message)
}
}
}
然后像这样在您的代码中调用PrintManager
val printManager : PrintManager = requireContext().getSystemService(Context.PRINT_SERVICE) as PrintManager
try {
val printAdapter = PdfDocumentAdapter(file.absolutePath)
printManager.print("Document", printAdapter, PrintAttributes.Builder().build())
} catch (e : Exception) {
Timber.e(e)
}
答案 3 :(得分:0)
对于支持 ipp 和 pdf 的打印机的用例,您可以使用我的库 https://github.com/gmuth/ipp-client-kotlin 将 pdf 直接发送到打印机:
Page Model
不涉及打印对话框。