Custom font in rdlc gets messed up on special characters - c#

I'm having a strange problem and i cannot figure out, where it is coming from.
We are using MS ReportViewer (tried both 14 and 15) to generate PDF from RDLC. Now I have two custom fonts, both installed on my test system, where the PDFs are generated. Let's call them Hell43 and Hell55 (it's actually Helvetica...[] but as it is giving me hell hat the moment, let's stick with hell[]).
Now Hell43 is HelveticaNeueLt Pro 43 LtEx
and Hell55 is HelveticaNeueLt Pro 55 Roman
The issue is the following: When generating the PDF and opening with Adobe Acrobat everything written in Hell55 gets messed up (no real characters), when there are special characters used in the textbox in the RDLC. You can place two textboxes using Hell55 side by side, the one with special characters will get messed up:
while the same text using Hell43 will work out fine:
No what is strange:
1. This happens only when opening with Adobe Acrobat - Sumatra PDF seems to work. Chrome, Edge, IE only mess up the special characters, not the whole line.
2. When looking at the document properties in Adobe Acrobat it seems, that Hell55 doesn't get embedded into the PDF.
I did read some posts about visibilty-property on certain elements messing up font embedding, but I tried with Hell43 to hide one single element, and look if I could reproduce the behavior for the font - but couldn't.
Further: When looking at the character set, the needed characters should be there (when creating the RDLC in design mode, the characters are displayed correctly). And then when looking at the font properties in windows the two fonts have the same properties, and should be embeddable:
Could maybe the weights cause the problem? I tried setting it from bold to normal, but that didn't solve it.
3. Updating from MS ReportViewer version 14 to 15 didn't solve anything.
Now I am a little short on things to test. Any suggestions? Thanks and thanks and thanks in advance.

Related

Winforms Webbrowser Control and Character Encoding

I am trying to use the Winforms WebBrowser control to display a webpage that can be in many different languages. In one example, I have a HTML file that has characters in Farsi (examples are not limited to this, however - the file can have Mongolian, Japanese, or any other language).
When I try to Navigate() to this file in the WebBrowser control, it displays in a bunch of garbled characters (eg. ÓÇÚÊ). If I display the same file in Firefox, however, it will correctly display with all the the expected characters (eg. ساعت). I can also load the raw HTML file in Notepad++ and it seems to automatically detect the character set/encoding that is being used.
I have read numerous threads that talk about setting the WebBrowser encoding like so:
webBrowser.Document.Encoding = "UTF-8"
however given a set of HTML files, I have no way of telling what language it is written in and therefore no way to know the encoding. I can also confirm there is no "meta" tag within the HTML source that specifies any encoding.
Is there some magic going on behind the scenes of Firefox and Notepad++ to detect the correct character set and if so, how? Can someone tell me how I can get the WebBrowser control to behave in a similar way?
As #Bizan pointed out, in the absence of meta tags to describe the encoding, modern browsers seem to use heuristics to determine the language encoding.
Since the WebBrowser control is based on dated Internet Explorer technology, it appears there is no in-built logic to do these heuristics automatically.
The solutions are:
Implement your own heuristics method and then set the encoding manually.
Use the WebView control (as mentioned by #PanagiotisKanavos) which appears to be use the latest Edge browser. I have tested the pages in Edge and they work correctly. The minimum requirement for WebView is Windows 10 however, which will rule out any use-cases where you need your software to run on earlier versions of Windows.

Printing HTML in A4 and A5 paper format

Apparently a question about Printing HTML in A4 and A5 format is the exact same thing as asking about Printing RTF formatted text, so here's another question with the details a bit more laid out.
I am developing a C# (WinForms) program that should print orders. This program is written for the .NET 2.0 framework. The program has to be able to print in both A4 and A5 paper formats, without any user interferrance (no dialogs). The printed order should look exactly like it does in a webbrowser. You can check out this sample if you like to see what it should look like. As you can see, very basic stuff.
Here's what I have tried so far:
Asking a question on StackOverflow, got closed for being a duplicate. Never found the duplicate.
Print with the WebBrowser element. Cannot print A5, so that was no solution.
Put the HTML in RichTextBox and print that. It worked, but it didnt show the HTML like it's viewed in a webbrowser, which is a requirement. Code can be found here.
I've looked into converting to PDF before printing, but that is either expensive or just impossible to use (for me, as a programmer with little C# experience). These tools usually rely on software being installed on the users' computer (like Acrobat Reader for printing), which I'm trying to avoid.
Viewed about every relevant link in Google for at least 13 pages, no luck. I've been at this for about 2 and a half days now.
If someone has a (free) better way to print formatted HTML like it's viewed in the browser without user interferrence or external dependancies, please share. I really need this to work.
Please don't close this question, believe me when I say I actively searched for a solution or article that describes my problem. Some were relevant, but did not solve the problem that I'm having. I also used the advanced searched on this website, with no luck.
Thank you for taking the time to read this.
Note: When I say I never found the duplicate, I mean I never found the article that literally describes my problem.
You're going to have to bite the bullet and use a PDF library, there is no way you are going to be able to fully control the end printed result from HTML with so many different users, browsers and printers. I did printing to A4 for an internal business application, we had a very limited user base (maybe 5) and all printing to a specific printer, even then it was flaky at best. I don't believe there is a way to distinguish between A4 and A5 without user interference, i.e. they have to select paper size from the print options.
Suggest you take a look at PDF Sharp, Sharp PDF and iTextSharp , they are all OpenSource.
This can all be done from the server, i.e. nothing needs to be installed on the users machine. It should be possible to select the paper size using this (I am not 100% sure), but what the end user prints it on ultimately up to them.
I have done this successfully using the PrintHelper method described here. I used it to enable users in multiple locations to print barcode labels from a CMS system. The labels had strict requirements regarding layout, font size and positioning and all this was managed using HTML and CSS.
The PrinterHelper class works by passing it a webcontrol populated with the print data (I used a repeater to allow multiple labels) & the helper class builds a page in memory and opens the print dialog. You register your CSS like so:
pg.ClientScript.RegisterStartupScript(pg.GetType(),"LabelCSS","<link href=\"Styles/labelPrint.css\" rel=\"stylesheet\" type=\"text/css\" />");
One caveat though, it only worked with Firefox, and some settings had to be changed e.g. margins set to zero, but as the CMS required the use of that browser it wasn't a problem.

TVS RP-45 roll paper printing

I have a receipt made using Crystal Reports where the page is 4 inch wide and the height should be dynamic. I set the height to 2 inches, because I don't know how to make it dynamic. The printer is a TVS RP-45 Justbill printer.
The printer is ejecting paper after printing. How do I stop this from happening?
Any solution besides Crystal Reports would be helpful. The program is written in C# .NET 2.0 Winforms and connects to a SQL Server 2005 database.
Report Header Section
Bill no : 101
______________________________________________
Detail Section
Item Code Qty Amount
[ItemCode] [Qty] [Amount]
______________________________________________
Report Footer Section
Grand Total [GrandTotal]
______________________________________________
The Report Footer Section is using around 2 inches so I set the Height of the paper to 2 inches. This did not solve the problem. The paper height is now 2 times what it should be if there is more than 1 item.
The printer uses roll paper and it should feed more paper proportionally with the number of items sold.
Please help me solve this without wasting paper.
I'm going to suggest something a little different.
Create a new document in Notepad on Windows or a plain text editor on other OS's.
This document (.txt) should just contain one line: TEST_LINE_1
Send that document to your printer and see if the same after print feed continues.
If it continues to feed after the single line of print:
Check settings as follows ( I know you said you've already checked ):
From the manual:
[ http://www.tvs-e.in/pos/pdf/RP-45%20User%20Manual.pdf ]
To set the factory settings of the printer, first press FONT, Line feed and
PRINT buttons together and then switch ON the printer using ON/OFF
switch.
Usually you have to hold those buttons while switching it off and back on - hold until the printer prints its config off.
If you can post back with what the print out says word for word that would be good.
If it doesn't feed after the single line:
Your design is most likely too wide for the format/internal limits of the paper width and it's wrapping around onto a new line for every line you have.
Are you able to post a photo of what is being printed with how much paper it's on-feeding by?
Try printer on a different computer or laptop if possible with single line text file (as above) or with your custom report job - is it the same output?
If the printer is installed as a USB device: Remove all traces of the driver files and completely uninstall it as a printer - reinstall fresh copies and see what happens - the same?
I appreciate some of these things always 'seem obvious' when you're up against a problem but it does help to start over with the most basic of things..
Just remove headers and footers, It will work fine.

Extended printer properties

I'm working with a WinForms app. I have an RDLC report that will be printed on 11x17 and then folded (printer supports folding). I'm rendering to EMF and drawing to pages of a PrintDocument. This works fine except for folding.
What I'd like to do is store the settings that make the printer fold. The users would select a preset from a dropdown and the app would select the printer, the paper size, the tray, whether to duplex, and whether to fold. Storing the PrinterSettings object covers most of this, but doesn't save the folding option.
I first attempted to store/retrieve something I read about called DEVMODE. For reference: http://nicholas.piasecki.name/blog/2008/11/programmatically-selecting-complex-printer-options-in-c-shar/. What I found is that even though I had extra data specific to the driver, all the bytes were 0 regardless of what driver-specific settings I changed. I'm not sure where I went wrong with this, but I abandoned it and looked at the printing capabilities in WPF.
I found that I could configure a PrintTicket for my settings, store it, and retrieve it later. It seems a bit convoluted just to save the settings, but I think I have it working. At least it seems to show up correctly in the PrintDialog. However, I'm now stuck trying to figure out how to print my report.
As I understand it, I can't take a PrintDocument from WinForms printing and use it in WPF. I also read EMF format is not supported in WPF. I thought I would render each EMF to a bitmap, then print those. But the text in my report is fuzzy and I'm not having any luck clearing it up.
Starting with a stream that contains EMF bytes that I know will render sharply with PrintDocument, I test trying to save to a file. It seems no settings that I provide will save with crisp text.
var pageImage = new Metafile(stream);
pageImage.Save(filename);
All this just to add the ability to fold. Am I just completely on the wrong track? I don't see how this should be so hard. I guess I either need to find another way to save/restore custom printer settings or I need a way to render these EMF files better.
I also tried rendering the report directly to BMP format and it's also poor quality.
I tried something slightly different and it worked! I reused my original PrintDocument code and printed to an XPS file. Then I printed the XPS file using my PrintTicket and it works fine.

Display Special Characters (Korean Letters) in RichTextBox

My question might be a little bit confusing, but I think it's still worth of paying some attention.
Basically I'm designing a program to display all printable Unicode characters in a RichTextBox.
I'm using VC# 2010 Express Edition.
However, the RichTextBox has a critical problem: some special characters cannot be displayed correctly.
For example, some Korean Characters (ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒ), can be displayed correctly in Microsoft Word. After I copy to the RichTextBox, the characters cannot be displayed correctly. However, when I copy back to Microsoft Word, it can be displayed correctly.
Therefore, it's a display problem (the characters themselves are correct). I guess it might be a font problem.
Some related property info:
RichTextBox.Font.GdiChaSet
RichTextBox.Font
How can I solve it? So that all printable Unicode characters can be displayed correctly (using different fonts for different CharSets are acceptable).
Actually, I need further assistance about removing all formatting when pasting
rtbxFileContent.Paste(DataFormats.GetFormat(DataFormats.Text)); // DataFormats.UnicodeText
I still need to have all printable characters to be displayed correctly, but without any formatting (except font).
Thanks.
Hope I made myself understood.
I hate sounding like MS Office Clippy, but your questions seems a lot like this one.
Essentially, you're not mad, it is hard. You could try reading/writing the text manually, using UTF8Encoding and BinaryWriter/BinaryReader.
I found the font "Arial Unicode MS" can almost solve my problem, but some characters from Char Sets looks weird to me. (Also, what if the user computer has not installed the font "Arial Unicode MS"?
So I'm still looking for a better universal solution to my question: automatically using different font for different Char Sets in the RichTextBox.
Thanks.

Categories