Apparently the problem was that I used PrintedPdfDocument.writeTo(FileOutputStream()) to do the printing job, which was probably defective and resulted in the above artifact.
I tried another approach to do the printing as described in here: https://stackoverflow.com/a/49298355/13869422
No more problem with this approach!
Here is my final code that works:
@Override
public void onWrite(PageRange[] pageRanges, ParcelFileDescriptor ParcelFileDescriptor, CancellationSignal cancellationSignal, WriteResultCallback writeResultCallback) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = getContentResolver().openInputStream(pdfUri);
outputStream = new FileOutputStream(ParcelFileDescriptor.getFileDescriptor());
byte[] buff = new byte[16384];
int size;
while ((size = inputStream.read(buff)) >= 0
&& !cancellationSignal.isCanceled()) {
outputStream.write(buff, 0, size);
}
if (cancellationSignal.isCanceled()) {
writeResultCallback.onWriteCancelled();
} else {
writeResultCallback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES});
}
} catch (Exception e) {
writeResultCallback.onWriteFailed(e.getMessage());
} finally {
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}