- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在扩展 PrintDocumentAdapter 以通过云打印将名册信息发送到打印机。一切都运行良好,直到更改设置以使文档中的页数减少。
例如,一张表格适合两张 A4 页,但需要三张 A5 页。云打印开始时默认选择 A4,并生成预览。如果页面尺寸更改为 A5,则会按预期生成包含三页的新预览。如果随后将页面尺寸更改回 A4,云打印会显示消息“抱歉,这不起作用。请重试。”并且必须退出。
这似乎正在发生:
只有当旧的 PageRange 大于返回的页数时,才会导致错误,但为什么 onWrite() 会使用无效的 PageRange 被调用呢?
我注意到我的设备上的许多应用程序只是缩放输出,以便页数在不同设置之间不会发生变化。他们这样做是因为这个问题吗?
public class PrintAdapter extends PrintDocumentAdapter {
private static final String TAG = "PrintAdapter";
private PrintedPdfBuilder mPrintedPdfBuilder;
private int mPages;
public PrintAdapter(PrintedPdfBuilder printedPdfBuilder) {
mPrintedPdfBuilder = printedPdfBuilder;
}
@Override
public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes,
CancellationSignal cancellationSignal, LayoutResultCallback callback,
Bundle extras) {
Log.v(TAG, "onLayout");
// Respond to cancellation request
if (cancellationSignal.isCanceled()) {
callback.onLayoutCancelled();
return;
}
int pages = mPrintedPdfBuilder.getPageCount(newAttributes);
Log.v(TAG, "page count = " + pages);
if (pages > 0) {
// Return print information to print framework
PrintDocumentInfo info = new PrintDocumentInfo
.Builder("print_output.pdf")
.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(pages)
.build();
// Content layout reflow is complete
callback.onLayoutFinished(info, mPages != pages);
mPages = pages;
} else {
// Otherwise report an error to the print framework
callback.onLayoutFailed("Page count calculation failed.");
}
}
@Override
public void onWrite(PageRange[] ranges, ParcelFileDescriptor destination,
CancellationSignal cancellationSignal, WriteResultCallback callback) {
Log.v(TAG, "onWrite() ranges: " + Arrays.toString(ranges));
// Write PDF document to file
try {
PrintedPdfDocument pdf = mPrintedPdfBuilder.generateDocument(ranges);
// check for cancellation
if (cancellationSignal.isCanceled()) {
callback.onWriteCancelled();
mPrintedPdfBuilder.close();
return;
}
pdf.writeTo(new FileOutputStream(destination.getFileDescriptor()));
} catch (IOException e) {
callback.onWriteFailed(e.toString());
return;
} finally {
mPrintedPdfBuilder.close();
}
PageRange[] writtenPages = mPrintedPdfBuilder.getWrittenPages();
Log.v(TAG, "writtenPages: " + Arrays.toString(writtenPages));
// Signal the print framework the document is complete
callback.onWriteFinished(writtenPages);
}
}
日志猫:
08-28 11:46:44.187 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: onLayout
08-28 11:46:44.276 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: page count = 2
08-28 11:46:44.298 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: onWrite() ranges: [PageRange[0 - 1]]
08-28 11:46:44.512 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: writtenPages: [PageRange[0 - 1]]
08-28 11:46:50.418 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: onLayout
08-28 11:46:50.499 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: page count = 3
08-28 11:46:50.509 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: onWrite() ranges: [PageRange[0 - 1]]
08-28 11:46:50.678 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: writtenPages: [PageRange[0 - 1]]
08-28 11:46:50.918 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: onWrite() ranges: [PageRange[0 - 2]]
08-28 11:46:51.160 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: writtenPages: [PageRange[0 - 2]]
08-28 11:47:34.983 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: onLayout
08-28 11:47:35.049 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: page count = 2
08-28 11:47:35.056 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: onWrite() ranges: [PageRange[0 - 2]]
08-28 11:47:35.248 9714-9714/com.meremammal.www.staffrosterwizard V/PrintAdapter: writtenPages: [PageRange[0 - 1]]
每次设置更改时都会调用 onLayout,但由于某种原因,然后会使用之前的 PageRange[] 调用 onWrite
最佳答案
我捕获了 NullPointerException 错误并向用户显示一条重试消息。这将捕获错误并向用户显示您的消息以及“重试”按钮,该按钮随后会成功,因为 pageRanges 已更新。
@Override
public void onWrite(final PageRange[] pageRanges,
final ParcelFileDescriptor destination,
final CancellationSignal cancellationSignal,
final WriteResultCallback callback) {
// Iterate over each page of the document,
// check if it's in the output range.
int requestedPageCount;
for (int i = 0; i < mTotalPages; i++) {
// Check to see if this page is in the output range.
if (containsPage(pageRanges, i)) {
//########## Add in this Try Catch Block #############
try {
//######################################################
PdfDocument.PageInfo newPage = new PdfDocument.PageInfo.Builder(mPageWidth,
mPageHeight, i).create();
PdfDocument.Page page =
mPDFDocument.startPage(newPage);
if (cancellationSignal.isCanceled()) {
callback.onWriteCancelled();
mPDFDocument.close();
mPDFDocument = null;
return;
}
if (mPrintJobType == PrintType.LIST) {
drawPageList(page, i + 1, (mPageWidth < mPageHeight));
} else {
drawPageDetail(page, i);
}
mPDFDocument.finishPage(page);
//######## Catch the error here and display a message
} catch (NullPointerException e) {
//Catch a known error thrown thrown by pageRanges not being updated in a timely manner.
callback.onWriteFailed("We found a bug in the Android operating system. " +
"Please click Retry to continue.");
return;
}
//##################################################
}
}
// Write PDF document to file
try {
mPDFDocument.writeTo(new FileOutputStream(
destination.getFileDescriptor()));
} catch (IOException e) {
callback.onWriteFailed(e.toString());
return;
} finally {
mPDFDocument.close();
mPDFDocument = null;
}
callback.onWriteFinished(pageRanges);
}
关于android - 使用 PrintDocumentAdapter 和 PrintManager 更改页数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39160122/
有没有像{{NUMBEROFARTICLES}}这样的魔法词对于所有页面? 文章和页面之间似乎存在差异(文章 < 页面),我想显示总页数。 最佳答案 Yes, there is : {{NUMBERO
在我的项目中,我有一个要求,即显示 Word 文档(.doc、.docx)文件中的页数和 Excel 文档(.xls、.xlsx)中的工作表数。我尝试使用 Docx4j 读取 .docx 文件,但性能
我使用正则表达式来计算 pdf 的页数。下面是我使用的代码。 Regex regex = new Regex(@"/Type\s*/Page[^s]"); MatchCollection matche
我的问题如下: 有一些巨大的 PDF 文件(>500MB),我想使用 JAVA 找到它们的页数。如果我使用 itext 或 pdfbox,我必须等到它读取整个文件,并且大多数时候都会失败,因为文件很大
我希望能够在浏览器中输出一个 pdf(这一切都很好而且花花公子)但限制了显示的页数。 IE。读者可以看到他想买的东西的内容是准确的,但同时我也不是免费提供文件的。我可以批量编辑文件以创建新的 3-5
我有一个 WebView 显示一些经常更新的内容。我想在我的 UI 中显示一个页面计数器,它会告诉用户如果要打印它,Web View 会有多少页。 我试过: NSRange r = NSMakeRan
我正在研究 linux 设备驱动程序,发现页数等于帧数。每个页面映射到每个框架。它说只要程序需要内存,它就会分配页面。 但是我发现在操作系统书籍中,虚拟地址分为页面,这些页面被加载到框架中。那么页面数
我想基于模板创建一个新文档,并且需要知道我的插入或附加结果何时会在最终打印输出中生成一个新页面,是否有任何属性/属性(例如可用于此的页数)? 最佳答案 过去我对此进行了大量搜索,但我认为没有任何属性或
不确定这是否可行,但我正在尝试通过纯文本输出将文本保存到具有特殊编码的 RTF。 除了总页数外,我一切正常。 我想让它说“y 的第 x 页”,例如,每页的底部说“第 1 页,共 3 页”,但我找不到总
在 ReportViewer 和导出的 PDF 中查看时显示的页数不同。例如:Report Viewer 的一页显示 50 条记录。但是当导出为 PDF 时,45 条记录出现在第 1 页,其余记录出现
除了我的所有文件都在网络驱动器上之外,这段代码对我有用。在下面的示例中,仅当文件位于根目录 (c:\) 中时代码才有效。 我是否必须将 input.pdf 替换为 d:\hello space fol
我想在访问者访问开始后进入第三页时向他显示一个弹出窗口。 我发现表log_url存储了visitor_id和url_id。我在想是否我们可以计算某个访问者 ID 的 url_id 记录数,这样我就可以
我正在尝试阅读编号。使用 pdf 的给定 pdf 中的页面(通过查找“/Count xx”),但我似乎做错了什么。我将所有字符读入缓冲区并使用字符串类的查找来查找。但是在我尝试过的许多文件中,它只工作
目前我正在使用 itext 阅读 pdf 的页数。这需要很长时间,因为库似乎要扫描整个文件。 页面信息是否位于 pdf 标题的某处,或者是否需要完整的文件扫描? 最佳答案 没错。 iText 在打开时
在我的项目中,我有一项要求显示 Word 文档(.doc、.docx)文件中的页数和 Excel 文档(.xls、.xlsx)中的页数。我曾尝试使用 Docx4j 读取 .docx 文件,但性能很差,
我在获取 phantomjs 中生成的 pdf 页数时遇到问题。基本上我将 phantomjs 与 nodejs 一起使用,我想在第 5 页中显示总页数。 function generatePdf()
我有一个网页,允许用户将文件上传到帐户文件夹。仅限 PDF 和 JPG 文件。我想计算每个上传的 PDF 中的页数,以将其显示给用户。 为此,我使用了 PDFINFO linux 库,它是 XPDF
我做了很多研究(我猜还不够?)并试图找到一个易于使用的库来使用 Node.js 查找 PDF 的页数。该库需要在 Windows 操作系统上可用。 有人知道如何最好地解决这个问题吗?最坏的情况是,我正
我是一名优秀的程序员,十分优秀!